• Home
  • Raw
  • Download

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(iter, &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()
2889 static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in validate_lock_args() argument
2926 log_debug(ls, "validate_lock_args %d %x %x %x %d %d %s", in validate_lock_args()
2942 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in validate_unlock_args() local
2946 log_error(ls, "unlock on MSTCPY %x", lkb->lkb_id); in validate_unlock_args()
2956 log_debug(ls, "unlock on ENDOFLIFE %x", lkb->lkb_id); in validate_unlock_args()
2966 log_debug(ls, "unlock on rsb_lookup %x", lkb->lkb_id); in validate_unlock_args()
3063 log_debug(ls, "validate_unlock_args %d %x %x %x %x %d %s", rv, in validate_unlock_args()
3317 static int request_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, char *name, in request_lock() argument
3323 error = validate_lock_args(ls, lkb, args); in request_lock()
3327 error = find_rsb(ls, name, len, 0, R_REQUEST, &r); in request_lock()
3343 static int convert_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in convert_lock() argument
3354 error = validate_lock_args(ls, lkb, args); in convert_lock()
3365 static int unlock_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in unlock_lock() argument
3387 static int cancel_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in cancel_lock() argument
3424 struct dlm_ls *ls; in dlm_lock() local
3429 ls = dlm_find_lockspace_local(lockspace); in dlm_lock()
3430 if (!ls) in dlm_lock()
3433 dlm_lock_recovery(ls); in dlm_lock()
3436 error = find_lkb(ls, lksb->sb_lkid, &lkb); in dlm_lock()
3438 error = create_lkb(ls, &lkb); in dlm_lock()
3449 error = convert_lock(ls, lkb, &args); in dlm_lock()
3451 error = request_lock(ls, lkb, name, namelen, &args); in dlm_lock()
3457 __put_lkb(ls, lkb); in dlm_lock()
3461 dlm_unlock_recovery(ls); in dlm_lock()
3462 dlm_put_lockspace(ls); in dlm_lock()
3472 struct dlm_ls *ls; in dlm_unlock() local
3477 ls = dlm_find_lockspace_local(lockspace); in dlm_unlock()
3478 if (!ls) in dlm_unlock()
3481 dlm_lock_recovery(ls); in dlm_unlock()
3483 error = find_lkb(ls, lkid, &lkb); in dlm_unlock()
3492 error = cancel_lock(ls, lkb, &args); in dlm_unlock()
3494 error = unlock_lock(ls, lkb, &args); in dlm_unlock()
3503 dlm_unlock_recovery(ls); in dlm_unlock()
3504 dlm_put_lockspace(ls); in dlm_unlock()
3530 static int _create_message(struct dlm_ls *ls, int mb_len, in _create_message() argument
3552 ms->m_header.h_lockspace = ls->ls_global_id; in _create_message()
3842 static int send_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms_in, in send_lookup_reply() argument
3845 struct dlm_rsb *r = &ls->ls_stub_rsb; in send_lookup_reply()
3890 static int receive_lvb(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_lvb() argument
3897 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_lvb()
3901 if (len > ls->ls_lvblen) in receive_lvb()
3902 len = ls->ls_lvblen; in receive_lvb()
3918 static int receive_request_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_request_args() argument
3932 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_request_args()
3940 static int receive_convert_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_convert_args() argument
3946 if (receive_lvb(ls, lkb, ms)) in receive_convert_args()
3955 static int receive_unlock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_unlock_args() argument
3958 if (receive_lvb(ls, lkb, ms)) in receive_unlock_args()
3966 static void setup_stub_lkb(struct dlm_ls *ls, struct dlm_message *ms) in setup_stub_lkb() argument
3968 struct dlm_lkb *lkb = &ls->ls_stub_lkb; in setup_stub_lkb()
4026 static void send_repeat_remove(struct dlm_ls *ls, char *ms_name, int len) in send_repeat_remove() argument
4039 b = hash & (ls->ls_rsbtbl_size - 1); in send_repeat_remove()
4041 dir_nodeid = dlm_hash2nodeid(ls, hash); in send_repeat_remove()
4043 log_error(ls, "send_repeat_remove dir %d %s", dir_nodeid, name); in send_repeat_remove()
4045 spin_lock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4046 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in send_repeat_remove()
4048 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4049 log_error(ls, "repeat_remove on keep %s", name); in send_repeat_remove()
4053 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in send_repeat_remove()
4055 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4056 log_error(ls, "repeat_remove on toss %s", name); in send_repeat_remove()
4060 /* use ls->remove_name2 to avoid conflict with shrink? */ in send_repeat_remove()
4062 spin_lock(&ls->ls_remove_spin); in send_repeat_remove()
4063 ls->ls_remove_len = len; in send_repeat_remove()
4064 memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN); in send_repeat_remove()
4065 spin_unlock(&ls->ls_remove_spin); in send_repeat_remove()
4066 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4068 rv = _create_message(ls, sizeof(struct dlm_message) + len, in send_repeat_remove()
4079 spin_lock(&ls->ls_remove_spin); in send_repeat_remove()
4080 ls->ls_remove_len = 0; in send_repeat_remove()
4081 memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN); in send_repeat_remove()
4082 spin_unlock(&ls->ls_remove_spin); in send_repeat_remove()
4085 static int receive_request(struct dlm_ls *ls, struct dlm_message *ms) in receive_request() argument
4094 error = create_lkb(ls, &lkb); in receive_request()
4100 error = receive_request_args(ls, lkb, ms); in receive_request()
4102 __put_lkb(ls, lkb); in receive_request()
4114 error = find_rsb(ls, ms->m_extra, namelen, from_nodeid, in receive_request()
4117 __put_lkb(ls, lkb); in receive_request()
4124 error = validate_master_nodeid(ls, r, from_nodeid); in receive_request()
4128 __put_lkb(ls, lkb); in receive_request()
4164 log_limit(ls, "receive_request %x from %d %d", in receive_request()
4169 send_repeat_remove(ls, ms->m_extra, namelen); in receive_request()
4173 setup_stub_lkb(ls, ms); in receive_request()
4174 send_request_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_request()
4178 static int receive_convert(struct dlm_ls *ls, struct dlm_message *ms) in receive_convert() argument
4184 error = find_lkb(ls, ms->m_remid, &lkb); in receive_convert()
4189 log_error(ls, "receive_convert %x remid %x recover_seq %llu " in receive_convert()
4209 error = receive_convert_args(ls, lkb, ms); in receive_convert()
4228 setup_stub_lkb(ls, ms); in receive_convert()
4229 send_convert_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_convert()
4233 static int receive_unlock(struct dlm_ls *ls, struct dlm_message *ms) in receive_unlock() argument
4239 error = find_lkb(ls, ms->m_remid, &lkb); in receive_unlock()
4244 log_error(ls, "receive_unlock %x remid %x remote %d %x", in receive_unlock()
4263 error = receive_unlock_args(ls, lkb, ms); in receive_unlock()
4279 setup_stub_lkb(ls, ms); in receive_unlock()
4280 send_unlock_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_unlock()
4284 static int receive_cancel(struct dlm_ls *ls, struct dlm_message *ms) in receive_cancel() argument
4290 error = find_lkb(ls, ms->m_remid, &lkb); in receive_cancel()
4315 setup_stub_lkb(ls, ms); in receive_cancel()
4316 send_cancel_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_cancel()
4320 static int receive_grant(struct dlm_ls *ls, struct dlm_message *ms) in receive_grant() argument
4326 error = find_lkb(ls, ms->m_remid, &lkb); in receive_grant()
4351 static int receive_bast(struct dlm_ls *ls, struct dlm_message *ms) in receive_bast() argument
4357 error = find_lkb(ls, ms->m_remid, &lkb); in receive_bast()
4379 static void receive_lookup(struct dlm_ls *ls, struct dlm_message *ms) in receive_lookup() argument
4388 error = dlm_master_lookup(ls, from_nodeid, ms->m_extra, len, 0, in receive_lookup()
4393 receive_request(ls, ms); in receive_lookup()
4396 send_lookup_reply(ls, ms, ret_nodeid, error); in receive_lookup()
4399 static void receive_remove(struct dlm_ls *ls, struct dlm_message *ms) in receive_remove() argument
4411 log_error(ls, "receive_remove from %d bad len %d", in receive_remove()
4416 dir_nodeid = dlm_hash2nodeid(ls, ms->m_hash); in receive_remove()
4418 log_error(ls, "receive_remove from %d bad nodeid %d", in receive_remove()
4436 b = hash & (ls->ls_rsbtbl_size - 1); in receive_remove()
4438 spin_lock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4440 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in receive_remove()
4443 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in receive_remove()
4446 log_error(ls, "receive_remove from %d not found %s", in receive_remove()
4448 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4453 log_error(ls, "receive_remove keep from %d master %d", in receive_remove()
4456 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4460 log_debug(ls, "receive_remove from %d master %d first %x %s", in receive_remove()
4463 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4468 log_error(ls, "receive_remove toss from %d master %d", in receive_remove()
4471 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4476 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in receive_remove()
4477 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4480 log_error(ls, "receive_remove from %d rsb ref error", in receive_remove()
4483 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4487 static void receive_purge(struct dlm_ls *ls, struct dlm_message *ms) in receive_purge() argument
4489 do_purge(ls, ms->m_nodeid, ms->m_pid); in receive_purge()
4492 static int receive_request_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_request_reply() argument
4499 error = find_lkb(ls, ms->m_remid, &lkb); in receive_request_reply()
4514 log_error(ls, "receive_request_reply %x remote %d %x result %d", in receive_request_reply()
4559 log_limit(ls, "receive_request_reply %x from %d %d " in receive_request_reply()
4586 log_error(ls, "receive_request_reply %x error %d", in receive_request_reply()
4591 log_debug(ls, "receive_request_reply %x result %d unlock", in receive_request_reply()
4597 log_debug(ls, "receive_request_reply %x cancel", lkb->lkb_id); in receive_request_reply()
4679 static int receive_convert_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_convert_reply() argument
4684 error = find_lkb(ls, ms->m_remid, &lkb); in receive_convert_reply()
4729 static int receive_unlock_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_unlock_reply() argument
4734 error = find_lkb(ls, ms->m_remid, &lkb); in receive_unlock_reply()
4779 static int receive_cancel_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_cancel_reply() argument
4784 error = find_lkb(ls, ms->m_remid, &lkb); in receive_cancel_reply()
4793 static void receive_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms) in receive_lookup_reply() argument
4800 error = find_lkb(ls, ms->m_lkid, &lkb); in receive_lookup_reply()
4802 log_error(ls, "receive_lookup_reply no lkid %x", ms->m_lkid); in receive_lookup_reply()
4827 log_error(ls, "receive_lookup_reply %x from %d ret %d " in receive_lookup_reply()
4841 log_error(ls, "receive_lookup_reply %x from %d bad ret_nodeid", in receive_lookup_reply()
4853 log_debug(ls, "receive_lookup_reply %x unlock %x", in receive_lookup_reply()
4871 static void _receive_message(struct dlm_ls *ls, struct dlm_message *ms, in _receive_message() argument
4876 if (!dlm_is_member(ls, ms->m_header.h_nodeid)) { in _receive_message()
4877 log_limit(ls, "receive %d from non-member %d %x %x %d", in _receive_message()
4888 error = receive_request(ls, ms); in _receive_message()
4892 error = receive_convert(ls, ms); in _receive_message()
4896 error = receive_unlock(ls, ms); in _receive_message()
4901 error = receive_cancel(ls, ms); in _receive_message()
4907 error = receive_request_reply(ls, ms); in _receive_message()
4911 error = receive_convert_reply(ls, ms); in _receive_message()
4915 error = receive_unlock_reply(ls, ms); in _receive_message()
4919 error = receive_cancel_reply(ls, ms); in _receive_message()
4926 error = receive_grant(ls, ms); in _receive_message()
4931 error = receive_bast(ls, ms); in _receive_message()
4937 receive_lookup(ls, ms); in _receive_message()
4941 receive_remove(ls, ms); in _receive_message()
4947 receive_lookup_reply(ls, ms); in _receive_message()
4953 receive_purge(ls, ms); in _receive_message()
4957 log_error(ls, "unknown message type %d", ms->m_type); in _receive_message()
4972 log_debug(ls, "receive %d no %x remote %d %x saved_seq %u", in _receive_message()
4976 log_error(ls, "receive %d no %x remote %d %x saved_seq %u", in _receive_message()
4981 dlm_dump_rsb_hash(ls, ms->m_hash); in _receive_message()
4985 log_error(ls, "receive %d inval from %d lkid %x remid %x " in _receive_message()
5000 static void dlm_receive_message(struct dlm_ls *ls, struct dlm_message *ms, in dlm_receive_message() argument
5003 if (dlm_locking_stopped(ls)) { in dlm_receive_message()
5007 if (!ls->ls_generation) { in dlm_receive_message()
5008 log_limit(ls, "receive %d from %d ignore old gen", in dlm_receive_message()
5013 dlm_add_requestqueue(ls, nodeid, ms); in dlm_receive_message()
5015 dlm_wait_requestqueue(ls); in dlm_receive_message()
5016 _receive_message(ls, ms, 0); in dlm_receive_message()
5023 void dlm_receive_message_saved(struct dlm_ls *ls, struct dlm_message *ms, in dlm_receive_message_saved() argument
5026 _receive_message(ls, ms, saved_seq); in dlm_receive_message_saved()
5037 struct dlm_ls *ls; in dlm_receive_buffer() local
5060 ls = dlm_find_lockspace_global(hd->h_lockspace); in dlm_receive_buffer()
5061 if (!ls) { in dlm_receive_buffer()
5074 be inactive (in this ls) before transitioning to recovery mode */ in dlm_receive_buffer()
5076 down_read(&ls->ls_recv_active); in dlm_receive_buffer()
5078 dlm_receive_message(ls, &p->message, nodeid); in dlm_receive_buffer()
5080 dlm_receive_rcom(ls, &p->rcom, nodeid); in dlm_receive_buffer()
5081 up_read(&ls->ls_recv_active); in dlm_receive_buffer()
5083 dlm_put_lockspace(ls); in dlm_receive_buffer()
5086 static void recover_convert_waiter(struct dlm_ls *ls, struct dlm_lkb *lkb, in recover_convert_waiter() argument
5114 static int waiter_needs_recovery(struct dlm_ls *ls, struct dlm_lkb *lkb, in waiter_needs_recovery() argument
5117 if (dlm_no_directory(ls)) in waiter_needs_recovery()
5120 if (dlm_is_removed(ls, lkb->lkb_wait_nodeid)) in waiter_needs_recovery()
5132 void dlm_recover_waiters_pre(struct dlm_ls *ls) in dlm_recover_waiters_pre() argument
5143 mutex_lock(&ls->ls_waiters_mutex); in dlm_recover_waiters_pre()
5145 list_for_each_entry_safe(lkb, safe, &ls->ls_waiters, lkb_wait_reply) { in dlm_recover_waiters_pre()
5153 log_debug(ls, "waiter %x remote %x msg %d r_nodeid %d " in dlm_recover_waiters_pre()
5172 if (!waiter_needs_recovery(ls, lkb, dir_nodeid)) in dlm_recover_waiters_pre()
5196 log_debug(ls, "rwpre overlap %x %x %d %d %d", in dlm_recover_waiters_pre()
5208 recover_convert_waiter(ls, lkb, ms_stub); in dlm_recover_waiters_pre()
5234 log_error(ls, "invalid lkb wait_type %d %d", in dlm_recover_waiters_pre()
5239 mutex_unlock(&ls->ls_waiters_mutex); in dlm_recover_waiters_pre()
5243 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(iter, &ls->ls_waiters, lkb_wait_reply) { in find_resend_waiter()
5255 mutex_unlock(&ls->ls_waiters_mutex); in find_resend_waiter()
5276 int dlm_recover_waiters_post(struct dlm_ls *ls) in dlm_recover_waiters_post() argument
5283 if (dlm_locking_stopped(ls)) { in dlm_recover_waiters_post()
5284 log_debug(ls, "recover_waiters_post aborted"); in dlm_recover_waiters_post()
5289 lkb = find_resend_waiter(ls); in dlm_recover_waiters_post()
5302 log_debug(ls, "waiter %x remote %x msg %d r_nodeid %d " in dlm_recover_waiters_post()
5323 mutex_lock(&ls->ls_waiters_mutex); in dlm_recover_waiters_post()
5325 mutex_unlock(&ls->ls_waiters_mutex); in dlm_recover_waiters_post()
5364 log_error(ls, "waiter %x msg %d r_nodeid %d " in dlm_recover_waiters_post()
5377 static void purge_mstcpy_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_mstcpy_list() argument
5389 if (lkb->lkb_recover_seq == ls->ls_recover_seq) in purge_mstcpy_list()
5396 log_error(ls, "purged mstcpy lkb not released"); in purge_mstcpy_list()
5402 struct dlm_ls *ls = r->res_ls; in dlm_purge_mstcpy_locks() local
5404 purge_mstcpy_list(ls, r, &r->res_grantqueue); in dlm_purge_mstcpy_locks()
5405 purge_mstcpy_list(ls, r, &r->res_convertqueue); in dlm_purge_mstcpy_locks()
5406 purge_mstcpy_list(ls, r, &r->res_waitqueue); in dlm_purge_mstcpy_locks()
5409 static void purge_dead_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_dead_list() argument
5420 dlm_is_removed(ls, lkb->lkb_nodeid)) { in purge_dead_list()
5433 log_error(ls, "purged dead lkb not released"); in purge_dead_list()
5444 void dlm_recover_purge(struct dlm_ls *ls) in dlm_recover_purge() argument
5455 list_for_each_entry(memb, &ls->ls_nodes_gone, list) { in dlm_recover_purge()
5463 down_write(&ls->ls_root_sem); in dlm_recover_purge()
5464 list_for_each_entry(r, &ls->ls_root_list, res_root_list) { in dlm_recover_purge()
5468 purge_dead_list(ls, r, &r->res_grantqueue, in dlm_recover_purge()
5470 purge_dead_list(ls, r, &r->res_convertqueue, in dlm_recover_purge()
5472 purge_dead_list(ls, r, &r->res_waitqueue, in dlm_recover_purge()
5479 up_write(&ls->ls_root_sem); in dlm_recover_purge()
5482 log_rinfo(ls, "dlm_recover_purge %u locks for %u nodes", in dlm_recover_purge()
5486 static struct dlm_rsb *find_grant_rsb(struct dlm_ls *ls, int bucket) in find_grant_rsb() argument
5491 spin_lock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5492 for (n = rb_first(&ls->ls_rsbtbl[bucket].keep); n; n = rb_next(n)) { in find_grant_rsb()
5502 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5505 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5526 void dlm_recover_grant(struct dlm_ls *ls) in dlm_recover_grant() argument
5535 r = find_grant_rsb(ls, bucket); in dlm_recover_grant()
5537 if (bucket == ls->ls_rsbtbl_size - 1) in dlm_recover_grant()
5556 log_rinfo(ls, "dlm_recover_grant %u locks on %u resources", in dlm_recover_grant()
5590 static int receive_rcom_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_rcom_lock_args() argument
5612 if (lvblen > ls->ls_lvblen) in receive_rcom_lock_args()
5614 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_rcom_lock_args()
5641 int dlm_recover_master_copy(struct dlm_ls *ls, struct dlm_rcom *rc) in dlm_recover_master_copy() argument
5665 error = find_rsb(ls, rl->rl_name, le16_to_cpu(rl->rl_namelen), in dlm_recover_master_copy()
5672 if (dlm_no_directory(ls) && (dlm_dir_nodeid(r) != dlm_our_nodeid())) { in dlm_recover_master_copy()
5673 log_error(ls, "dlm_recover_master_copy remote %d %x not dir", in dlm_recover_master_copy()
5685 error = create_lkb(ls, &lkb); in dlm_recover_master_copy()
5689 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5691 __put_lkb(ls, lkb); in dlm_recover_master_copy()
5698 ls->ls_recover_locks_in++; in dlm_recover_master_copy()
5708 lkb->lkb_recover_seq = ls->ls_recover_seq; in dlm_recover_master_copy()
5715 log_rinfo(ls, "dlm_recover_master_copy remote %d %x error %d", in dlm_recover_master_copy()
5722 int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc) in dlm_recover_process_copy() argument
5734 error = find_lkb(ls, lkid, &lkb); in dlm_recover_process_copy()
5736 log_error(ls, "dlm_recover_process_copy no %x remote %d %x %d", in dlm_recover_process_copy()
5746 log_error(ls, "dlm_recover_process_copy bad %x remote %d %x %d", in dlm_recover_process_copy()
5761 log_debug(ls, "dlm_recover_process_copy %x remote %d %x %d", in dlm_recover_process_copy()
5771 log_error(ls, "dlm_recover_process_copy %x remote %d %x %d unk", in dlm_recover_process_copy()
5786 int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, in dlm_user_request() argument
5794 dlm_lock_recovery(ls); in dlm_user_request()
5796 error = create_lkb(ls, &lkb); in dlm_user_request()
5806 __put_lkb(ls, lkb); in dlm_user_request()
5817 __put_lkb(ls, lkb); in dlm_user_request()
5825 error = request_lock(ls, lkb, name, namelen, &args); in dlm_user_request()
5837 __put_lkb(ls, lkb); in dlm_user_request()
5847 dlm_unlock_recovery(ls); in dlm_user_request()
5851 int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_convert() argument
5860 dlm_lock_recovery(ls); in dlm_user_convert()
5862 error = find_lkb(ls, lkid, &lkb); in dlm_user_convert()
5893 error = convert_lock(ls, lkb, &args); in dlm_user_convert()
5900 dlm_unlock_recovery(ls); in dlm_user_convert()
5911 int dlm_user_adopt_orphan(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_adopt_orphan() argument
5920 mutex_lock(&ls->ls_orphans_mutex); in dlm_user_adopt_orphan()
5921 list_for_each_entry(iter, &ls->ls_orphans, lkb_ownqueue) { in dlm_user_adopt_orphan()
5937 mutex_unlock(&ls->ls_orphans_mutex); in dlm_user_adopt_orphan()
5976 int dlm_user_unlock(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_unlock() argument
5984 dlm_lock_recovery(ls); in dlm_user_unlock()
5986 error = find_lkb(ls, lkid, &lkb); in dlm_user_unlock()
6002 error = unlock_lock(ls, lkb, &args); in dlm_user_unlock()
6020 dlm_unlock_recovery(ls); in dlm_user_unlock()
6025 int dlm_user_cancel(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, in dlm_user_cancel() argument
6033 dlm_lock_recovery(ls); in dlm_user_cancel()
6035 error = find_lkb(ls, lkid, &lkb); in dlm_user_cancel()
6048 error = cancel_lock(ls, lkb, &args); in dlm_user_cancel()
6058 dlm_unlock_recovery(ls); in dlm_user_cancel()
6063 int dlm_user_deadlock(struct dlm_ls *ls, uint32_t flags, uint32_t lkid) in dlm_user_deadlock() argument
6071 dlm_lock_recovery(ls); in dlm_user_deadlock()
6073 error = find_lkb(ls, lkid, &lkb); in dlm_user_deadlock()
6107 dlm_unlock_recovery(ls); in dlm_user_deadlock()
6114 static int orphan_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in orphan_proc_lock() argument
6120 mutex_lock(&ls->ls_orphans_mutex); in orphan_proc_lock()
6121 list_add_tail(&lkb->lkb_ownqueue, &ls->ls_orphans); in orphan_proc_lock()
6122 mutex_unlock(&ls->ls_orphans_mutex); in orphan_proc_lock()
6126 error = cancel_lock(ls, lkb, &args); in orphan_proc_lock()
6137 static int unlock_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in unlock_proc_lock() argument
6145 error = unlock_lock(ls, lkb, &args); in unlock_proc_lock()
6155 static struct dlm_lkb *del_proc_lock(struct dlm_ls *ls, in del_proc_lock() argument
6160 mutex_lock(&ls->ls_clear_proc_locks); in del_proc_lock()
6172 mutex_unlock(&ls->ls_clear_proc_locks); in del_proc_lock()
6186 void dlm_clear_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc) in dlm_clear_proc_locks() argument
6190 dlm_lock_recovery(ls); in dlm_clear_proc_locks()
6193 lkb = del_proc_lock(ls, proc); in dlm_clear_proc_locks()
6198 orphan_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6200 unlock_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6209 mutex_lock(&ls->ls_clear_proc_locks); in dlm_clear_proc_locks()
6225 mutex_unlock(&ls->ls_clear_proc_locks); in dlm_clear_proc_locks()
6226 dlm_unlock_recovery(ls); in dlm_clear_proc_locks()
6229 static void purge_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc) in purge_proc_locks() argument
6247 unlock_proc_lock(ls, lkb); in purge_proc_locks()
6271 static void do_purge(struct dlm_ls *ls, int nodeid, int pid) in do_purge() argument
6275 mutex_lock(&ls->ls_orphans_mutex); in do_purge()
6276 list_for_each_entry_safe(lkb, safe, &ls->ls_orphans, lkb_ownqueue) { in do_purge()
6279 unlock_proc_lock(ls, lkb); in do_purge()
6283 mutex_unlock(&ls->ls_orphans_mutex); in do_purge()
6286 static int send_purge(struct dlm_ls *ls, int nodeid, int pid) in send_purge() argument
6292 error = _create_message(ls, sizeof(struct dlm_message), nodeid, in send_purge()
6302 int dlm_user_purge(struct dlm_ls *ls, struct dlm_user_proc *proc, in dlm_user_purge() argument
6308 error = send_purge(ls, nodeid, pid); in dlm_user_purge()
6310 dlm_lock_recovery(ls); in dlm_user_purge()
6312 purge_proc_locks(ls, proc); in dlm_user_purge()
6314 do_purge(ls, nodeid, pid); in dlm_user_purge()
6315 dlm_unlock_recovery(ls); in dlm_user_purge()