Lines Matching refs:ls
91 static void do_purge(struct dlm_ls *ls, int nodeid, int pid);
205 static inline void dlm_lock_recovery(struct dlm_ls *ls) in dlm_lock_recovery() argument
207 down_read(&ls->ls_in_recovery); in dlm_lock_recovery()
210 void dlm_unlock_recovery(struct dlm_ls *ls) in dlm_unlock_recovery() argument
212 up_read(&ls->ls_in_recovery); in dlm_unlock_recovery()
215 int dlm_lock_recovery_try(struct dlm_ls *ls) in dlm_lock_recovery_try() argument
217 return down_read_trylock(&ls->ls_in_recovery); in dlm_lock_recovery_try()
353 struct dlm_ls *ls = r->res_ls; in put_rsb() local
358 &ls->ls_rsbtbl[bucket].lock); in put_rsb()
360 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in put_rsb()
368 static int pre_rsb_struct(struct dlm_ls *ls) in pre_rsb_struct() argument
373 spin_lock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
374 if (ls->ls_new_rsb_count > dlm_config.ci_new_rsb_count / 2) { in pre_rsb_struct()
375 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
378 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
380 r1 = dlm_allocate_rsb(ls); in pre_rsb_struct()
381 r2 = dlm_allocate_rsb(ls); in pre_rsb_struct()
383 spin_lock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
385 list_add(&r1->res_hashchain, &ls->ls_new_rsb); in pre_rsb_struct()
386 ls->ls_new_rsb_count++; in pre_rsb_struct()
389 list_add(&r2->res_hashchain, &ls->ls_new_rsb); in pre_rsb_struct()
390 ls->ls_new_rsb_count++; in pre_rsb_struct()
392 count = ls->ls_new_rsb_count; in pre_rsb_struct()
393 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
404 static int get_rsb_struct(struct dlm_ls *ls, const void *name, int len, in get_rsb_struct() argument
410 spin_lock(&ls->ls_new_rsb_spin); in get_rsb_struct()
411 if (list_empty(&ls->ls_new_rsb)) { in get_rsb_struct()
412 count = ls->ls_new_rsb_count; in get_rsb_struct()
413 spin_unlock(&ls->ls_new_rsb_spin); in get_rsb_struct()
414 log_debug(ls, "find_rsb retry %d %d %s", in get_rsb_struct()
420 r = list_first_entry(&ls->ls_new_rsb, struct dlm_rsb, res_hashchain); in get_rsb_struct()
424 ls->ls_new_rsb_count--; in get_rsb_struct()
425 spin_unlock(&ls->ls_new_rsb_spin); in get_rsb_struct()
427 r->res_ls = ls; in get_rsb_struct()
550 static int find_rsb_dir(struct dlm_ls *ls, const void *name, int len, in find_rsb_dir() argument
594 error = pre_rsb_struct(ls); in find_rsb_dir()
599 spin_lock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
601 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_dir()
614 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_dir()
628 log_debug(ls, "find_rsb toss from_other %d master %d dir %d %s", in find_rsb_dir()
637 log_error(ls, "find_rsb toss from_dir %d master %d", in find_rsb_dir()
654 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_dir()
655 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
667 error = get_rsb_struct(ls, name, len, &r); in find_rsb_dir()
669 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
682 log_debug(ls, "find_rsb new from_dir %d recreate %s", in find_rsb_dir()
691 log_error(ls, "find_rsb new from_other %d dir %d our %d %s", in find_rsb_dir()
700 log_debug(ls, "find_rsb new from_other %d dir %d %s", in find_rsb_dir()
716 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
718 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
728 static int find_rsb_nodir(struct dlm_ls *ls, const void *name, int len, in find_rsb_nodir() argument
739 error = pre_rsb_struct(ls); in find_rsb_nodir()
743 spin_lock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
745 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_nodir()
758 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_nodir()
771 log_error(ls, "find_rsb toss from_nodeid %d master %d dir %d", in find_rsb_nodir()
782 log_error(ls, "find_rsb toss our %d master %d dir %d", in find_rsb_nodir()
789 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_nodir()
790 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
799 error = get_rsb_struct(ls, name, len, &r); in find_rsb_nodir()
801 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
814 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
816 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
822 static int find_rsb(struct dlm_ls *ls, const void *name, int len, in find_rsb() argument
833 b = hash & (ls->ls_rsbtbl_size - 1); in find_rsb()
835 dir_nodeid = dlm_hash2nodeid(ls, hash); in find_rsb()
837 if (dlm_no_directory(ls)) in find_rsb()
838 return find_rsb_nodir(ls, name, len, hash, b, dir_nodeid, in find_rsb()
841 return find_rsb_dir(ls, name, len, hash, b, dir_nodeid, in find_rsb()
848 static int validate_master_nodeid(struct dlm_ls *ls, struct dlm_rsb *r, in validate_master_nodeid() argument
851 if (dlm_no_directory(ls)) { in validate_master_nodeid()
852 log_error(ls, "find_rsb keep from_nodeid %d master %d dir %d", in validate_master_nodeid()
865 log_debug(ls, "validate master from_other %d master %d " in validate_master_nodeid()
876 log_error(ls, "validate master from_dir %d master %d " in validate_master_nodeid()
888 static void __dlm_master_lookup(struct dlm_ls *ls, struct dlm_rsb *r, int our_nodeid, in __dlm_master_lookup() argument
897 log_error(ls, "%s res_dir %d our %d %s", __func__, in __dlm_master_lookup()
902 if (fix_master && dlm_is_removed(ls, r->res_master_nodeid)) { in __dlm_master_lookup()
915 log_error(ls, "%s fix_master on toss", __func__); in __dlm_master_lookup()
926 log_limit(ls, "%s from_master %d master_nodeid %d res_nodeid %d first %x %s", in __dlm_master_lookup()
931 log_error(ls, "from_master %d our_master", from_nodeid); in __dlm_master_lookup()
946 log_debug(ls, "%s master 0 to %d first %x %s", __func__, in __dlm_master_lookup()
959 log_limit(ls, "%s from master %d flags %x first %x %s", in __dlm_master_lookup()
999 int dlm_master_lookup(struct dlm_ls *ls, int from_nodeid, char *name, int len, in dlm_master_lookup() argument
1011 log_error(ls, "dlm_master_lookup from our_nodeid %d flags %x", in dlm_master_lookup()
1017 b = hash & (ls->ls_rsbtbl_size - 1); in dlm_master_lookup()
1019 dir_nodeid = dlm_hash2nodeid(ls, hash); in dlm_master_lookup()
1021 log_error(ls, "dlm_master_lookup from %d dir %d our %d h %x %d", in dlm_master_lookup()
1023 ls->ls_num_nodes); in dlm_master_lookup()
1029 error = pre_rsb_struct(ls); in dlm_master_lookup()
1033 spin_lock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1034 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_master_lookup()
1041 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1044 __dlm_master_lookup(ls, r, our_nodeid, from_nodeid, false, in dlm_master_lookup()
1054 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_master_lookup()
1062 __dlm_master_lookup(ls, r, our_nodeid, from_nodeid, true, flags, in dlm_master_lookup()
1067 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1072 error = get_rsb_struct(ls, name, len, &r); in dlm_master_lookup()
1074 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1088 error = rsb_insert(r, &ls->ls_rsbtbl[b].toss); in dlm_master_lookup()
1092 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1100 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1104 static void dlm_dump_rsb_hash(struct dlm_ls *ls, uint32_t hash) in dlm_dump_rsb_hash() argument
1110 for (i = 0; i < ls->ls_rsbtbl_size; i++) { in dlm_dump_rsb_hash()
1111 spin_lock(&ls->ls_rsbtbl[i].lock); in dlm_dump_rsb_hash()
1112 for (n = rb_first(&ls->ls_rsbtbl[i].keep); n; n = rb_next(n)) { in dlm_dump_rsb_hash()
1117 spin_unlock(&ls->ls_rsbtbl[i].lock); in dlm_dump_rsb_hash()
1121 void dlm_dump_rsb_name(struct dlm_ls *ls, char *name, int len) in dlm_dump_rsb_name() argument
1128 b = hash & (ls->ls_rsbtbl_size - 1); in dlm_dump_rsb_name()
1130 spin_lock(&ls->ls_rsbtbl[b].lock); in dlm_dump_rsb_name()
1131 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_dump_rsb_name()
1135 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_dump_rsb_name()
1141 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_dump_rsb_name()
1147 struct dlm_ls *ls = r->res_ls; in toss_rsb() local
1151 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[r->res_bucket].keep); in toss_rsb()
1152 rsb_insert(r, &ls->ls_rsbtbl[r->res_bucket].toss); in toss_rsb()
1154 ls->ls_rsbtbl[r->res_bucket].flags |= DLM_RTF_SHRINK; in toss_rsb()
1202 static int _create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret, in _create_lkb() argument
1208 lkb = dlm_allocate_lkb(ls); in _create_lkb()
1225 spin_lock(&ls->ls_lkbidr_spin); in _create_lkb()
1226 rv = idr_alloc(&ls->ls_lkbidr, lkb, start, end, GFP_NOWAIT); in _create_lkb()
1229 spin_unlock(&ls->ls_lkbidr_spin); in _create_lkb()
1233 log_error(ls, "create_lkb idr error %d", rv); in _create_lkb()
1242 static int create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret) in create_lkb() argument
1244 return _create_lkb(ls, lkb_ret, 1, 0); in create_lkb()
1247 static int find_lkb(struct dlm_ls *ls, uint32_t lkid, struct dlm_lkb **lkb_ret) in find_lkb() argument
1251 spin_lock(&ls->ls_lkbidr_spin); in find_lkb()
1252 lkb = idr_find(&ls->ls_lkbidr, lkid); in find_lkb()
1255 spin_unlock(&ls->ls_lkbidr_spin); in find_lkb()
1274 static int __put_lkb(struct dlm_ls *ls, struct dlm_lkb *lkb) in __put_lkb() argument
1280 &ls->ls_lkbidr_spin); in __put_lkb()
1282 idr_remove(&ls->ls_lkbidr, lkid); in __put_lkb()
1283 spin_unlock(&ls->ls_lkbidr_spin); in __put_lkb()
1298 struct dlm_ls *ls; in dlm_put_lkb() local
1303 ls = lkb->lkb_resource->res_ls; in dlm_put_lkb()
1304 return __put_lkb(ls, lkb); in dlm_put_lkb()
1421 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_to_waiters() local
1424 mutex_lock(&ls->ls_waiters_mutex); in add_to_waiters()
1447 log_debug(ls, "addwait %x cur %d overlap %d count %d f %x", in add_to_waiters()
1461 list_add(&lkb->lkb_wait_reply, &ls->ls_waiters); in add_to_waiters()
1464 log_error(ls, "addwait error %x %d flags %x %d %d %s", in add_to_waiters()
1467 mutex_unlock(&ls->ls_waiters_mutex); in add_to_waiters()
1479 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in _remove_from_waiters() local
1483 log_debug(ls, "remwait %x unlock_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1490 log_debug(ls, "remwait %x cancel_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1501 log_debug(ls, "remwait %x cancel_reply wait_type %d", in _remove_from_waiters()
1517 log_debug(ls, "remwait %x convert_reply zap overlap_cancel", in _remove_from_waiters()
1534 log_error(ls, "remwait error %x remote %d %x msg %d flags %x no wait", in _remove_from_waiters()
1546 log_error(ls, "remwait error %x reply %d wait_type %d overlap", in _remove_from_waiters()
1565 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters() local
1568 mutex_lock(&ls->ls_waiters_mutex); in remove_from_waiters()
1570 mutex_unlock(&ls->ls_waiters_mutex); in remove_from_waiters()
1579 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters_ms() local
1583 mutex_lock(&ls->ls_waiters_mutex); in remove_from_waiters_ms()
1586 mutex_unlock(&ls->ls_waiters_mutex); in remove_from_waiters_ms()
1594 #define DLM_WAIT_PENDING_COND(ls, r) \ argument
1595 (ls->ls_remove_len && \
1596 !rsb_cmp(r, ls->ls_remove_name, \
1597 ls->ls_remove_len))
1601 struct dlm_ls *ls = r->res_ls; in wait_pending_remove() local
1603 spin_lock(&ls->ls_remove_spin); in wait_pending_remove()
1604 if (DLM_WAIT_PENDING_COND(ls, r)) { in wait_pending_remove()
1605 log_debug(ls, "delay lookup for remove dir %d %s", in wait_pending_remove()
1607 spin_unlock(&ls->ls_remove_spin); in wait_pending_remove()
1608 wait_event(ls->ls_remove_wait, !DLM_WAIT_PENDING_COND(ls, r)); in wait_pending_remove()
1611 spin_unlock(&ls->ls_remove_spin); in wait_pending_remove()
1621 static void shrink_bucket(struct dlm_ls *ls, int b) in shrink_bucket() argument
1631 memset(&ls->ls_remove_lens, 0, sizeof(int) * DLM_REMOVE_NAMES_MAX); in shrink_bucket()
1633 spin_lock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1635 if (!(ls->ls_rsbtbl[b].flags & DLM_RTF_SHRINK)) { in shrink_bucket()
1636 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1640 for (n = rb_first(&ls->ls_rsbtbl[b].toss); n; n = next) { in shrink_bucket()
1649 if (!dlm_no_directory(ls) && in shrink_bucket()
1662 if (!dlm_no_directory(ls) && in shrink_bucket()
1670 ls->ls_remove_lens[remote_count] = r->res_length; in shrink_bucket()
1671 memcpy(ls->ls_remove_names[remote_count], r->res_name, in shrink_bucket()
1681 log_error(ls, "tossed rsb in use %s", r->res_name); in shrink_bucket()
1685 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1690 ls->ls_rsbtbl[b].flags |= DLM_RTF_SHRINK; in shrink_bucket()
1692 ls->ls_rsbtbl[b].flags &= ~DLM_RTF_SHRINK; in shrink_bucket()
1693 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1710 name = ls->ls_remove_names[i]; in shrink_bucket()
1711 len = ls->ls_remove_lens[i]; in shrink_bucket()
1713 spin_lock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1714 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in shrink_bucket()
1716 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1717 log_debug(ls, "remove_name not toss %s", name); in shrink_bucket()
1722 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1723 log_debug(ls, "remove_name master %d dir %d our %d %s", in shrink_bucket()
1731 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1732 log_error(ls, "remove_name dir %d master %d our %d %s", in shrink_bucket()
1740 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1741 log_debug(ls, "remove_name toss_time %lu now %lu %s", in shrink_bucket()
1747 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1748 log_error(ls, "remove_name in use %s", name); in shrink_bucket()
1752 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1755 spin_lock(&ls->ls_remove_spin); in shrink_bucket()
1756 ls->ls_remove_len = len; in shrink_bucket()
1757 memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN); in shrink_bucket()
1758 spin_unlock(&ls->ls_remove_spin); in shrink_bucket()
1759 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1764 spin_lock(&ls->ls_remove_spin); in shrink_bucket()
1765 ls->ls_remove_len = 0; in shrink_bucket()
1766 memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN); in shrink_bucket()
1767 spin_unlock(&ls->ls_remove_spin); in shrink_bucket()
1768 wake_up(&ls->ls_remove_wait); in shrink_bucket()
1774 void dlm_scan_rsbs(struct dlm_ls *ls) in dlm_scan_rsbs() argument
1778 for (i = 0; i < ls->ls_rsbtbl_size; i++) { in dlm_scan_rsbs()
1779 shrink_bucket(ls, i); in dlm_scan_rsbs()
1780 if (dlm_locking_stopped(ls)) in dlm_scan_rsbs()
1789 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_timeout() local
1794 if (test_bit(LSFL_TIMEWARN, &ls->ls_flags) && in add_timeout()
1805 mutex_lock(&ls->ls_timeout_mutex); in add_timeout()
1807 list_add_tail(&lkb->lkb_time_list, &ls->ls_timeout); in add_timeout()
1808 mutex_unlock(&ls->ls_timeout_mutex); in add_timeout()
1813 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in del_timeout() local
1815 mutex_lock(&ls->ls_timeout_mutex); in del_timeout()
1820 mutex_unlock(&ls->ls_timeout_mutex); in del_timeout()
1829 void dlm_scan_timeout(struct dlm_ls *ls) in dlm_scan_timeout() argument
1837 if (dlm_locking_stopped(ls)) in dlm_scan_timeout()
1842 mutex_lock(&ls->ls_timeout_mutex); in dlm_scan_timeout()
1843 list_for_each_entry(iter, &ls->ls_timeout, lkb_time_list) { in dlm_scan_timeout()
1862 mutex_unlock(&ls->ls_timeout_mutex); in dlm_scan_timeout()
1880 log_debug(ls, "timeout cancel %x node %d %s", in dlm_scan_timeout()
1897 void dlm_adjust_timeouts(struct dlm_ls *ls) in dlm_adjust_timeouts() argument
1900 u64 adj_us = jiffies_to_usecs(jiffies - ls->ls_recover_begin); in dlm_adjust_timeouts()
1902 ls->ls_recover_begin = 0; in dlm_adjust_timeouts()
1903 mutex_lock(&ls->ls_timeout_mutex); in dlm_adjust_timeouts()
1904 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) in dlm_adjust_timeouts()
1906 mutex_unlock(&ls->ls_timeout_mutex); in dlm_adjust_timeouts()
2866 static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in validate_lock_args() argument
2911 log_error(ls, "%s %d %x %x %x %d %d %s", __func__, in validate_lock_args()
2917 log_debug(ls, "%s %d %x %x %x %d %d %s", __func__, in validate_lock_args()
2936 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in validate_unlock_args() local
2949 log_debug(ls, "unlock on rsb_lookup %x", lkb->lkb_id); in validate_unlock_args()
2962 log_error(ls, "unlock on MSTCPY %x", lkb->lkb_id); in validate_unlock_args()
2973 log_debug(ls, "unlock on ENDOFLIFE %x", lkb->lkb_id); in validate_unlock_args()
3062 log_error(ls, "%s %d %x %x %x %x %d %s", __func__, rv, in validate_unlock_args()
3068 log_debug(ls, "%s %d %x %x %x %x %d %s", __func__, rv, in validate_unlock_args()
3325 static int request_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in request_lock() argument
3332 error = validate_lock_args(ls, lkb, args); in request_lock()
3336 error = find_rsb(ls, name, len, 0, R_REQUEST, &r); in request_lock()
3352 static int convert_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in convert_lock() argument
3363 error = validate_lock_args(ls, lkb, args); in convert_lock()
3374 static int unlock_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in unlock_lock() argument
3396 static int cancel_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in cancel_lock() argument
3433 struct dlm_ls *ls; in dlm_lock() local
3438 ls = dlm_find_lockspace_local(lockspace); in dlm_lock()
3439 if (!ls) in dlm_lock()
3442 dlm_lock_recovery(ls); in dlm_lock()
3445 error = find_lkb(ls, lksb->sb_lkid, &lkb); in dlm_lock()
3447 error = create_lkb(ls, &lkb); in dlm_lock()
3452 trace_dlm_lock_start(ls, lkb, name, namelen, mode, flags); in dlm_lock()
3465 error = convert_lock(ls, lkb, &args); in dlm_lock()
3467 error = request_lock(ls, lkb, name, namelen, &args); in dlm_lock()
3472 trace_dlm_lock_end(ls, lkb, name, namelen, mode, flags, error, true); in dlm_lock()
3475 __put_lkb(ls, lkb); in dlm_lock()
3479 dlm_unlock_recovery(ls); in dlm_lock()
3480 dlm_put_lockspace(ls); in dlm_lock()
3490 struct dlm_ls *ls; in dlm_unlock() local
3495 ls = dlm_find_lockspace_local(lockspace); in dlm_unlock()
3496 if (!ls) in dlm_unlock()
3499 dlm_lock_recovery(ls); in dlm_unlock()
3501 error = find_lkb(ls, lkid, &lkb); in dlm_unlock()
3505 trace_dlm_unlock_start(ls, lkb, flags); in dlm_unlock()
3512 error = cancel_lock(ls, lkb, &args); in dlm_unlock()
3514 error = unlock_lock(ls, lkb, &args); in dlm_unlock()
3521 trace_dlm_unlock_end(ls, lkb, flags, error); in dlm_unlock()
3525 dlm_unlock_recovery(ls); in dlm_unlock()
3526 dlm_put_lockspace(ls); in dlm_unlock()
3552 static int _create_message(struct dlm_ls *ls, int mb_len, in _create_message() argument
3572 ms->m_header.u.h_lockspace = cpu_to_le32(ls->ls_global_id); in _create_message()
3861 static int send_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms_in, in send_lookup_reply() argument
3864 struct dlm_rsb *r = &ls->ls_stub_rsb; in send_lookup_reply()
3910 static int receive_lvb(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_lvb() argument
3917 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_lvb()
3921 if (len > ls->ls_lvblen) in receive_lvb()
3922 len = ls->ls_lvblen; in receive_lvb()
3938 static int receive_request_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_request_args() argument
3952 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_request_args()
3960 static int receive_convert_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_convert_args() argument
3966 if (receive_lvb(ls, lkb, ms)) in receive_convert_args()
3975 static int receive_unlock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_unlock_args() argument
3978 if (receive_lvb(ls, lkb, ms)) in receive_unlock_args()
3986 static void setup_stub_lkb(struct dlm_ls *ls, struct dlm_message *ms) in setup_stub_lkb() argument
3988 struct dlm_lkb *lkb = &ls->ls_stub_lkb; in setup_stub_lkb()
4047 static void send_repeat_remove(struct dlm_ls *ls, char *ms_name, int len) in send_repeat_remove() argument
4060 b = hash & (ls->ls_rsbtbl_size - 1); in send_repeat_remove()
4062 dir_nodeid = dlm_hash2nodeid(ls, hash); in send_repeat_remove()
4064 log_error(ls, "send_repeat_remove dir %d %s", dir_nodeid, name); in send_repeat_remove()
4066 spin_lock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4067 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in send_repeat_remove()
4069 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4070 log_error(ls, "repeat_remove on keep %s", name); in send_repeat_remove()
4074 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in send_repeat_remove()
4076 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4077 log_error(ls, "repeat_remove on toss %s", name); in send_repeat_remove()
4083 spin_lock(&ls->ls_remove_spin); in send_repeat_remove()
4084 ls->ls_remove_len = len; in send_repeat_remove()
4085 memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN); in send_repeat_remove()
4086 spin_unlock(&ls->ls_remove_spin); in send_repeat_remove()
4087 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4089 rv = _create_message(ls, sizeof(struct dlm_message) + len, in send_repeat_remove()
4100 spin_lock(&ls->ls_remove_spin); in send_repeat_remove()
4101 ls->ls_remove_len = 0; in send_repeat_remove()
4102 memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN); in send_repeat_remove()
4103 spin_unlock(&ls->ls_remove_spin); in send_repeat_remove()
4104 wake_up(&ls->ls_remove_wait); in send_repeat_remove()
4107 static int receive_request(struct dlm_ls *ls, struct dlm_message *ms) in receive_request() argument
4116 error = create_lkb(ls, &lkb); in receive_request()
4122 error = receive_request_args(ls, lkb, ms); in receive_request()
4124 __put_lkb(ls, lkb); in receive_request()
4136 error = find_rsb(ls, ms->m_extra, namelen, from_nodeid, in receive_request()
4139 __put_lkb(ls, lkb); in receive_request()
4146 error = validate_master_nodeid(ls, r, from_nodeid); in receive_request()
4150 __put_lkb(ls, lkb); in receive_request()
4186 log_limit(ls, "receive_request %x from %d %d", in receive_request()
4191 send_repeat_remove(ls, ms->m_extra, namelen); in receive_request()
4195 setup_stub_lkb(ls, ms); in receive_request()
4196 send_request_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_request()
4200 static int receive_convert(struct dlm_ls *ls, struct dlm_message *ms) in receive_convert() argument
4206 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_convert()
4211 log_error(ls, "receive_convert %x remid %x recover_seq %llu " in receive_convert()
4232 error = receive_convert_args(ls, lkb, ms); in receive_convert()
4251 setup_stub_lkb(ls, ms); in receive_convert()
4252 send_convert_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_convert()
4256 static int receive_unlock(struct dlm_ls *ls, struct dlm_message *ms) in receive_unlock() argument
4262 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_unlock()
4267 log_error(ls, "receive_unlock %x remid %x remote %d %x", in receive_unlock()
4287 error = receive_unlock_args(ls, lkb, ms); in receive_unlock()
4303 setup_stub_lkb(ls, ms); in receive_unlock()
4304 send_unlock_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_unlock()
4308 static int receive_cancel(struct dlm_ls *ls, struct dlm_message *ms) in receive_cancel() argument
4314 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_cancel()
4339 setup_stub_lkb(ls, ms); in receive_cancel()
4340 send_cancel_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_cancel()
4344 static int receive_grant(struct dlm_ls *ls, struct dlm_message *ms) in receive_grant() argument
4350 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_grant()
4375 static int receive_bast(struct dlm_ls *ls, struct dlm_message *ms) in receive_bast() argument
4381 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_bast()
4403 static void receive_lookup(struct dlm_ls *ls, struct dlm_message *ms) in receive_lookup() argument
4412 error = dlm_master_lookup(ls, from_nodeid, ms->m_extra, len, 0, in receive_lookup()
4417 receive_request(ls, ms); in receive_lookup()
4420 send_lookup_reply(ls, ms, ret_nodeid, error); in receive_lookup()
4423 static void receive_remove(struct dlm_ls *ls, struct dlm_message *ms) in receive_remove() argument
4435 log_error(ls, "receive_remove from %d bad len %d", in receive_remove()
4440 dir_nodeid = dlm_hash2nodeid(ls, le32_to_cpu(ms->m_hash)); in receive_remove()
4442 log_error(ls, "receive_remove from %d bad nodeid %d", in receive_remove()
4460 b = hash & (ls->ls_rsbtbl_size - 1); in receive_remove()
4462 spin_lock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4464 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in receive_remove()
4467 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in receive_remove()
4470 log_error(ls, "receive_remove from %d not found %s", in receive_remove()
4472 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4477 log_error(ls, "receive_remove keep from %d master %d", in receive_remove()
4480 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4484 log_debug(ls, "receive_remove from %d master %d first %x %s", in receive_remove()
4487 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4492 log_error(ls, "receive_remove toss from %d master %d", in receive_remove()
4495 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4500 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in receive_remove()
4501 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4504 log_error(ls, "receive_remove from %d rsb ref error", in receive_remove()
4507 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4511 static void receive_purge(struct dlm_ls *ls, struct dlm_message *ms) in receive_purge() argument
4513 do_purge(ls, le32_to_cpu(ms->m_nodeid), le32_to_cpu(ms->m_pid)); in receive_purge()
4516 static int receive_request_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_request_reply() argument
4523 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_request_reply()
4538 log_error(ls, "receive_request_reply %x remote %d %x result %d", in receive_request_reply()
4584 log_limit(ls, "receive_request_reply %x from %d %d " in receive_request_reply()
4611 log_error(ls, "receive_request_reply %x error %d", in receive_request_reply()
4616 log_debug(ls, "receive_request_reply %x result %d unlock", in receive_request_reply()
4622 log_debug(ls, "receive_request_reply %x cancel", lkb->lkb_id); in receive_request_reply()
4705 static int receive_convert_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_convert_reply() argument
4710 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_convert_reply()
4755 static int receive_unlock_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_unlock_reply() argument
4760 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_unlock_reply()
4806 static int receive_cancel_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_cancel_reply() argument
4811 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_cancel_reply()
4820 static void receive_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_lookup_reply() argument
4827 error = find_lkb(ls, le32_to_cpu(ms->m_lkid), &lkb); in receive_lookup_reply()
4829 log_error(ls, "%s no lkid %x", __func__, in receive_lookup_reply()
4855 log_error(ls, "receive_lookup_reply %x from %d ret %d " in receive_lookup_reply()
4869 log_error(ls, "receive_lookup_reply %x from %d bad ret_nodeid", in receive_lookup_reply()
4881 log_debug(ls, "receive_lookup_reply %x unlock %x", in receive_lookup_reply()
4899 static void _receive_message(struct dlm_ls *ls, struct dlm_message *ms, in _receive_message() argument
4904 if (!dlm_is_member(ls, le32_to_cpu(ms->m_header.h_nodeid))) { in _receive_message()
4905 log_limit(ls, "receive %d from non-member %d %x %x %d", in _receive_message()
4918 error = receive_request(ls, ms); in _receive_message()
4922 error = receive_convert(ls, ms); in _receive_message()
4926 error = receive_unlock(ls, ms); in _receive_message()
4931 error = receive_cancel(ls, ms); in _receive_message()
4937 error = receive_request_reply(ls, ms); in _receive_message()
4941 error = receive_convert_reply(ls, ms); in _receive_message()
4945 error = receive_unlock_reply(ls, ms); in _receive_message()
4949 error = receive_cancel_reply(ls, ms); in _receive_message()
4956 error = receive_grant(ls, ms); in _receive_message()
4961 error = receive_bast(ls, ms); in _receive_message()
4967 receive_lookup(ls, ms); in _receive_message()
4971 receive_remove(ls, ms); in _receive_message()
4977 receive_lookup_reply(ls, ms); in _receive_message()
4983 receive_purge(ls, ms); in _receive_message()
4987 log_error(ls, "unknown message type %d", in _receive_message()
5003 log_debug(ls, "receive %d no %x remote %d %x saved_seq %u", in _receive_message()
5008 log_error(ls, "receive %d no %x remote %d %x saved_seq %u", in _receive_message()
5014 dlm_dump_rsb_hash(ls, le32_to_cpu(ms->m_hash)); in _receive_message()
5018 log_error(ls, "receive %d inval from %d lkid %x remid %x " in _receive_message()
5035 static void dlm_receive_message(struct dlm_ls *ls, struct dlm_message *ms, in dlm_receive_message() argument
5038 if (dlm_locking_stopped(ls)) { in dlm_receive_message()
5042 if (!ls->ls_generation) { in dlm_receive_message()
5043 log_limit(ls, "receive %d from %d ignore old gen", in dlm_receive_message()
5048 dlm_add_requestqueue(ls, nodeid, ms); in dlm_receive_message()
5050 dlm_wait_requestqueue(ls); in dlm_receive_message()
5051 _receive_message(ls, ms, 0); in dlm_receive_message()
5058 void dlm_receive_message_saved(struct dlm_ls *ls, struct dlm_message *ms, in dlm_receive_message_saved() argument
5061 _receive_message(ls, ms, saved_seq); in dlm_receive_message_saved()
5072 struct dlm_ls *ls; in dlm_receive_buffer() local
5094 ls = dlm_find_lockspace_global(le32_to_cpu(hd->u.h_lockspace)); in dlm_receive_buffer()
5095 if (!ls) { in dlm_receive_buffer()
5111 down_read(&ls->ls_recv_active); in dlm_receive_buffer()
5113 dlm_receive_message(ls, &p->message, nodeid); in dlm_receive_buffer()
5115 dlm_receive_rcom(ls, &p->rcom, nodeid); in dlm_receive_buffer()
5117 log_error(ls, "invalid h_cmd %d from %d lockspace %x", in dlm_receive_buffer()
5119 up_read(&ls->ls_recv_active); in dlm_receive_buffer()
5121 dlm_put_lockspace(ls); in dlm_receive_buffer()
5124 static void recover_convert_waiter(struct dlm_ls *ls, struct dlm_lkb *lkb, in recover_convert_waiter() argument
5152 static int waiter_needs_recovery(struct dlm_ls *ls, struct dlm_lkb *lkb, in waiter_needs_recovery() argument
5155 if (dlm_no_directory(ls)) in waiter_needs_recovery()
5158 if (dlm_is_removed(ls, lkb->lkb_wait_nodeid)) in waiter_needs_recovery()
5170 void dlm_recover_waiters_pre(struct dlm_ls *ls) in dlm_recover_waiters_pre() argument
5181 mutex_lock(&ls->ls_waiters_mutex); in dlm_recover_waiters_pre()
5183 list_for_each_entry_safe(lkb, safe, &ls->ls_waiters, lkb_wait_reply) { in dlm_recover_waiters_pre()
5191 log_debug(ls, "waiter %x remote %x msg %d r_nodeid %d " in dlm_recover_waiters_pre()
5210 if (!waiter_needs_recovery(ls, lkb, dir_nodeid)) in dlm_recover_waiters_pre()
5234 log_debug(ls, "rwpre overlap %x %x %d %d %d", in dlm_recover_waiters_pre()
5246 recover_convert_waiter(ls, lkb, ms_stub); in dlm_recover_waiters_pre()
5272 log_error(ls, "invalid lkb wait_type %d %d", in dlm_recover_waiters_pre()
5277 mutex_unlock(&ls->ls_waiters_mutex); in dlm_recover_waiters_pre()
5281 static struct dlm_lkb *find_resend_waiter(struct dlm_ls *ls) in find_resend_waiter() argument
5285 mutex_lock(&ls->ls_waiters_mutex); in find_resend_waiter()
5286 list_for_each_entry(iter, &ls->ls_waiters, lkb_wait_reply) { in find_resend_waiter()
5293 mutex_unlock(&ls->ls_waiters_mutex); in find_resend_waiter()
5314 int dlm_recover_waiters_post(struct dlm_ls *ls) in dlm_recover_waiters_post() argument
5321 if (dlm_locking_stopped(ls)) { in dlm_recover_waiters_post()
5322 log_debug(ls, "recover_waiters_post aborted"); in dlm_recover_waiters_post()
5327 lkb = find_resend_waiter(ls); in dlm_recover_waiters_post()
5340 log_debug(ls, "waiter %x remote %x msg %d r_nodeid %d " in dlm_recover_waiters_post()
5361 mutex_lock(&ls->ls_waiters_mutex); in dlm_recover_waiters_post()
5363 mutex_unlock(&ls->ls_waiters_mutex); in dlm_recover_waiters_post()
5402 log_error(ls, "waiter %x msg %d r_nodeid %d " in dlm_recover_waiters_post()
5415 static void purge_mstcpy_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_mstcpy_list() argument
5427 if (lkb->lkb_recover_seq == ls->ls_recover_seq) in purge_mstcpy_list()
5434 log_error(ls, "purged mstcpy lkb not released"); in purge_mstcpy_list()
5440 struct dlm_ls *ls = r->res_ls; in dlm_purge_mstcpy_locks() local
5442 purge_mstcpy_list(ls, r, &r->res_grantqueue); in dlm_purge_mstcpy_locks()
5443 purge_mstcpy_list(ls, r, &r->res_convertqueue); in dlm_purge_mstcpy_locks()
5444 purge_mstcpy_list(ls, r, &r->res_waitqueue); in dlm_purge_mstcpy_locks()
5447 static void purge_dead_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_dead_list() argument
5458 dlm_is_removed(ls, lkb->lkb_nodeid)) { in purge_dead_list()
5471 log_error(ls, "purged dead lkb not released"); in purge_dead_list()
5482 void dlm_recover_purge(struct dlm_ls *ls) in dlm_recover_purge() argument
5493 list_for_each_entry(memb, &ls->ls_nodes_gone, list) { in dlm_recover_purge()
5501 down_write(&ls->ls_root_sem); in dlm_recover_purge()
5502 list_for_each_entry(r, &ls->ls_root_list, res_root_list) { in dlm_recover_purge()
5506 purge_dead_list(ls, r, &r->res_grantqueue, in dlm_recover_purge()
5508 purge_dead_list(ls, r, &r->res_convertqueue, in dlm_recover_purge()
5510 purge_dead_list(ls, r, &r->res_waitqueue, in dlm_recover_purge()
5517 up_write(&ls->ls_root_sem); in dlm_recover_purge()
5520 log_rinfo(ls, "dlm_recover_purge %u locks for %u nodes", in dlm_recover_purge()
5524 static struct dlm_rsb *find_grant_rsb(struct dlm_ls *ls, int bucket) in find_grant_rsb() argument
5529 spin_lock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5530 for (n = rb_first(&ls->ls_rsbtbl[bucket].keep); n; n = rb_next(n)) { in find_grant_rsb()
5540 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5543 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5564 void dlm_recover_grant(struct dlm_ls *ls) in dlm_recover_grant() argument
5573 r = find_grant_rsb(ls, bucket); in dlm_recover_grant()
5575 if (bucket == ls->ls_rsbtbl_size - 1) in dlm_recover_grant()
5594 log_rinfo(ls, "dlm_recover_grant %u locks on %u resources", in dlm_recover_grant()
5628 static int receive_rcom_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_rcom_lock_args() argument
5650 if (lvblen > ls->ls_lvblen) in receive_rcom_lock_args()
5652 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_rcom_lock_args()
5679 int dlm_recover_master_copy(struct dlm_ls *ls, struct dlm_rcom *rc) in dlm_recover_master_copy() argument
5703 error = find_rsb(ls, rl->rl_name, le16_to_cpu(rl->rl_namelen), in dlm_recover_master_copy()
5710 if (dlm_no_directory(ls) && (dlm_dir_nodeid(r) != dlm_our_nodeid())) { in dlm_recover_master_copy()
5711 log_error(ls, "dlm_recover_master_copy remote %d %x not dir", in dlm_recover_master_copy()
5723 error = create_lkb(ls, &lkb); in dlm_recover_master_copy()
5727 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5729 __put_lkb(ls, lkb); in dlm_recover_master_copy()
5735 ls->ls_recover_locks_in++; in dlm_recover_master_copy()
5745 lkb->lkb_recover_seq = ls->ls_recover_seq; in dlm_recover_master_copy()
5752 log_rinfo(ls, "dlm_recover_master_copy remote %d %x error %d", in dlm_recover_master_copy()
5759 int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc) in dlm_recover_process_copy() argument
5771 error = find_lkb(ls, lkid, &lkb); in dlm_recover_process_copy()
5773 log_error(ls, "dlm_recover_process_copy no %x remote %d %x %d", in dlm_recover_process_copy()
5784 log_error(ls, "dlm_recover_process_copy bad %x remote %d %x %d", in dlm_recover_process_copy()
5800 log_debug(ls, "dlm_recover_process_copy %x remote %d %x %d", in dlm_recover_process_copy()
5811 log_error(ls, "dlm_recover_process_copy %x remote %d %x %d unk", in dlm_recover_process_copy()
5828 int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, in dlm_user_request() argument
5832 int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, in dlm_user_request()
5841 dlm_lock_recovery(ls); in dlm_user_request()
5843 error = create_lkb(ls, &lkb); in dlm_user_request()
5849 trace_dlm_lock_start(ls, lkb, name, namelen, mode, flags); in dlm_user_request()
5877 error = request_lock(ls, lkb, name, namelen, &args); in dlm_user_request()
5899 trace_dlm_lock_end(ls, lkb, name, namelen, mode, flags, error, false); in dlm_user_request()
5901 __put_lkb(ls, lkb); in dlm_user_request()
5903 dlm_unlock_recovery(ls); in dlm_user_request()
5908 int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_convert() argument
5912 int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_convert()
5921 dlm_lock_recovery(ls); in dlm_user_convert()
5923 error = find_lkb(ls, lkid, &lkb); in dlm_user_convert()
5927 trace_dlm_lock_start(ls, lkb, NULL, 0, mode, flags); in dlm_user_convert()
5961 error = convert_lock(ls, lkb, &args); in dlm_user_convert()
5966 trace_dlm_lock_end(ls, lkb, NULL, 0, mode, flags, error, false); in dlm_user_convert()
5969 dlm_unlock_recovery(ls); in dlm_user_convert()
5980 int dlm_user_adopt_orphan(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_adopt_orphan() argument
5989 mutex_lock(&ls->ls_orphans_mutex); in dlm_user_adopt_orphan()
5990 list_for_each_entry(iter, &ls->ls_orphans, lkb_ownqueue) { in dlm_user_adopt_orphan()
6006 mutex_unlock(&ls->ls_orphans_mutex); in dlm_user_adopt_orphan()
6045 int dlm_user_unlock(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_unlock() argument
6053 dlm_lock_recovery(ls); in dlm_user_unlock()
6055 error = find_lkb(ls, lkid, &lkb); in dlm_user_unlock()
6059 trace_dlm_unlock_start(ls, lkb, flags); in dlm_user_unlock()
6073 error = unlock_lock(ls, lkb, &args); in dlm_user_unlock()
6089 trace_dlm_unlock_end(ls, lkb, flags, error); in dlm_user_unlock()
6092 dlm_unlock_recovery(ls); in dlm_user_unlock()
6097 int dlm_user_cancel(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_cancel() argument
6105 dlm_lock_recovery(ls); in dlm_user_cancel()
6107 error = find_lkb(ls, lkid, &lkb); in dlm_user_cancel()
6111 trace_dlm_unlock_start(ls, lkb, flags); in dlm_user_cancel()
6122 error = cancel_lock(ls, lkb, &args); in dlm_user_cancel()
6130 trace_dlm_unlock_end(ls, lkb, flags, error); in dlm_user_cancel()
6133 dlm_unlock_recovery(ls); in dlm_user_cancel()
6138 int dlm_user_deadlock(struct dlm_ls *ls, uint32_t flags, uint32_t lkid) in dlm_user_deadlock() argument
6146 dlm_lock_recovery(ls); in dlm_user_deadlock()
6148 error = find_lkb(ls, lkid, &lkb); in dlm_user_deadlock()
6152 trace_dlm_unlock_start(ls, lkb, flags); in dlm_user_deadlock()
6182 trace_dlm_unlock_end(ls, lkb, flags, error); in dlm_user_deadlock()
6185 dlm_unlock_recovery(ls); in dlm_user_deadlock()
6192 static int orphan_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in orphan_proc_lock() argument
6198 mutex_lock(&ls->ls_orphans_mutex); in orphan_proc_lock()
6199 list_add_tail(&lkb->lkb_ownqueue, &ls->ls_orphans); in orphan_proc_lock()
6200 mutex_unlock(&ls->ls_orphans_mutex); in orphan_proc_lock()
6204 error = cancel_lock(ls, lkb, &args); in orphan_proc_lock()
6215 static int unlock_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in unlock_proc_lock() argument
6223 error = unlock_lock(ls, lkb, &args); in unlock_proc_lock()
6233 static struct dlm_lkb *del_proc_lock(struct dlm_ls *ls, in del_proc_lock() argument
6238 spin_lock(&ls->ls_clear_proc_locks); in del_proc_lock()
6250 spin_unlock(&ls->ls_clear_proc_locks); in del_proc_lock()
6264 void dlm_clear_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc) in dlm_clear_proc_locks() argument
6268 dlm_lock_recovery(ls); in dlm_clear_proc_locks()
6271 lkb = del_proc_lock(ls, proc); in dlm_clear_proc_locks()
6276 orphan_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6278 unlock_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6287 spin_lock(&ls->ls_clear_proc_locks); in dlm_clear_proc_locks()
6303 spin_unlock(&ls->ls_clear_proc_locks); in dlm_clear_proc_locks()
6304 dlm_unlock_recovery(ls); in dlm_clear_proc_locks()
6307 static void purge_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc) in purge_proc_locks() argument
6325 unlock_proc_lock(ls, lkb); in purge_proc_locks()
6349 static void do_purge(struct dlm_ls *ls, int nodeid, int pid) in do_purge() argument
6353 mutex_lock(&ls->ls_orphans_mutex); in do_purge()
6354 list_for_each_entry_safe(lkb, safe, &ls->ls_orphans, lkb_ownqueue) { in do_purge()
6357 unlock_proc_lock(ls, lkb); in do_purge()
6361 mutex_unlock(&ls->ls_orphans_mutex); in do_purge()
6364 static int send_purge(struct dlm_ls *ls, int nodeid, int pid) in send_purge() argument
6370 error = _create_message(ls, sizeof(struct dlm_message), nodeid, in send_purge()
6380 int dlm_user_purge(struct dlm_ls *ls, struct dlm_user_proc *proc, in dlm_user_purge() argument
6386 error = send_purge(ls, nodeid, pid); in dlm_user_purge()
6388 dlm_lock_recovery(ls); in dlm_user_purge()
6390 purge_proc_locks(ls, proc); in dlm_user_purge()
6392 do_purge(ls, nodeid, pid); in dlm_user_purge()
6393 dlm_unlock_recovery(ls); in dlm_user_purge()
6399 int dlm_debug_add_lkb(struct dlm_ls *ls, uint32_t lkb_id, char *name, int len, in dlm_debug_add_lkb() argument
6415 error = _create_lkb(ls, &lkb, lkb_id, lkb_id + 1); in dlm_debug_add_lkb()
6428 error = find_rsb(ls, name, len, 0, R_REQUEST, &r); in dlm_debug_add_lkb()
6431 __put_lkb(ls, lkb); in dlm_debug_add_lkb()
6444 int dlm_debug_add_lkb_to_waiters(struct dlm_ls *ls, uint32_t lkb_id, in dlm_debug_add_lkb_to_waiters() argument
6450 error = find_lkb(ls, lkb_id, &lkb); in dlm_debug_add_lkb_to_waiters()