Lines Matching full:ls
16 request_lock(ls, lkb)
17 convert_lock(ls, lkb)
18 unlock_lock(ls, lkb)
19 cancel_lock(ls, lkb)
89 static void do_purge(struct dlm_ls *ls, int nodeid, int pid);
203 static inline void dlm_lock_recovery(struct dlm_ls *ls) in dlm_lock_recovery() argument
205 down_read(&ls->ls_in_recovery); in dlm_lock_recovery()
208 void dlm_unlock_recovery(struct dlm_ls *ls) in dlm_unlock_recovery() argument
210 up_read(&ls->ls_in_recovery); in dlm_unlock_recovery()
213 int dlm_lock_recovery_try(struct dlm_ls *ls) in dlm_lock_recovery_try() argument
215 return down_read_trylock(&ls->ls_in_recovery); in dlm_lock_recovery_try()
349 struct dlm_ls *ls = r->res_ls; in put_rsb() local
352 spin_lock(&ls->ls_rsbtbl[bucket].lock); in put_rsb()
354 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in put_rsb()
362 static int pre_rsb_struct(struct dlm_ls *ls) in pre_rsb_struct() argument
367 spin_lock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
368 if (ls->ls_new_rsb_count > dlm_config.ci_new_rsb_count / 2) { in pre_rsb_struct()
369 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
372 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
374 r1 = dlm_allocate_rsb(ls); in pre_rsb_struct()
375 r2 = dlm_allocate_rsb(ls); in pre_rsb_struct()
377 spin_lock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
379 list_add(&r1->res_hashchain, &ls->ls_new_rsb); in pre_rsb_struct()
380 ls->ls_new_rsb_count++; in pre_rsb_struct()
383 list_add(&r2->res_hashchain, &ls->ls_new_rsb); in pre_rsb_struct()
384 ls->ls_new_rsb_count++; in pre_rsb_struct()
386 count = ls->ls_new_rsb_count; in pre_rsb_struct()
387 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
394 /* If ls->ls_new_rsb is empty, return -EAGAIN, so the caller can
398 static int get_rsb_struct(struct dlm_ls *ls, char *name, int len, in get_rsb_struct() argument
404 spin_lock(&ls->ls_new_rsb_spin); in get_rsb_struct()
405 if (list_empty(&ls->ls_new_rsb)) { in get_rsb_struct()
406 count = ls->ls_new_rsb_count; in get_rsb_struct()
407 spin_unlock(&ls->ls_new_rsb_spin); in get_rsb_struct()
408 log_debug(ls, "find_rsb retry %d %d %s", in get_rsb_struct()
413 r = list_first_entry(&ls->ls_new_rsb, struct dlm_rsb, res_hashchain); in get_rsb_struct()
417 ls->ls_new_rsb_count--; in get_rsb_struct()
418 spin_unlock(&ls->ls_new_rsb_spin); in get_rsb_struct()
420 r->res_ls = ls; in get_rsb_struct()
543 static int find_rsb_dir(struct dlm_ls *ls, char *name, int len, in find_rsb_dir() argument
587 error = pre_rsb_struct(ls); in find_rsb_dir()
592 spin_lock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
594 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_dir()
608 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_dir()
622 log_debug(ls, "find_rsb toss from_other %d master %d dir %d %s", in find_rsb_dir()
631 log_error(ls, "find_rsb toss from_dir %d master %d", in find_rsb_dir()
648 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_dir()
649 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
661 error = get_rsb_struct(ls, name, len, &r); in find_rsb_dir()
663 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
676 log_debug(ls, "find_rsb new from_dir %d recreate %s", in find_rsb_dir()
685 log_error(ls, "find_rsb new from_other %d dir %d our %d %s", in find_rsb_dir()
694 log_debug(ls, "find_rsb new from_other %d dir %d %s", in find_rsb_dir()
710 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
712 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
722 static int find_rsb_nodir(struct dlm_ls *ls, char *name, int len, in find_rsb_nodir() argument
733 error = pre_rsb_struct(ls); in find_rsb_nodir()
737 spin_lock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
739 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_nodir()
752 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_nodir()
765 log_error(ls, "find_rsb toss from_nodeid %d master %d dir %d", in find_rsb_nodir()
776 log_error(ls, "find_rsb toss our %d master %d dir %d", in find_rsb_nodir()
783 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_nodir()
784 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
793 error = get_rsb_struct(ls, name, len, &r); in find_rsb_nodir()
795 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
808 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
810 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
816 static int find_rsb(struct dlm_ls *ls, char *name, int len, int from_nodeid, in find_rsb() argument
826 b = hash & (ls->ls_rsbtbl_size - 1); in find_rsb()
828 dir_nodeid = dlm_hash2nodeid(ls, hash); in find_rsb()
830 if (dlm_no_directory(ls)) in find_rsb()
831 return find_rsb_nodir(ls, name, len, hash, b, dir_nodeid, in find_rsb()
834 return find_rsb_dir(ls, name, len, hash, b, dir_nodeid, in find_rsb()
841 static int validate_master_nodeid(struct dlm_ls *ls, struct dlm_rsb *r, in validate_master_nodeid() argument
844 if (dlm_no_directory(ls)) { in validate_master_nodeid()
845 log_error(ls, "find_rsb keep from_nodeid %d master %d dir %d", in validate_master_nodeid()
858 log_debug(ls, "validate master from_other %d master %d " in validate_master_nodeid()
869 log_error(ls, "validate master from_dir %d master %d " in validate_master_nodeid()
910 int dlm_master_lookup(struct dlm_ls *ls, int from_nodeid, char *name, int len, in dlm_master_lookup() argument
924 log_error(ls, "dlm_master_lookup from our_nodeid %d flags %x", in dlm_master_lookup()
930 b = hash & (ls->ls_rsbtbl_size - 1); in dlm_master_lookup()
932 dir_nodeid = dlm_hash2nodeid(ls, hash); in dlm_master_lookup()
934 log_error(ls, "dlm_master_lookup from %d dir %d our %d h %x %d", in dlm_master_lookup()
936 ls->ls_num_nodes); in dlm_master_lookup()
942 error = pre_rsb_struct(ls); in dlm_master_lookup()
946 spin_lock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
947 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_master_lookup()
953 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
958 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_master_lookup()
969 log_error(ls, "dlm_master_lookup res_dir %d our %d %s", in dlm_master_lookup()
974 if (fix_master && dlm_is_removed(ls, r->res_master_nodeid)) { in dlm_master_lookup()
986 log_error(ls, "dlm_master_lookup fix_master on toss"); in dlm_master_lookup()
996 log_limit(ls, "dlm_master_lookup from_master %d " in dlm_master_lookup()
1002 log_error(ls, "from_master %d our_master", from_nodeid); in dlm_master_lookup()
1016 log_debug(ls, "dlm_master_lookup master 0 to %d first %x %s", in dlm_master_lookup()
1028 log_limit(ls, "dlm_master_lookup from master %d flags %x " in dlm_master_lookup()
1041 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1050 error = get_rsb_struct(ls, name, len, &r); in dlm_master_lookup()
1052 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1066 error = rsb_insert(r, &ls->ls_rsbtbl[b].toss); in dlm_master_lookup()
1070 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1079 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1083 static void dlm_dump_rsb_hash(struct dlm_ls *ls, uint32_t hash) in dlm_dump_rsb_hash() argument
1089 for (i = 0; i < ls->ls_rsbtbl_size; i++) { in dlm_dump_rsb_hash()
1090 spin_lock(&ls->ls_rsbtbl[i].lock); in dlm_dump_rsb_hash()
1091 for (n = rb_first(&ls->ls_rsbtbl[i].keep); n; n = rb_next(n)) { in dlm_dump_rsb_hash()
1096 spin_unlock(&ls->ls_rsbtbl[i].lock); in dlm_dump_rsb_hash()
1100 void dlm_dump_rsb_name(struct dlm_ls *ls, char *name, int len) in dlm_dump_rsb_name() argument
1107 b = hash & (ls->ls_rsbtbl_size - 1); in dlm_dump_rsb_name()
1109 spin_lock(&ls->ls_rsbtbl[b].lock); in dlm_dump_rsb_name()
1110 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_dump_rsb_name()
1114 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_dump_rsb_name()
1120 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_dump_rsb_name()
1126 struct dlm_ls *ls = r->res_ls; in toss_rsb() local
1130 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[r->res_bucket].keep); in toss_rsb()
1131 rsb_insert(r, &ls->ls_rsbtbl[r->res_bucket].toss); in toss_rsb()
1133 ls->ls_rsbtbl[r->res_bucket].flags |= DLM_RTF_SHRINK; in toss_rsb()
1181 static int create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret) in create_lkb() argument
1186 lkb = dlm_allocate_lkb(ls); in create_lkb()
1201 spin_lock(&ls->ls_lkbidr_spin); in create_lkb()
1202 rv = idr_alloc(&ls->ls_lkbidr, lkb, 1, 0, GFP_NOWAIT); in create_lkb()
1205 spin_unlock(&ls->ls_lkbidr_spin); in create_lkb()
1209 log_error(ls, "create_lkb idr error %d", rv); in create_lkb()
1218 static int find_lkb(struct dlm_ls *ls, uint32_t lkid, struct dlm_lkb **lkb_ret) in find_lkb() argument
1222 spin_lock(&ls->ls_lkbidr_spin); in find_lkb()
1223 lkb = idr_find(&ls->ls_lkbidr, lkid); in find_lkb()
1226 spin_unlock(&ls->ls_lkbidr_spin); in find_lkb()
1245 static int __put_lkb(struct dlm_ls *ls, struct dlm_lkb *lkb) in __put_lkb() argument
1249 spin_lock(&ls->ls_lkbidr_spin); in __put_lkb()
1251 idr_remove(&ls->ls_lkbidr, lkid); in __put_lkb()
1252 spin_unlock(&ls->ls_lkbidr_spin); in __put_lkb()
1262 spin_unlock(&ls->ls_lkbidr_spin); in __put_lkb()
1269 struct dlm_ls *ls; in dlm_put_lkb() local
1274 ls = lkb->lkb_resource->res_ls; in dlm_put_lkb()
1275 return __put_lkb(ls, lkb); in dlm_put_lkb()
1393 void dlm_scan_waiters(struct dlm_ls *ls) in dlm_scan_waiters() argument
1406 mutex_lock(&ls->ls_waiters_mutex); in dlm_scan_waiters()
1408 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in dlm_scan_waiters()
1426 num_nodes = ls->ls_num_nodes; in dlm_scan_waiters()
1434 log_error(ls, "waitwarn %x %lld %d us check connection to " in dlm_scan_waiters()
1438 mutex_unlock(&ls->ls_waiters_mutex); in dlm_scan_waiters()
1442 log_debug(ls, "scan_waiters %u warn %u over %d us max %lld us", in dlm_scan_waiters()
1452 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_to_waiters() local
1455 mutex_lock(&ls->ls_waiters_mutex); in add_to_waiters()
1478 log_debug(ls, "addwait %x cur %d overlap %d count %d f %x", in add_to_waiters()
1493 list_add(&lkb->lkb_wait_reply, &ls->ls_waiters); in add_to_waiters()
1496 log_error(ls, "addwait error %x %d flags %x %d %d %s", in add_to_waiters()
1499 mutex_unlock(&ls->ls_waiters_mutex); in add_to_waiters()
1511 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in _remove_from_waiters() local
1515 log_debug(ls, "remwait %x unlock_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1522 log_debug(ls, "remwait %x cancel_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1533 log_debug(ls, "remwait %x cancel_reply wait_type %d", in _remove_from_waiters()
1549 log_debug(ls, "remwait %x convert_reply zap overlap_cancel", in _remove_from_waiters()
1566 log_error(ls, "remwait error %x remote %d %x msg %d flags %x no wait", in _remove_from_waiters()
1578 log_error(ls, "remwait error %x reply %d wait_type %d overlap", in _remove_from_waiters()
1597 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters() local
1600 mutex_lock(&ls->ls_waiters_mutex); in remove_from_waiters()
1602 mutex_unlock(&ls->ls_waiters_mutex); in remove_from_waiters()
1611 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters_ms() local
1615 mutex_lock(&ls->ls_waiters_mutex); in remove_from_waiters_ms()
1618 mutex_unlock(&ls->ls_waiters_mutex); in remove_from_waiters_ms()
1629 struct dlm_ls *ls = r->res_ls; in wait_pending_remove() local
1631 spin_lock(&ls->ls_remove_spin); in wait_pending_remove()
1632 if (ls->ls_remove_len && in wait_pending_remove()
1633 !rsb_cmp(r, ls->ls_remove_name, ls->ls_remove_len)) { in wait_pending_remove()
1634 log_debug(ls, "delay lookup for remove dir %d %s", in wait_pending_remove()
1636 spin_unlock(&ls->ls_remove_spin); in wait_pending_remove()
1640 spin_unlock(&ls->ls_remove_spin); in wait_pending_remove()
1650 static void shrink_bucket(struct dlm_ls *ls, int b) in shrink_bucket() argument
1660 memset(&ls->ls_remove_lens, 0, sizeof(int) * DLM_REMOVE_NAMES_MAX); in shrink_bucket()
1662 spin_lock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1664 if (!(ls->ls_rsbtbl[b].flags & DLM_RTF_SHRINK)) { in shrink_bucket()
1665 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1669 for (n = rb_first(&ls->ls_rsbtbl[b].toss); n; n = next) { in shrink_bucket()
1678 if (!dlm_no_directory(ls) && in shrink_bucket()
1691 if (!dlm_no_directory(ls) && in shrink_bucket()
1699 ls->ls_remove_lens[remote_count] = r->res_length; in shrink_bucket()
1700 memcpy(ls->ls_remove_names[remote_count], r->res_name, in shrink_bucket()
1710 log_error(ls, "tossed rsb in use %s", r->res_name); in shrink_bucket()
1714 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1719 ls->ls_rsbtbl[b].flags |= DLM_RTF_SHRINK; in shrink_bucket()
1721 ls->ls_rsbtbl[b].flags &= ~DLM_RTF_SHRINK; in shrink_bucket()
1722 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1739 name = ls->ls_remove_names[i]; in shrink_bucket()
1740 len = ls->ls_remove_lens[i]; in shrink_bucket()
1742 spin_lock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1743 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in shrink_bucket()
1745 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1746 log_debug(ls, "remove_name not toss %s", name); in shrink_bucket()
1751 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1752 log_debug(ls, "remove_name master %d dir %d our %d %s", in shrink_bucket()
1760 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1761 log_error(ls, "remove_name dir %d master %d our %d %s", in shrink_bucket()
1769 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1770 log_debug(ls, "remove_name toss_time %lu now %lu %s", in shrink_bucket()
1776 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1777 log_error(ls, "remove_name in use %s", name); in shrink_bucket()
1781 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1784 spin_lock(&ls->ls_remove_spin); in shrink_bucket()
1785 ls->ls_remove_len = len; in shrink_bucket()
1786 memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN); in shrink_bucket()
1787 spin_unlock(&ls->ls_remove_spin); in shrink_bucket()
1788 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1793 spin_lock(&ls->ls_remove_spin); in shrink_bucket()
1794 ls->ls_remove_len = 0; in shrink_bucket()
1795 memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN); in shrink_bucket()
1796 spin_unlock(&ls->ls_remove_spin); in shrink_bucket()
1802 void dlm_scan_rsbs(struct dlm_ls *ls) in dlm_scan_rsbs() argument
1806 for (i = 0; i < ls->ls_rsbtbl_size; i++) { in dlm_scan_rsbs()
1807 shrink_bucket(ls, i); in dlm_scan_rsbs()
1808 if (dlm_locking_stopped(ls)) in dlm_scan_rsbs()
1816 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_timeout() local
1821 if (test_bit(LSFL_TIMEWARN, &ls->ls_flags) && in add_timeout()
1832 mutex_lock(&ls->ls_timeout_mutex); in add_timeout()
1834 list_add_tail(&lkb->lkb_time_list, &ls->ls_timeout); in add_timeout()
1835 mutex_unlock(&ls->ls_timeout_mutex); in add_timeout()
1840 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in del_timeout() local
1842 mutex_lock(&ls->ls_timeout_mutex); in del_timeout()
1847 mutex_unlock(&ls->ls_timeout_mutex); in del_timeout()
1856 void dlm_scan_timeout(struct dlm_ls *ls) in dlm_scan_timeout() argument
1864 if (dlm_locking_stopped(ls)) in dlm_scan_timeout()
1869 mutex_lock(&ls->ls_timeout_mutex); in dlm_scan_timeout()
1870 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) { in dlm_scan_timeout()
1888 mutex_unlock(&ls->ls_timeout_mutex); in dlm_scan_timeout()
1906 log_debug(ls, "timeout cancel %x node %d %s", in dlm_scan_timeout()
1923 void dlm_adjust_timeouts(struct dlm_ls *ls) in dlm_adjust_timeouts() argument
1926 u64 adj_us = jiffies_to_usecs(jiffies - ls->ls_recover_begin); in dlm_adjust_timeouts()
1928 ls->ls_recover_begin = 0; in dlm_adjust_timeouts()
1929 mutex_lock(&ls->ls_timeout_mutex); in dlm_adjust_timeouts()
1930 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) in dlm_adjust_timeouts()
1932 mutex_unlock(&ls->ls_timeout_mutex); in dlm_adjust_timeouts()
1937 mutex_lock(&ls->ls_waiters_mutex); in dlm_adjust_timeouts()
1938 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in dlm_adjust_timeouts()
1942 mutex_unlock(&ls->ls_waiters_mutex); in dlm_adjust_timeouts()
2888 static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in validate_lock_args() argument
2925 log_debug(ls, "validate_lock_args %d %x %x %x %d %d %s", in validate_lock_args()
2941 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in validate_unlock_args() local
2945 log_error(ls, "unlock on MSTCPY %x", lkb->lkb_id); in validate_unlock_args()
2955 log_debug(ls, "unlock on ENDOFLIFE %x", lkb->lkb_id); in validate_unlock_args()
2965 log_debug(ls, "unlock on rsb_lookup %x", lkb->lkb_id); in validate_unlock_args()
3062 log_debug(ls, "validate_unlock_args %d %x %x %x %x %d %s", rv, in validate_unlock_args()
3316 static int request_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, char *name, in request_lock() argument
3322 error = validate_lock_args(ls, lkb, args); in request_lock()
3326 error = find_rsb(ls, name, len, 0, R_REQUEST, &r); in request_lock()
3342 static int convert_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in convert_lock() argument
3353 error = validate_lock_args(ls, lkb, args); in convert_lock()
3364 static int unlock_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in unlock_lock() argument
3386 static int cancel_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in cancel_lock() argument
3423 struct dlm_ls *ls; in dlm_lock() local
3428 ls = dlm_find_lockspace_local(lockspace); in dlm_lock()
3429 if (!ls) in dlm_lock()
3432 dlm_lock_recovery(ls); in dlm_lock()
3435 error = find_lkb(ls, lksb->sb_lkid, &lkb); in dlm_lock()
3437 error = create_lkb(ls, &lkb); in dlm_lock()
3448 error = convert_lock(ls, lkb, &args); in dlm_lock()
3450 error = request_lock(ls, lkb, name, namelen, &args); in dlm_lock()
3456 __put_lkb(ls, lkb); in dlm_lock()
3460 dlm_unlock_recovery(ls); in dlm_lock()
3461 dlm_put_lockspace(ls); in dlm_lock()
3471 struct dlm_ls *ls; in dlm_unlock() local
3476 ls = dlm_find_lockspace_local(lockspace); in dlm_unlock()
3477 if (!ls) in dlm_unlock()
3480 dlm_lock_recovery(ls); in dlm_unlock()
3482 error = find_lkb(ls, lkid, &lkb); in dlm_unlock()
3491 error = cancel_lock(ls, lkb, &args); in dlm_unlock()
3493 error = unlock_lock(ls, lkb, &args); in dlm_unlock()
3502 dlm_unlock_recovery(ls); in dlm_unlock()
3503 dlm_put_lockspace(ls); in dlm_unlock()
3529 static int _create_message(struct dlm_ls *ls, int mb_len, in _create_message() argument
3551 ms->m_header.h_lockspace = ls->ls_global_id; in _create_message()
3841 static int send_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms_in, in send_lookup_reply() argument
3844 struct dlm_rsb *r = &ls->ls_stub_rsb; in send_lookup_reply()
3889 static int receive_lvb(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_lvb() argument
3896 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_lvb()
3900 if (len > ls->ls_lvblen) in receive_lvb()
3901 len = ls->ls_lvblen; in receive_lvb()
3917 static int receive_request_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_request_args() argument
3931 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_request_args()
3939 static int receive_convert_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_convert_args() argument
3945 if (receive_lvb(ls, lkb, ms)) in receive_convert_args()
3954 static int receive_unlock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_unlock_args() argument
3957 if (receive_lvb(ls, lkb, ms)) in receive_unlock_args()
3965 static void setup_stub_lkb(struct dlm_ls *ls, struct dlm_message *ms) in setup_stub_lkb() argument
3967 struct dlm_lkb *lkb = &ls->ls_stub_lkb; in setup_stub_lkb()
4025 static void send_repeat_remove(struct dlm_ls *ls, char *ms_name, int len) in send_repeat_remove() argument
4038 b = hash & (ls->ls_rsbtbl_size - 1); in send_repeat_remove()
4040 dir_nodeid = dlm_hash2nodeid(ls, hash); in send_repeat_remove()
4042 log_error(ls, "send_repeat_remove dir %d %s", dir_nodeid, name); in send_repeat_remove()
4044 spin_lock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4045 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in send_repeat_remove()
4047 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4048 log_error(ls, "repeat_remove on keep %s", name); in send_repeat_remove()
4052 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in send_repeat_remove()
4054 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4055 log_error(ls, "repeat_remove on toss %s", name); in send_repeat_remove()
4059 /* use ls->remove_name2 to avoid conflict with shrink? */ in send_repeat_remove()
4061 spin_lock(&ls->ls_remove_spin); in send_repeat_remove()
4062 ls->ls_remove_len = len; in send_repeat_remove()
4063 memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN); in send_repeat_remove()
4064 spin_unlock(&ls->ls_remove_spin); in send_repeat_remove()
4065 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4067 rv = _create_message(ls, sizeof(struct dlm_message) + len, in send_repeat_remove()
4078 spin_lock(&ls->ls_remove_spin); in send_repeat_remove()
4079 ls->ls_remove_len = 0; in send_repeat_remove()
4080 memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN); in send_repeat_remove()
4081 spin_unlock(&ls->ls_remove_spin); in send_repeat_remove()
4084 static int receive_request(struct dlm_ls *ls, struct dlm_message *ms) in receive_request() argument
4093 error = create_lkb(ls, &lkb); in receive_request()
4099 error = receive_request_args(ls, lkb, ms); in receive_request()
4101 __put_lkb(ls, lkb); in receive_request()
4113 error = find_rsb(ls, ms->m_extra, namelen, from_nodeid, in receive_request()
4116 __put_lkb(ls, lkb); in receive_request()
4123 error = validate_master_nodeid(ls, r, from_nodeid); in receive_request()
4127 __put_lkb(ls, lkb); in receive_request()
4163 log_limit(ls, "receive_request %x from %d %d", in receive_request()
4168 send_repeat_remove(ls, ms->m_extra, namelen); in receive_request()
4172 setup_stub_lkb(ls, ms); in receive_request()
4173 send_request_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_request()
4177 static int receive_convert(struct dlm_ls *ls, struct dlm_message *ms) in receive_convert() argument
4183 error = find_lkb(ls, ms->m_remid, &lkb); in receive_convert()
4188 log_error(ls, "receive_convert %x remid %x recover_seq %llu " in receive_convert()
4208 error = receive_convert_args(ls, lkb, ms); in receive_convert()
4227 setup_stub_lkb(ls, ms); in receive_convert()
4228 send_convert_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_convert()
4232 static int receive_unlock(struct dlm_ls *ls, struct dlm_message *ms) in receive_unlock() argument
4238 error = find_lkb(ls, ms->m_remid, &lkb); in receive_unlock()
4243 log_error(ls, "receive_unlock %x remid %x remote %d %x", in receive_unlock()
4262 error = receive_unlock_args(ls, lkb, ms); in receive_unlock()
4278 setup_stub_lkb(ls, ms); in receive_unlock()
4279 send_unlock_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_unlock()
4283 static int receive_cancel(struct dlm_ls *ls, struct dlm_message *ms) in receive_cancel() argument
4289 error = find_lkb(ls, ms->m_remid, &lkb); in receive_cancel()
4314 setup_stub_lkb(ls, ms); in receive_cancel()
4315 send_cancel_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_cancel()
4319 static int receive_grant(struct dlm_ls *ls, struct dlm_message *ms) in receive_grant() argument
4325 error = find_lkb(ls, ms->m_remid, &lkb); in receive_grant()
4350 static int receive_bast(struct dlm_ls *ls, struct dlm_message *ms) in receive_bast() argument
4356 error = find_lkb(ls, ms->m_remid, &lkb); in receive_bast()
4378 static void receive_lookup(struct dlm_ls *ls, struct dlm_message *ms) in receive_lookup() argument
4387 error = dlm_master_lookup(ls, from_nodeid, ms->m_extra, len, 0, in receive_lookup()
4392 receive_request(ls, ms); in receive_lookup()
4395 send_lookup_reply(ls, ms, ret_nodeid, error); in receive_lookup()
4398 static void receive_remove(struct dlm_ls *ls, struct dlm_message *ms) in receive_remove() argument
4410 log_error(ls, "receive_remove from %d bad len %d", in receive_remove()
4415 dir_nodeid = dlm_hash2nodeid(ls, ms->m_hash); in receive_remove()
4417 log_error(ls, "receive_remove from %d bad nodeid %d", in receive_remove()
4435 b = hash & (ls->ls_rsbtbl_size - 1); in receive_remove()
4437 spin_lock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4439 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in receive_remove()
4442 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in receive_remove()
4445 log_error(ls, "receive_remove from %d not found %s", in receive_remove()
4447 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4452 log_error(ls, "receive_remove keep from %d master %d", in receive_remove()
4455 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4459 log_debug(ls, "receive_remove from %d master %d first %x %s", in receive_remove()
4462 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4467 log_error(ls, "receive_remove toss from %d master %d", in receive_remove()
4470 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4475 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in receive_remove()
4476 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4479 log_error(ls, "receive_remove from %d rsb ref error", in receive_remove()
4482 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4486 static void receive_purge(struct dlm_ls *ls, struct dlm_message *ms) in receive_purge() argument
4488 do_purge(ls, ms->m_nodeid, ms->m_pid); in receive_purge()
4491 static int receive_request_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_request_reply() argument
4498 error = find_lkb(ls, ms->m_remid, &lkb); in receive_request_reply()
4513 log_error(ls, "receive_request_reply %x remote %d %x result %d", in receive_request_reply()
4558 log_limit(ls, "receive_request_reply %x from %d %d " in receive_request_reply()
4585 log_error(ls, "receive_request_reply %x error %d", in receive_request_reply()
4590 log_debug(ls, "receive_request_reply %x result %d unlock", in receive_request_reply()
4596 log_debug(ls, "receive_request_reply %x cancel", lkb->lkb_id); in receive_request_reply()
4678 static int receive_convert_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_convert_reply() argument
4683 error = find_lkb(ls, ms->m_remid, &lkb); in receive_convert_reply()
4728 static int receive_unlock_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_unlock_reply() argument
4733 error = find_lkb(ls, ms->m_remid, &lkb); in receive_unlock_reply()
4778 static int receive_cancel_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_cancel_reply() argument
4783 error = find_lkb(ls, ms->m_remid, &lkb); in receive_cancel_reply()
4792 static void receive_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_lookup_reply() argument
4799 error = find_lkb(ls, ms->m_lkid, &lkb); in receive_lookup_reply()
4801 log_error(ls, "receive_lookup_reply no lkid %x", ms->m_lkid); in receive_lookup_reply()
4826 log_error(ls, "receive_lookup_reply %x from %d ret %d " in receive_lookup_reply()
4840 log_error(ls, "receive_lookup_reply %x from %d bad ret_nodeid", in receive_lookup_reply()
4852 log_debug(ls, "receive_lookup_reply %x unlock %x", in receive_lookup_reply()
4870 static void _receive_message(struct dlm_ls *ls, struct dlm_message *ms, in _receive_message() argument
4875 if (!dlm_is_member(ls, ms->m_header.h_nodeid)) { in _receive_message()
4876 log_limit(ls, "receive %d from non-member %d %x %x %d", in _receive_message()
4887 error = receive_request(ls, ms); in _receive_message()
4891 error = receive_convert(ls, ms); in _receive_message()
4895 error = receive_unlock(ls, ms); in _receive_message()
4900 error = receive_cancel(ls, ms); in _receive_message()
4906 error = receive_request_reply(ls, ms); in _receive_message()
4910 error = receive_convert_reply(ls, ms); in _receive_message()
4914 error = receive_unlock_reply(ls, ms); in _receive_message()
4918 error = receive_cancel_reply(ls, ms); in _receive_message()
4925 error = receive_grant(ls, ms); in _receive_message()
4930 error = receive_bast(ls, ms); in _receive_message()
4936 receive_lookup(ls, ms); in _receive_message()
4940 receive_remove(ls, ms); in _receive_message()
4946 receive_lookup_reply(ls, ms); in _receive_message()
4952 receive_purge(ls, ms); in _receive_message()
4956 log_error(ls, "unknown message type %d", ms->m_type); in _receive_message()
4971 log_debug(ls, "receive %d no %x remote %d %x saved_seq %u", in _receive_message()
4975 log_error(ls, "receive %d no %x remote %d %x saved_seq %u", in _receive_message()
4980 dlm_dump_rsb_hash(ls, ms->m_hash); in _receive_message()
4984 log_error(ls, "receive %d inval from %d lkid %x remid %x " in _receive_message()
4999 static void dlm_receive_message(struct dlm_ls *ls, struct dlm_message *ms, in dlm_receive_message() argument
5002 if (dlm_locking_stopped(ls)) { in dlm_receive_message()
5006 if (!ls->ls_generation) { in dlm_receive_message()
5007 log_limit(ls, "receive %d from %d ignore old gen", in dlm_receive_message()
5012 dlm_add_requestqueue(ls, nodeid, ms); in dlm_receive_message()
5014 dlm_wait_requestqueue(ls); in dlm_receive_message()
5015 _receive_message(ls, ms, 0); in dlm_receive_message()
5022 void dlm_receive_message_saved(struct dlm_ls *ls, struct dlm_message *ms, in dlm_receive_message_saved() argument
5025 _receive_message(ls, ms, saved_seq); in dlm_receive_message_saved()
5036 struct dlm_ls *ls; in dlm_receive_buffer() local
5059 ls = dlm_find_lockspace_global(hd->h_lockspace); in dlm_receive_buffer()
5060 if (!ls) { in dlm_receive_buffer()
5073 be inactive (in this ls) before transitioning to recovery mode */ in dlm_receive_buffer()
5075 down_read(&ls->ls_recv_active); in dlm_receive_buffer()
5077 dlm_receive_message(ls, &p->message, nodeid); in dlm_receive_buffer()
5079 dlm_receive_rcom(ls, &p->rcom, nodeid); in dlm_receive_buffer()
5080 up_read(&ls->ls_recv_active); in dlm_receive_buffer()
5082 dlm_put_lockspace(ls); in dlm_receive_buffer()
5085 static void recover_convert_waiter(struct dlm_ls *ls, struct dlm_lkb *lkb, in recover_convert_waiter() argument
5113 static int waiter_needs_recovery(struct dlm_ls *ls, struct dlm_lkb *lkb, in waiter_needs_recovery() argument
5116 if (dlm_no_directory(ls)) in waiter_needs_recovery()
5119 if (dlm_is_removed(ls, lkb->lkb_wait_nodeid)) in waiter_needs_recovery()
5131 void dlm_recover_waiters_pre(struct dlm_ls *ls) in dlm_recover_waiters_pre() argument
5142 mutex_lock(&ls->ls_waiters_mutex); in dlm_recover_waiters_pre()
5144 list_for_each_entry_safe(lkb, safe, &ls->ls_waiters, lkb_wait_reply) { in dlm_recover_waiters_pre()
5152 log_debug(ls, "waiter %x remote %x msg %d r_nodeid %d " in dlm_recover_waiters_pre()
5171 if (!waiter_needs_recovery(ls, lkb, dir_nodeid)) in dlm_recover_waiters_pre()
5195 log_debug(ls, "rwpre overlap %x %x %d %d %d", in dlm_recover_waiters_pre()
5207 recover_convert_waiter(ls, lkb, ms_stub); in dlm_recover_waiters_pre()
5233 log_error(ls, "invalid lkb wait_type %d %d", in dlm_recover_waiters_pre()
5238 mutex_unlock(&ls->ls_waiters_mutex); in dlm_recover_waiters_pre()
5242 static struct dlm_lkb *find_resend_waiter(struct dlm_ls *ls) in find_resend_waiter() argument
5247 mutex_lock(&ls->ls_waiters_mutex); in find_resend_waiter()
5248 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in find_resend_waiter()
5255 mutex_unlock(&ls->ls_waiters_mutex); in find_resend_waiter()
5278 int dlm_recover_waiters_post(struct dlm_ls *ls) in dlm_recover_waiters_post() argument
5285 if (dlm_locking_stopped(ls)) { in dlm_recover_waiters_post()
5286 log_debug(ls, "recover_waiters_post aborted"); in dlm_recover_waiters_post()
5291 lkb = find_resend_waiter(ls); in dlm_recover_waiters_post()
5304 log_debug(ls, "waiter %x remote %x msg %d r_nodeid %d " in dlm_recover_waiters_post()
5325 mutex_lock(&ls->ls_waiters_mutex); in dlm_recover_waiters_post()
5327 mutex_unlock(&ls->ls_waiters_mutex); in dlm_recover_waiters_post()
5366 log_error(ls, "waiter %x msg %d r_nodeid %d " in dlm_recover_waiters_post()
5379 static void purge_mstcpy_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_mstcpy_list() argument
5391 if (lkb->lkb_recover_seq == ls->ls_recover_seq) in purge_mstcpy_list()
5398 log_error(ls, "purged mstcpy lkb not released"); in purge_mstcpy_list()
5404 struct dlm_ls *ls = r->res_ls; in dlm_purge_mstcpy_locks() local
5406 purge_mstcpy_list(ls, r, &r->res_grantqueue); in dlm_purge_mstcpy_locks()
5407 purge_mstcpy_list(ls, r, &r->res_convertqueue); in dlm_purge_mstcpy_locks()
5408 purge_mstcpy_list(ls, r, &r->res_waitqueue); in dlm_purge_mstcpy_locks()
5411 static void purge_dead_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_dead_list() argument
5422 dlm_is_removed(ls, lkb->lkb_nodeid)) { in purge_dead_list()
5435 log_error(ls, "purged dead lkb not released"); in purge_dead_list()
5446 void dlm_recover_purge(struct dlm_ls *ls) in dlm_recover_purge() argument
5457 list_for_each_entry(memb, &ls->ls_nodes_gone, list) { in dlm_recover_purge()
5465 down_write(&ls->ls_root_sem); in dlm_recover_purge()
5466 list_for_each_entry(r, &ls->ls_root_list, res_root_list) { in dlm_recover_purge()
5470 purge_dead_list(ls, r, &r->res_grantqueue, in dlm_recover_purge()
5472 purge_dead_list(ls, r, &r->res_convertqueue, in dlm_recover_purge()
5474 purge_dead_list(ls, r, &r->res_waitqueue, in dlm_recover_purge()
5481 up_write(&ls->ls_root_sem); in dlm_recover_purge()
5484 log_rinfo(ls, "dlm_recover_purge %u locks for %u nodes", in dlm_recover_purge()
5488 static struct dlm_rsb *find_grant_rsb(struct dlm_ls *ls, int bucket) in find_grant_rsb() argument
5493 spin_lock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5494 for (n = rb_first(&ls->ls_rsbtbl[bucket].keep); n; n = rb_next(n)) { in find_grant_rsb()
5504 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5507 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5528 void dlm_recover_grant(struct dlm_ls *ls) in dlm_recover_grant() argument
5537 r = find_grant_rsb(ls, bucket); in dlm_recover_grant()
5539 if (bucket == ls->ls_rsbtbl_size - 1) in dlm_recover_grant()
5558 log_rinfo(ls, "dlm_recover_grant %u locks on %u resources", in dlm_recover_grant()
5592 static int receive_rcom_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_rcom_lock_args() argument
5614 if (lvblen > ls->ls_lvblen) in receive_rcom_lock_args()
5616 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_rcom_lock_args()
5643 int dlm_recover_master_copy(struct dlm_ls *ls, struct dlm_rcom *rc) in dlm_recover_master_copy() argument
5667 error = find_rsb(ls, rl->rl_name, le16_to_cpu(rl->rl_namelen), in dlm_recover_master_copy()
5674 if (dlm_no_directory(ls) && (dlm_dir_nodeid(r) != dlm_our_nodeid())) { in dlm_recover_master_copy()
5675 log_error(ls, "dlm_recover_master_copy remote %d %x not dir", in dlm_recover_master_copy()
5687 error = create_lkb(ls, &lkb); in dlm_recover_master_copy()
5691 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5693 __put_lkb(ls, lkb); in dlm_recover_master_copy()
5700 ls->ls_recover_locks_in++; in dlm_recover_master_copy()
5710 lkb->lkb_recover_seq = ls->ls_recover_seq; in dlm_recover_master_copy()
5717 log_rinfo(ls, "dlm_recover_master_copy remote %d %x error %d", in dlm_recover_master_copy()
5724 int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc) in dlm_recover_process_copy() argument
5736 error = find_lkb(ls, lkid, &lkb); in dlm_recover_process_copy()
5738 log_error(ls, "dlm_recover_process_copy no %x remote %d %x %d", in dlm_recover_process_copy()
5748 log_error(ls, "dlm_recover_process_copy bad %x remote %d %x %d", in dlm_recover_process_copy()
5763 log_debug(ls, "dlm_recover_process_copy %x remote %d %x %d", in dlm_recover_process_copy()
5773 log_error(ls, "dlm_recover_process_copy %x remote %d %x %d unk", in dlm_recover_process_copy()
5788 int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, in dlm_user_request() argument
5796 dlm_lock_recovery(ls); in dlm_user_request()
5798 error = create_lkb(ls, &lkb); in dlm_user_request()
5808 __put_lkb(ls, lkb); in dlm_user_request()
5819 __put_lkb(ls, lkb); in dlm_user_request()
5827 error = request_lock(ls, lkb, name, namelen, &args); in dlm_user_request()
5839 __put_lkb(ls, lkb); in dlm_user_request()
5849 dlm_unlock_recovery(ls); in dlm_user_request()
5853 int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_convert() argument
5862 dlm_lock_recovery(ls); in dlm_user_convert()
5864 error = find_lkb(ls, lkid, &lkb); in dlm_user_convert()
5895 error = convert_lock(ls, lkb, &args); in dlm_user_convert()
5902 dlm_unlock_recovery(ls); in dlm_user_convert()
5913 int dlm_user_adopt_orphan(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_adopt_orphan() argument
5923 mutex_lock(&ls->ls_orphans_mutex); in dlm_user_adopt_orphan()
5924 list_for_each_entry(lkb, &ls->ls_orphans, lkb_ownqueue) { in dlm_user_adopt_orphan()
5940 mutex_unlock(&ls->ls_orphans_mutex); in dlm_user_adopt_orphan()
5979 int dlm_user_unlock(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_unlock() argument
5987 dlm_lock_recovery(ls); in dlm_user_unlock()
5989 error = find_lkb(ls, lkid, &lkb); in dlm_user_unlock()
6005 error = unlock_lock(ls, lkb, &args); in dlm_user_unlock()
6023 dlm_unlock_recovery(ls); in dlm_user_unlock()
6028 int dlm_user_cancel(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_cancel() argument
6036 dlm_lock_recovery(ls); in dlm_user_cancel()
6038 error = find_lkb(ls, lkid, &lkb); in dlm_user_cancel()
6051 error = cancel_lock(ls, lkb, &args); in dlm_user_cancel()
6061 dlm_unlock_recovery(ls); in dlm_user_cancel()
6066 int dlm_user_deadlock(struct dlm_ls *ls, uint32_t flags, uint32_t lkid) in dlm_user_deadlock() argument
6074 dlm_lock_recovery(ls); in dlm_user_deadlock()
6076 error = find_lkb(ls, lkid, &lkb); in dlm_user_deadlock()
6110 dlm_unlock_recovery(ls); in dlm_user_deadlock()
6117 static int orphan_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in orphan_proc_lock() argument
6123 mutex_lock(&ls->ls_orphans_mutex); in orphan_proc_lock()
6124 list_add_tail(&lkb->lkb_ownqueue, &ls->ls_orphans); in orphan_proc_lock()
6125 mutex_unlock(&ls->ls_orphans_mutex); in orphan_proc_lock()
6129 error = cancel_lock(ls, lkb, &args); in orphan_proc_lock()
6140 static int unlock_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in unlock_proc_lock() argument
6148 error = unlock_lock(ls, lkb, &args); in unlock_proc_lock()
6158 static struct dlm_lkb *del_proc_lock(struct dlm_ls *ls, in del_proc_lock() argument
6163 mutex_lock(&ls->ls_clear_proc_locks); in del_proc_lock()
6175 mutex_unlock(&ls->ls_clear_proc_locks); in del_proc_lock()
6189 void dlm_clear_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc) in dlm_clear_proc_locks() argument
6193 dlm_lock_recovery(ls); in dlm_clear_proc_locks()
6196 lkb = del_proc_lock(ls, proc); in dlm_clear_proc_locks()
6201 orphan_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6203 unlock_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6212 mutex_lock(&ls->ls_clear_proc_locks); in dlm_clear_proc_locks()
6228 mutex_unlock(&ls->ls_clear_proc_locks); in dlm_clear_proc_locks()
6229 dlm_unlock_recovery(ls); in dlm_clear_proc_locks()
6232 static void purge_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc) in purge_proc_locks() argument
6250 unlock_proc_lock(ls, lkb); in purge_proc_locks()
6274 static void do_purge(struct dlm_ls *ls, int nodeid, int pid) in do_purge() argument
6278 mutex_lock(&ls->ls_orphans_mutex); in do_purge()
6279 list_for_each_entry_safe(lkb, safe, &ls->ls_orphans, lkb_ownqueue) { in do_purge()
6282 unlock_proc_lock(ls, lkb); in do_purge()
6286 mutex_unlock(&ls->ls_orphans_mutex); in do_purge()
6289 static int send_purge(struct dlm_ls *ls, int nodeid, int pid) in send_purge() argument
6295 error = _create_message(ls, sizeof(struct dlm_message), nodeid, in send_purge()
6305 int dlm_user_purge(struct dlm_ls *ls, struct dlm_user_proc *proc, in dlm_user_purge() argument
6311 error = send_purge(ls, nodeid, pid); in dlm_user_purge()
6313 dlm_lock_recovery(ls); in dlm_user_purge()
6315 purge_proc_locks(ls, proc); in dlm_user_purge()
6317 do_purge(ls, nodeid, pid); in dlm_user_purge()
6318 dlm_unlock_recovery(ls); in dlm_user_purge()