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()
351 struct dlm_ls *ls = r->res_ls; in put_rsb() local
354 spin_lock(&ls->ls_rsbtbl[bucket].lock); in put_rsb()
356 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in put_rsb()
364 static int pre_rsb_struct(struct dlm_ls *ls) in pre_rsb_struct() argument
369 spin_lock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
370 if (ls->ls_new_rsb_count > dlm_config.ci_new_rsb_count / 2) { in pre_rsb_struct()
371 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
374 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
376 r1 = dlm_allocate_rsb(ls); in pre_rsb_struct()
377 r2 = dlm_allocate_rsb(ls); in pre_rsb_struct()
379 spin_lock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
381 list_add(&r1->res_hashchain, &ls->ls_new_rsb); in pre_rsb_struct()
382 ls->ls_new_rsb_count++; in pre_rsb_struct()
385 list_add(&r2->res_hashchain, &ls->ls_new_rsb); in pre_rsb_struct()
386 ls->ls_new_rsb_count++; in pre_rsb_struct()
388 count = ls->ls_new_rsb_count; in pre_rsb_struct()
389 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
400 static int get_rsb_struct(struct dlm_ls *ls, char *name, int len, in get_rsb_struct() argument
406 spin_lock(&ls->ls_new_rsb_spin); in get_rsb_struct()
407 if (list_empty(&ls->ls_new_rsb)) { in get_rsb_struct()
408 count = ls->ls_new_rsb_count; in get_rsb_struct()
409 spin_unlock(&ls->ls_new_rsb_spin); in get_rsb_struct()
410 log_debug(ls, "find_rsb retry %d %d %s", in get_rsb_struct()
415 r = list_first_entry(&ls->ls_new_rsb, struct dlm_rsb, res_hashchain); in get_rsb_struct()
419 ls->ls_new_rsb_count--; in get_rsb_struct()
420 spin_unlock(&ls->ls_new_rsb_spin); in get_rsb_struct()
422 r->res_ls = ls; in get_rsb_struct()
545 static int find_rsb_dir(struct dlm_ls *ls, char *name, int len, in find_rsb_dir() argument
589 error = pre_rsb_struct(ls); in find_rsb_dir()
594 spin_lock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
596 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_dir()
610 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_dir()
624 log_debug(ls, "find_rsb toss from_other %d master %d dir %d %s", in find_rsb_dir()
633 log_error(ls, "find_rsb toss from_dir %d master %d", in find_rsb_dir()
650 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_dir()
651 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
663 error = get_rsb_struct(ls, name, len, &r); in find_rsb_dir()
665 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
678 log_debug(ls, "find_rsb new from_dir %d recreate %s", in find_rsb_dir()
687 log_error(ls, "find_rsb new from_other %d dir %d our %d %s", in find_rsb_dir()
696 log_debug(ls, "find_rsb new from_other %d dir %d %s", in find_rsb_dir()
712 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
714 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
724 static int find_rsb_nodir(struct dlm_ls *ls, char *name, int len, in find_rsb_nodir() argument
735 error = pre_rsb_struct(ls); in find_rsb_nodir()
739 spin_lock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
741 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_nodir()
754 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_nodir()
767 log_error(ls, "find_rsb toss from_nodeid %d master %d dir %d", in find_rsb_nodir()
778 log_error(ls, "find_rsb toss our %d master %d dir %d", in find_rsb_nodir()
785 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_nodir()
786 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
795 error = get_rsb_struct(ls, name, len, &r); in find_rsb_nodir()
797 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
810 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
812 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
818 static int find_rsb(struct dlm_ls *ls, char *name, int len, int from_nodeid, in find_rsb() argument
828 b = hash & (ls->ls_rsbtbl_size - 1); in find_rsb()
830 dir_nodeid = dlm_hash2nodeid(ls, hash); in find_rsb()
832 if (dlm_no_directory(ls)) in find_rsb()
833 return find_rsb_nodir(ls, name, len, hash, b, dir_nodeid, in find_rsb()
836 return find_rsb_dir(ls, name, len, hash, b, dir_nodeid, in find_rsb()
843 static int validate_master_nodeid(struct dlm_ls *ls, struct dlm_rsb *r, in validate_master_nodeid() argument
846 if (dlm_no_directory(ls)) { in validate_master_nodeid()
847 log_error(ls, "find_rsb keep from_nodeid %d master %d dir %d", in validate_master_nodeid()
860 log_debug(ls, "validate master from_other %d master %d " in validate_master_nodeid()
871 log_error(ls, "validate master from_dir %d master %d " in validate_master_nodeid()
912 int dlm_master_lookup(struct dlm_ls *ls, int from_nodeid, char *name, int len, in dlm_master_lookup() argument
926 log_error(ls, "dlm_master_lookup from our_nodeid %d flags %x", in dlm_master_lookup()
932 b = hash & (ls->ls_rsbtbl_size - 1); in dlm_master_lookup()
934 dir_nodeid = dlm_hash2nodeid(ls, hash); in dlm_master_lookup()
936 log_error(ls, "dlm_master_lookup from %d dir %d our %d h %x %d", in dlm_master_lookup()
938 ls->ls_num_nodes); in dlm_master_lookup()
944 error = pre_rsb_struct(ls); in dlm_master_lookup()
948 spin_lock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
949 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_master_lookup()
955 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
960 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_master_lookup()
971 log_error(ls, "dlm_master_lookup res_dir %d our %d %s", in dlm_master_lookup()
976 if (fix_master && dlm_is_removed(ls, r->res_master_nodeid)) { in dlm_master_lookup()
988 log_error(ls, "dlm_master_lookup fix_master on toss"); in dlm_master_lookup()
998 log_limit(ls, "dlm_master_lookup from_master %d " in dlm_master_lookup()
1004 log_error(ls, "from_master %d our_master", from_nodeid); in dlm_master_lookup()
1019 log_debug(ls, "dlm_master_lookup master 0 to %d first %x %s", in dlm_master_lookup()
1031 log_limit(ls, "dlm_master_lookup from master %d flags %x " in dlm_master_lookup()
1044 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1053 error = get_rsb_struct(ls, name, len, &r); in dlm_master_lookup()
1055 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1069 error = rsb_insert(r, &ls->ls_rsbtbl[b].toss); in dlm_master_lookup()
1073 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1082 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1086 static void dlm_dump_rsb_hash(struct dlm_ls *ls, uint32_t hash) in dlm_dump_rsb_hash() argument
1092 for (i = 0; i < ls->ls_rsbtbl_size; i++) { in dlm_dump_rsb_hash()
1093 spin_lock(&ls->ls_rsbtbl[i].lock); in dlm_dump_rsb_hash()
1094 for (n = rb_first(&ls->ls_rsbtbl[i].keep); n; n = rb_next(n)) { in dlm_dump_rsb_hash()
1099 spin_unlock(&ls->ls_rsbtbl[i].lock); in dlm_dump_rsb_hash()
1103 void dlm_dump_rsb_name(struct dlm_ls *ls, char *name, int len) in dlm_dump_rsb_name() argument
1110 b = hash & (ls->ls_rsbtbl_size - 1); in dlm_dump_rsb_name()
1112 spin_lock(&ls->ls_rsbtbl[b].lock); in dlm_dump_rsb_name()
1113 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_dump_rsb_name()
1117 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_dump_rsb_name()
1123 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_dump_rsb_name()
1129 struct dlm_ls *ls = r->res_ls; in toss_rsb() local
1133 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[r->res_bucket].keep); in toss_rsb()
1134 rsb_insert(r, &ls->ls_rsbtbl[r->res_bucket].toss); in toss_rsb()
1136 ls->ls_rsbtbl[r->res_bucket].flags |= DLM_RTF_SHRINK; in toss_rsb()
1184 static int create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret) in create_lkb() argument
1189 lkb = dlm_allocate_lkb(ls); in create_lkb()
1204 spin_lock(&ls->ls_lkbidr_spin); in create_lkb()
1205 rv = idr_alloc(&ls->ls_lkbidr, lkb, 1, 0, GFP_NOWAIT); in create_lkb()
1208 spin_unlock(&ls->ls_lkbidr_spin); in create_lkb()
1212 log_error(ls, "create_lkb idr error %d", rv); in create_lkb()
1221 static int find_lkb(struct dlm_ls *ls, uint32_t lkid, struct dlm_lkb **lkb_ret) in find_lkb() argument
1225 spin_lock(&ls->ls_lkbidr_spin); in find_lkb()
1226 lkb = idr_find(&ls->ls_lkbidr, lkid); in find_lkb()
1229 spin_unlock(&ls->ls_lkbidr_spin); in find_lkb()
1248 static int __put_lkb(struct dlm_ls *ls, struct dlm_lkb *lkb) in __put_lkb() argument
1252 spin_lock(&ls->ls_lkbidr_spin); in __put_lkb()
1254 idr_remove(&ls->ls_lkbidr, lkid); in __put_lkb()
1255 spin_unlock(&ls->ls_lkbidr_spin); in __put_lkb()
1265 spin_unlock(&ls->ls_lkbidr_spin); in __put_lkb()
1272 struct dlm_ls *ls; in dlm_put_lkb() local
1277 ls = lkb->lkb_resource->res_ls; in dlm_put_lkb()
1278 return __put_lkb(ls, lkb); in dlm_put_lkb()
1396 void dlm_scan_waiters(struct dlm_ls *ls) in dlm_scan_waiters() argument
1409 mutex_lock(&ls->ls_waiters_mutex); in dlm_scan_waiters()
1411 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in dlm_scan_waiters()
1429 num_nodes = ls->ls_num_nodes; in dlm_scan_waiters()
1437 log_error(ls, "waitwarn %x %lld %d us check connection to " in dlm_scan_waiters()
1441 mutex_unlock(&ls->ls_waiters_mutex); in dlm_scan_waiters()
1445 log_debug(ls, "scan_waiters %u warn %u over %d us max %lld us", in dlm_scan_waiters()
1455 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_to_waiters() local
1458 mutex_lock(&ls->ls_waiters_mutex); in add_to_waiters()
1481 log_debug(ls, "addwait %x cur %d overlap %d count %d f %x", in add_to_waiters()
1496 list_add(&lkb->lkb_wait_reply, &ls->ls_waiters); in add_to_waiters()
1499 log_error(ls, "addwait error %x %d flags %x %d %d %s", in add_to_waiters()
1502 mutex_unlock(&ls->ls_waiters_mutex); in add_to_waiters()
1514 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in _remove_from_waiters() local
1518 log_debug(ls, "remwait %x unlock_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1525 log_debug(ls, "remwait %x cancel_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1536 log_debug(ls, "remwait %x cancel_reply wait_type %d", in _remove_from_waiters()
1552 log_debug(ls, "remwait %x convert_reply zap overlap_cancel", in _remove_from_waiters()
1568 log_error(ls, "remwait error %x remote %d %x msg %d flags %x no wait", in _remove_from_waiters()
1580 log_error(ls, "remwait error %x reply %d wait_type %d overlap", in _remove_from_waiters()
1598 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters() local
1601 mutex_lock(&ls->ls_waiters_mutex); in remove_from_waiters()
1603 mutex_unlock(&ls->ls_waiters_mutex); in remove_from_waiters()
1612 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters_ms() local
1616 mutex_lock(&ls->ls_waiters_mutex); in remove_from_waiters_ms()
1619 mutex_unlock(&ls->ls_waiters_mutex); in remove_from_waiters_ms()
1630 struct dlm_ls *ls = r->res_ls; in wait_pending_remove() local
1632 spin_lock(&ls->ls_remove_spin); in wait_pending_remove()
1633 if (ls->ls_remove_len && in wait_pending_remove()
1634 !rsb_cmp(r, ls->ls_remove_name, ls->ls_remove_len)) { in wait_pending_remove()
1635 log_debug(ls, "delay lookup for remove dir %d %s", in wait_pending_remove()
1637 spin_unlock(&ls->ls_remove_spin); in wait_pending_remove()
1641 spin_unlock(&ls->ls_remove_spin); in wait_pending_remove()
1651 static void shrink_bucket(struct dlm_ls *ls, int b) in shrink_bucket() argument
1661 memset(&ls->ls_remove_lens, 0, sizeof(int) * DLM_REMOVE_NAMES_MAX); in shrink_bucket()
1663 spin_lock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1665 if (!(ls->ls_rsbtbl[b].flags & DLM_RTF_SHRINK)) { in shrink_bucket()
1666 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1670 for (n = rb_first(&ls->ls_rsbtbl[b].toss); n; n = next) { in shrink_bucket()
1679 if (!dlm_no_directory(ls) && in shrink_bucket()
1692 if (!dlm_no_directory(ls) && in shrink_bucket()
1700 ls->ls_remove_lens[remote_count] = r->res_length; in shrink_bucket()
1701 memcpy(ls->ls_remove_names[remote_count], r->res_name, in shrink_bucket()
1711 log_error(ls, "tossed rsb in use %s", r->res_name); in shrink_bucket()
1715 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1720 ls->ls_rsbtbl[b].flags |= DLM_RTF_SHRINK; in shrink_bucket()
1722 ls->ls_rsbtbl[b].flags &= ~DLM_RTF_SHRINK; in shrink_bucket()
1723 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1740 name = ls->ls_remove_names[i]; in shrink_bucket()
1741 len = ls->ls_remove_lens[i]; in shrink_bucket()
1743 spin_lock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1744 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in shrink_bucket()
1746 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1747 log_debug(ls, "remove_name not toss %s", name); in shrink_bucket()
1752 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1753 log_debug(ls, "remove_name master %d dir %d our %d %s", in shrink_bucket()
1761 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1762 log_error(ls, "remove_name dir %d master %d our %d %s", in shrink_bucket()
1770 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1771 log_debug(ls, "remove_name toss_time %lu now %lu %s", in shrink_bucket()
1777 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1778 log_error(ls, "remove_name in use %s", name); in shrink_bucket()
1782 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1785 spin_lock(&ls->ls_remove_spin); in shrink_bucket()
1786 ls->ls_remove_len = len; in shrink_bucket()
1787 memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN); in shrink_bucket()
1788 spin_unlock(&ls->ls_remove_spin); in shrink_bucket()
1789 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1794 spin_lock(&ls->ls_remove_spin); in shrink_bucket()
1795 ls->ls_remove_len = 0; in shrink_bucket()
1796 memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN); in shrink_bucket()
1797 spin_unlock(&ls->ls_remove_spin); in shrink_bucket()
1803 void dlm_scan_rsbs(struct dlm_ls *ls) in dlm_scan_rsbs() argument
1807 for (i = 0; i < ls->ls_rsbtbl_size; i++) { in dlm_scan_rsbs()
1808 shrink_bucket(ls, i); in dlm_scan_rsbs()
1809 if (dlm_locking_stopped(ls)) in dlm_scan_rsbs()
1817 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_timeout() local
1822 if (test_bit(LSFL_TIMEWARN, &ls->ls_flags) && in add_timeout()
1833 mutex_lock(&ls->ls_timeout_mutex); in add_timeout()
1835 list_add_tail(&lkb->lkb_time_list, &ls->ls_timeout); in add_timeout()
1836 mutex_unlock(&ls->ls_timeout_mutex); in add_timeout()
1841 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in del_timeout() local
1843 mutex_lock(&ls->ls_timeout_mutex); in del_timeout()
1848 mutex_unlock(&ls->ls_timeout_mutex); in del_timeout()
1857 void dlm_scan_timeout(struct dlm_ls *ls) in dlm_scan_timeout() argument
1865 if (dlm_locking_stopped(ls)) in dlm_scan_timeout()
1870 mutex_lock(&ls->ls_timeout_mutex); in dlm_scan_timeout()
1871 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) { in dlm_scan_timeout()
1889 mutex_unlock(&ls->ls_timeout_mutex); in dlm_scan_timeout()
1907 log_debug(ls, "timeout cancel %x node %d %s", in dlm_scan_timeout()
1924 void dlm_adjust_timeouts(struct dlm_ls *ls) in dlm_adjust_timeouts() argument
1927 u64 adj_us = jiffies_to_usecs(jiffies - ls->ls_recover_begin); in dlm_adjust_timeouts()
1929 ls->ls_recover_begin = 0; in dlm_adjust_timeouts()
1930 mutex_lock(&ls->ls_timeout_mutex); in dlm_adjust_timeouts()
1931 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) in dlm_adjust_timeouts()
1933 mutex_unlock(&ls->ls_timeout_mutex); in dlm_adjust_timeouts()
1938 mutex_lock(&ls->ls_waiters_mutex); in dlm_adjust_timeouts()
1939 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in dlm_adjust_timeouts()
1943 mutex_unlock(&ls->ls_waiters_mutex); in dlm_adjust_timeouts()
2885 static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in validate_lock_args() argument
2922 log_debug(ls, "validate_lock_args %d %x %x %x %d %d %s", in validate_lock_args()
2938 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in validate_unlock_args() local
2942 log_error(ls, "unlock on MSTCPY %x", lkb->lkb_id); in validate_unlock_args()
2952 log_debug(ls, "unlock on ENDOFLIFE %x", lkb->lkb_id); in validate_unlock_args()
2962 log_debug(ls, "unlock on rsb_lookup %x", lkb->lkb_id); in validate_unlock_args()
3059 log_debug(ls, "validate_unlock_args %d %x %x %x %x %d %s", rv, in validate_unlock_args()
3313 static int request_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, char *name, in request_lock() argument
3319 error = validate_lock_args(ls, lkb, args); in request_lock()
3323 error = find_rsb(ls, name, len, 0, R_REQUEST, &r); in request_lock()
3339 static int convert_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in convert_lock() argument
3350 error = validate_lock_args(ls, lkb, args); in convert_lock()
3361 static int unlock_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in unlock_lock() argument
3383 static int cancel_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in cancel_lock() argument
3420 struct dlm_ls *ls; in dlm_lock() local
3425 ls = dlm_find_lockspace_local(lockspace); in dlm_lock()
3426 if (!ls) in dlm_lock()
3429 dlm_lock_recovery(ls); in dlm_lock()
3432 error = find_lkb(ls, lksb->sb_lkid, &lkb); in dlm_lock()
3434 error = create_lkb(ls, &lkb); in dlm_lock()
3445 error = convert_lock(ls, lkb, &args); in dlm_lock()
3447 error = request_lock(ls, lkb, name, namelen, &args); in dlm_lock()
3453 __put_lkb(ls, lkb); in dlm_lock()
3457 dlm_unlock_recovery(ls); in dlm_lock()
3458 dlm_put_lockspace(ls); in dlm_lock()
3468 struct dlm_ls *ls; in dlm_unlock() local
3473 ls = dlm_find_lockspace_local(lockspace); in dlm_unlock()
3474 if (!ls) in dlm_unlock()
3477 dlm_lock_recovery(ls); in dlm_unlock()
3479 error = find_lkb(ls, lkid, &lkb); in dlm_unlock()
3488 error = cancel_lock(ls, lkb, &args); in dlm_unlock()
3490 error = unlock_lock(ls, lkb, &args); in dlm_unlock()
3499 dlm_unlock_recovery(ls); in dlm_unlock()
3500 dlm_put_lockspace(ls); in dlm_unlock()
3526 static int _create_message(struct dlm_ls *ls, int mb_len, in _create_message() argument
3548 ms->m_header.h_lockspace = ls->ls_global_id; in _create_message()
3838 static int send_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms_in, in send_lookup_reply() argument
3841 struct dlm_rsb *r = &ls->ls_stub_rsb; in send_lookup_reply()
3886 static int receive_lvb(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_lvb() argument
3893 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_lvb()
3897 if (len > ls->ls_lvblen) in receive_lvb()
3898 len = ls->ls_lvblen; in receive_lvb()
3914 static int receive_request_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_request_args() argument
3928 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_request_args()
3936 static int receive_convert_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_convert_args() argument
3942 if (receive_lvb(ls, lkb, ms)) in receive_convert_args()
3951 static int receive_unlock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_unlock_args() argument
3954 if (receive_lvb(ls, lkb, ms)) in receive_unlock_args()
3962 static void setup_stub_lkb(struct dlm_ls *ls, struct dlm_message *ms) in setup_stub_lkb() argument
3964 struct dlm_lkb *lkb = &ls->ls_stub_lkb; in setup_stub_lkb()
4013 static void send_repeat_remove(struct dlm_ls *ls, char *ms_name, int len) in send_repeat_remove() argument
4026 b = hash & (ls->ls_rsbtbl_size - 1); in send_repeat_remove()
4028 dir_nodeid = dlm_hash2nodeid(ls, hash); in send_repeat_remove()
4030 log_error(ls, "send_repeat_remove dir %d %s", dir_nodeid, name); in send_repeat_remove()
4032 spin_lock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4033 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in send_repeat_remove()
4035 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4036 log_error(ls, "repeat_remove on keep %s", name); in send_repeat_remove()
4040 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in send_repeat_remove()
4042 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4043 log_error(ls, "repeat_remove on toss %s", name); in send_repeat_remove()
4049 spin_lock(&ls->ls_remove_spin); in send_repeat_remove()
4050 ls->ls_remove_len = len; in send_repeat_remove()
4051 memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN); in send_repeat_remove()
4052 spin_unlock(&ls->ls_remove_spin); in send_repeat_remove()
4053 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4055 rv = _create_message(ls, sizeof(struct dlm_message) + len, in send_repeat_remove()
4065 spin_lock(&ls->ls_remove_spin); in send_repeat_remove()
4066 ls->ls_remove_len = 0; in send_repeat_remove()
4067 memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN); in send_repeat_remove()
4068 spin_unlock(&ls->ls_remove_spin); in send_repeat_remove()
4071 static int receive_request(struct dlm_ls *ls, struct dlm_message *ms) in receive_request() argument
4080 error = create_lkb(ls, &lkb); in receive_request()
4086 error = receive_request_args(ls, lkb, ms); in receive_request()
4088 __put_lkb(ls, lkb); in receive_request()
4100 error = find_rsb(ls, ms->m_extra, namelen, from_nodeid, in receive_request()
4103 __put_lkb(ls, lkb); in receive_request()
4110 error = validate_master_nodeid(ls, r, from_nodeid); in receive_request()
4114 __put_lkb(ls, lkb); in receive_request()
4150 log_limit(ls, "receive_request %x from %d %d", in receive_request()
4155 send_repeat_remove(ls, ms->m_extra, namelen); in receive_request()
4159 setup_stub_lkb(ls, ms); in receive_request()
4160 send_request_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_request()
4164 static int receive_convert(struct dlm_ls *ls, struct dlm_message *ms) in receive_convert() argument
4170 error = find_lkb(ls, ms->m_remid, &lkb); in receive_convert()
4175 log_error(ls, "receive_convert %x remid %x recover_seq %llu " in receive_convert()
4195 error = receive_convert_args(ls, lkb, ms); in receive_convert()
4214 setup_stub_lkb(ls, ms); in receive_convert()
4215 send_convert_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_convert()
4219 static int receive_unlock(struct dlm_ls *ls, struct dlm_message *ms) in receive_unlock() argument
4225 error = find_lkb(ls, ms->m_remid, &lkb); in receive_unlock()
4230 log_error(ls, "receive_unlock %x remid %x remote %d %x", in receive_unlock()
4249 error = receive_unlock_args(ls, lkb, ms); in receive_unlock()
4265 setup_stub_lkb(ls, ms); in receive_unlock()
4266 send_unlock_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_unlock()
4270 static int receive_cancel(struct dlm_ls *ls, struct dlm_message *ms) in receive_cancel() argument
4276 error = find_lkb(ls, ms->m_remid, &lkb); in receive_cancel()
4301 setup_stub_lkb(ls, ms); in receive_cancel()
4302 send_cancel_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_cancel()
4306 static int receive_grant(struct dlm_ls *ls, struct dlm_message *ms) in receive_grant() argument
4312 error = find_lkb(ls, ms->m_remid, &lkb); in receive_grant()
4337 static int receive_bast(struct dlm_ls *ls, struct dlm_message *ms) in receive_bast() argument
4343 error = find_lkb(ls, ms->m_remid, &lkb); in receive_bast()
4365 static void receive_lookup(struct dlm_ls *ls, struct dlm_message *ms) in receive_lookup() argument
4374 error = dlm_master_lookup(ls, from_nodeid, ms->m_extra, len, 0, in receive_lookup()
4379 receive_request(ls, ms); in receive_lookup()
4382 send_lookup_reply(ls, ms, ret_nodeid, error); in receive_lookup()
4385 static void receive_remove(struct dlm_ls *ls, struct dlm_message *ms) in receive_remove() argument
4397 log_error(ls, "receive_remove from %d bad len %d", in receive_remove()
4402 dir_nodeid = dlm_hash2nodeid(ls, ms->m_hash); in receive_remove()
4404 log_error(ls, "receive_remove from %d bad nodeid %d", in receive_remove()
4422 b = hash & (ls->ls_rsbtbl_size - 1); in receive_remove()
4424 spin_lock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4426 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in receive_remove()
4429 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in receive_remove()
4432 log_error(ls, "receive_remove from %d not found %s", in receive_remove()
4434 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4439 log_error(ls, "receive_remove keep from %d master %d", in receive_remove()
4442 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4446 log_debug(ls, "receive_remove from %d master %d first %x %s", in receive_remove()
4449 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4454 log_error(ls, "receive_remove toss from %d master %d", in receive_remove()
4457 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4462 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in receive_remove()
4463 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4466 log_error(ls, "receive_remove from %d rsb ref error", in receive_remove()
4469 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4473 static void receive_purge(struct dlm_ls *ls, struct dlm_message *ms) in receive_purge() argument
4475 do_purge(ls, ms->m_nodeid, ms->m_pid); in receive_purge()
4478 static int receive_request_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_request_reply() argument
4485 error = find_lkb(ls, ms->m_remid, &lkb); in receive_request_reply()
4500 log_error(ls, "receive_request_reply %x remote %d %x result %d", in receive_request_reply()
4545 log_limit(ls, "receive_request_reply %x from %d %d " in receive_request_reply()
4572 log_error(ls, "receive_request_reply %x error %d", in receive_request_reply()
4577 log_debug(ls, "receive_request_reply %x result %d unlock", in receive_request_reply()
4583 log_debug(ls, "receive_request_reply %x cancel", lkb->lkb_id); in receive_request_reply()
4665 static int receive_convert_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_convert_reply() argument
4670 error = find_lkb(ls, ms->m_remid, &lkb); in receive_convert_reply()
4715 static int receive_unlock_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_unlock_reply() argument
4720 error = find_lkb(ls, ms->m_remid, &lkb); in receive_unlock_reply()
4765 static int receive_cancel_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_cancel_reply() argument
4770 error = find_lkb(ls, ms->m_remid, &lkb); in receive_cancel_reply()
4779 static void receive_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_lookup_reply() argument
4786 error = find_lkb(ls, ms->m_lkid, &lkb); in receive_lookup_reply()
4788 log_error(ls, "receive_lookup_reply no lkid %x", ms->m_lkid); in receive_lookup_reply()
4813 log_error(ls, "receive_lookup_reply %x from %d ret %d " in receive_lookup_reply()
4827 log_error(ls, "receive_lookup_reply %x from %d bad ret_nodeid", in receive_lookup_reply()
4839 log_debug(ls, "receive_lookup_reply %x unlock %x", in receive_lookup_reply()
4857 static void _receive_message(struct dlm_ls *ls, struct dlm_message *ms, in _receive_message() argument
4862 if (!dlm_is_member(ls, ms->m_header.h_nodeid)) { in _receive_message()
4863 log_limit(ls, "receive %d from non-member %d %x %x %d", in _receive_message()
4874 error = receive_request(ls, ms); in _receive_message()
4878 error = receive_convert(ls, ms); in _receive_message()
4882 error = receive_unlock(ls, ms); in _receive_message()
4887 error = receive_cancel(ls, ms); in _receive_message()
4893 error = receive_request_reply(ls, ms); in _receive_message()
4897 error = receive_convert_reply(ls, ms); in _receive_message()
4901 error = receive_unlock_reply(ls, ms); in _receive_message()
4905 error = receive_cancel_reply(ls, ms); in _receive_message()
4912 error = receive_grant(ls, ms); in _receive_message()
4917 error = receive_bast(ls, ms); in _receive_message()
4923 receive_lookup(ls, ms); in _receive_message()
4927 receive_remove(ls, ms); in _receive_message()
4933 receive_lookup_reply(ls, ms); in _receive_message()
4939 receive_purge(ls, ms); in _receive_message()
4943 log_error(ls, "unknown message type %d", ms->m_type); in _receive_message()
4958 log_debug(ls, "receive %d no %x remote %d %x saved_seq %u", in _receive_message()
4962 log_error(ls, "receive %d no %x remote %d %x saved_seq %u", in _receive_message()
4967 dlm_dump_rsb_hash(ls, ms->m_hash); in _receive_message()
4971 log_error(ls, "receive %d inval from %d lkid %x remid %x " in _receive_message()
4986 static void dlm_receive_message(struct dlm_ls *ls, struct dlm_message *ms, in dlm_receive_message() argument
4989 if (dlm_locking_stopped(ls)) { in dlm_receive_message()
4993 if (!ls->ls_generation) { in dlm_receive_message()
4994 log_limit(ls, "receive %d from %d ignore old gen", in dlm_receive_message()
4999 dlm_add_requestqueue(ls, nodeid, ms); in dlm_receive_message()
5001 dlm_wait_requestqueue(ls); in dlm_receive_message()
5002 _receive_message(ls, ms, 0); in dlm_receive_message()
5009 void dlm_receive_message_saved(struct dlm_ls *ls, struct dlm_message *ms, in dlm_receive_message_saved() argument
5012 _receive_message(ls, ms, saved_seq); in dlm_receive_message_saved()
5023 struct dlm_ls *ls; in dlm_receive_buffer() local
5046 ls = dlm_find_lockspace_global(hd->h_lockspace); in dlm_receive_buffer()
5047 if (!ls) { in dlm_receive_buffer()
5062 down_read(&ls->ls_recv_active); in dlm_receive_buffer()
5064 dlm_receive_message(ls, &p->message, nodeid); in dlm_receive_buffer()
5066 dlm_receive_rcom(ls, &p->rcom, nodeid); in dlm_receive_buffer()
5067 up_read(&ls->ls_recv_active); in dlm_receive_buffer()
5069 dlm_put_lockspace(ls); in dlm_receive_buffer()
5072 static void recover_convert_waiter(struct dlm_ls *ls, struct dlm_lkb *lkb, in recover_convert_waiter() argument
5100 static int waiter_needs_recovery(struct dlm_ls *ls, struct dlm_lkb *lkb, in waiter_needs_recovery() argument
5103 if (dlm_no_directory(ls)) in waiter_needs_recovery()
5106 if (dlm_is_removed(ls, lkb->lkb_wait_nodeid)) in waiter_needs_recovery()
5118 void dlm_recover_waiters_pre(struct dlm_ls *ls) in dlm_recover_waiters_pre() argument
5129 mutex_lock(&ls->ls_waiters_mutex); in dlm_recover_waiters_pre()
5131 list_for_each_entry_safe(lkb, safe, &ls->ls_waiters, lkb_wait_reply) { in dlm_recover_waiters_pre()
5139 log_debug(ls, "waiter %x remote %x msg %d r_nodeid %d " in dlm_recover_waiters_pre()
5158 if (!waiter_needs_recovery(ls, lkb, dir_nodeid)) in dlm_recover_waiters_pre()
5182 log_debug(ls, "rwpre overlap %x %x %d %d %d", in dlm_recover_waiters_pre()
5194 recover_convert_waiter(ls, lkb, ms_stub); in dlm_recover_waiters_pre()
5220 log_error(ls, "invalid lkb wait_type %d %d", in dlm_recover_waiters_pre()
5225 mutex_unlock(&ls->ls_waiters_mutex); in dlm_recover_waiters_pre()
5229 static struct dlm_lkb *find_resend_waiter(struct dlm_ls *ls) in find_resend_waiter() argument
5234 mutex_lock(&ls->ls_waiters_mutex); in find_resend_waiter()
5235 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in find_resend_waiter()
5242 mutex_unlock(&ls->ls_waiters_mutex); in find_resend_waiter()
5265 int dlm_recover_waiters_post(struct dlm_ls *ls) in dlm_recover_waiters_post() argument
5272 if (dlm_locking_stopped(ls)) { in dlm_recover_waiters_post()
5273 log_debug(ls, "recover_waiters_post aborted"); in dlm_recover_waiters_post()
5278 lkb = find_resend_waiter(ls); in dlm_recover_waiters_post()
5291 log_debug(ls, "waiter %x remote %x msg %d r_nodeid %d " in dlm_recover_waiters_post()
5306 mutex_lock(&ls->ls_waiters_mutex); in dlm_recover_waiters_post()
5308 mutex_unlock(&ls->ls_waiters_mutex); in dlm_recover_waiters_post()
5348 log_error(ls, "waiter %x msg %d r_nodeid %d " in dlm_recover_waiters_post()
5361 static void purge_mstcpy_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_mstcpy_list() argument
5373 if (lkb->lkb_recover_seq == ls->ls_recover_seq) in purge_mstcpy_list()
5380 log_error(ls, "purged mstcpy lkb not released"); in purge_mstcpy_list()
5386 struct dlm_ls *ls = r->res_ls; in dlm_purge_mstcpy_locks() local
5388 purge_mstcpy_list(ls, r, &r->res_grantqueue); in dlm_purge_mstcpy_locks()
5389 purge_mstcpy_list(ls, r, &r->res_convertqueue); in dlm_purge_mstcpy_locks()
5390 purge_mstcpy_list(ls, r, &r->res_waitqueue); in dlm_purge_mstcpy_locks()
5393 static void purge_dead_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_dead_list() argument
5404 dlm_is_removed(ls, lkb->lkb_nodeid)) { in purge_dead_list()
5417 log_error(ls, "purged dead lkb not released"); in purge_dead_list()
5428 void dlm_recover_purge(struct dlm_ls *ls) in dlm_recover_purge() argument
5439 list_for_each_entry(memb, &ls->ls_nodes_gone, list) { in dlm_recover_purge()
5447 down_write(&ls->ls_root_sem); in dlm_recover_purge()
5448 list_for_each_entry(r, &ls->ls_root_list, res_root_list) { in dlm_recover_purge()
5452 purge_dead_list(ls, r, &r->res_grantqueue, in dlm_recover_purge()
5454 purge_dead_list(ls, r, &r->res_convertqueue, in dlm_recover_purge()
5456 purge_dead_list(ls, r, &r->res_waitqueue, in dlm_recover_purge()
5463 up_write(&ls->ls_root_sem); in dlm_recover_purge()
5466 log_rinfo(ls, "dlm_recover_purge %u locks for %u nodes", in dlm_recover_purge()
5470 static struct dlm_rsb *find_grant_rsb(struct dlm_ls *ls, int bucket) in find_grant_rsb() argument
5475 spin_lock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5476 for (n = rb_first(&ls->ls_rsbtbl[bucket].keep); n; n = rb_next(n)) { in find_grant_rsb()
5486 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5489 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5510 void dlm_recover_grant(struct dlm_ls *ls) in dlm_recover_grant() argument
5519 r = find_grant_rsb(ls, bucket); in dlm_recover_grant()
5521 if (bucket == ls->ls_rsbtbl_size - 1) in dlm_recover_grant()
5540 log_rinfo(ls, "dlm_recover_grant %u locks on %u resources", in dlm_recover_grant()
5574 static int receive_rcom_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_rcom_lock_args() argument
5596 if (lvblen > ls->ls_lvblen) in receive_rcom_lock_args()
5598 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_rcom_lock_args()
5625 int dlm_recover_master_copy(struct dlm_ls *ls, struct dlm_rcom *rc) in dlm_recover_master_copy() argument
5649 error = find_rsb(ls, rl->rl_name, le16_to_cpu(rl->rl_namelen), in dlm_recover_master_copy()
5656 if (dlm_no_directory(ls) && (dlm_dir_nodeid(r) != dlm_our_nodeid())) { in dlm_recover_master_copy()
5657 log_error(ls, "dlm_recover_master_copy remote %d %x not dir", in dlm_recover_master_copy()
5669 error = create_lkb(ls, &lkb); in dlm_recover_master_copy()
5673 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5675 __put_lkb(ls, lkb); in dlm_recover_master_copy()
5682 ls->ls_recover_locks_in++; in dlm_recover_master_copy()
5692 lkb->lkb_recover_seq = ls->ls_recover_seq; in dlm_recover_master_copy()
5699 log_rinfo(ls, "dlm_recover_master_copy remote %d %x error %d", in dlm_recover_master_copy()
5706 int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc) in dlm_recover_process_copy() argument
5718 error = find_lkb(ls, lkid, &lkb); in dlm_recover_process_copy()
5720 log_error(ls, "dlm_recover_process_copy no %x remote %d %x %d", in dlm_recover_process_copy()
5730 log_error(ls, "dlm_recover_process_copy bad %x remote %d %x %d", in dlm_recover_process_copy()
5745 log_debug(ls, "dlm_recover_process_copy %x remote %d %x %d", in dlm_recover_process_copy()
5755 log_error(ls, "dlm_recover_process_copy %x remote %d %x %d unk", in dlm_recover_process_copy()
5770 int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, in dlm_user_request() argument
5778 dlm_lock_recovery(ls); in dlm_user_request()
5780 error = create_lkb(ls, &lkb); in dlm_user_request()
5790 __put_lkb(ls, lkb); in dlm_user_request()
5801 __put_lkb(ls, lkb); in dlm_user_request()
5809 error = request_lock(ls, lkb, name, namelen, &args); in dlm_user_request()
5821 __put_lkb(ls, lkb); in dlm_user_request()
5831 dlm_unlock_recovery(ls); in dlm_user_request()
5835 int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_convert() argument
5844 dlm_lock_recovery(ls); in dlm_user_convert()
5846 error = find_lkb(ls, lkid, &lkb); in dlm_user_convert()
5877 error = convert_lock(ls, lkb, &args); in dlm_user_convert()
5884 dlm_unlock_recovery(ls); in dlm_user_convert()
5895 int dlm_user_adopt_orphan(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_adopt_orphan() argument
5905 mutex_lock(&ls->ls_orphans_mutex); in dlm_user_adopt_orphan()
5906 list_for_each_entry(lkb, &ls->ls_orphans, lkb_ownqueue) { in dlm_user_adopt_orphan()
5922 mutex_unlock(&ls->ls_orphans_mutex); in dlm_user_adopt_orphan()
5961 int dlm_user_unlock(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_unlock() argument
5969 dlm_lock_recovery(ls); in dlm_user_unlock()
5971 error = find_lkb(ls, lkid, &lkb); in dlm_user_unlock()
5987 error = unlock_lock(ls, lkb, &args); in dlm_user_unlock()
6005 dlm_unlock_recovery(ls); in dlm_user_unlock()
6010 int dlm_user_cancel(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_cancel() argument
6018 dlm_lock_recovery(ls); in dlm_user_cancel()
6020 error = find_lkb(ls, lkid, &lkb); in dlm_user_cancel()
6033 error = cancel_lock(ls, lkb, &args); in dlm_user_cancel()
6043 dlm_unlock_recovery(ls); in dlm_user_cancel()
6048 int dlm_user_deadlock(struct dlm_ls *ls, uint32_t flags, uint32_t lkid) in dlm_user_deadlock() argument
6056 dlm_lock_recovery(ls); in dlm_user_deadlock()
6058 error = find_lkb(ls, lkid, &lkb); in dlm_user_deadlock()
6092 dlm_unlock_recovery(ls); in dlm_user_deadlock()
6099 static int orphan_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in orphan_proc_lock() argument
6105 mutex_lock(&ls->ls_orphans_mutex); in orphan_proc_lock()
6106 list_add_tail(&lkb->lkb_ownqueue, &ls->ls_orphans); in orphan_proc_lock()
6107 mutex_unlock(&ls->ls_orphans_mutex); in orphan_proc_lock()
6111 error = cancel_lock(ls, lkb, &args); in orphan_proc_lock()
6122 static int unlock_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in unlock_proc_lock() argument
6130 error = unlock_lock(ls, lkb, &args); in unlock_proc_lock()
6140 static struct dlm_lkb *del_proc_lock(struct dlm_ls *ls, in del_proc_lock() argument
6145 mutex_lock(&ls->ls_clear_proc_locks); in del_proc_lock()
6157 mutex_unlock(&ls->ls_clear_proc_locks); in del_proc_lock()
6171 void dlm_clear_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc) in dlm_clear_proc_locks() argument
6175 dlm_lock_recovery(ls); in dlm_clear_proc_locks()
6178 lkb = del_proc_lock(ls, proc); in dlm_clear_proc_locks()
6183 orphan_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6185 unlock_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6194 mutex_lock(&ls->ls_clear_proc_locks); in dlm_clear_proc_locks()
6210 mutex_unlock(&ls->ls_clear_proc_locks); in dlm_clear_proc_locks()
6211 dlm_unlock_recovery(ls); in dlm_clear_proc_locks()
6214 static void purge_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc) in purge_proc_locks() argument
6232 unlock_proc_lock(ls, lkb); in purge_proc_locks()
6256 static void do_purge(struct dlm_ls *ls, int nodeid, int pid) in do_purge() argument
6260 mutex_lock(&ls->ls_orphans_mutex); in do_purge()
6261 list_for_each_entry_safe(lkb, safe, &ls->ls_orphans, lkb_ownqueue) { in do_purge()
6264 unlock_proc_lock(ls, lkb); in do_purge()
6268 mutex_unlock(&ls->ls_orphans_mutex); in do_purge()
6271 static int send_purge(struct dlm_ls *ls, int nodeid, int pid) in send_purge() argument
6277 error = _create_message(ls, sizeof(struct dlm_message), nodeid, in send_purge()
6287 int dlm_user_purge(struct dlm_ls *ls, struct dlm_user_proc *proc, in dlm_user_purge() argument
6293 error = send_purge(ls, nodeid, pid); in dlm_user_purge()
6295 dlm_lock_recovery(ls); in dlm_user_purge()
6297 purge_proc_locks(ls, proc); in dlm_user_purge()
6299 do_purge(ls, nodeid, pid); in dlm_user_purge()
6300 dlm_unlock_recovery(ls); in dlm_user_purge()