Lines Matching full:r
21 _request_lock(r, lkb)
22 _convert_lock(r, lkb)
23 _unlock_lock(r, lkb)
24 _cancel_lock(r, lkb)
26 do_request(r, lkb)
27 do_convert(r, lkb)
28 do_unlock(r, lkb)
29 do_cancel(r, lkb)
50 calls on local (L) and remote (R) nodes:
52 L: send_xxxx() -> R: receive_xxxx()
53 R: do_xxxx()
54 L: receive_xxxx_reply() <- R: send_xxxx_reply()
78 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb);
79 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb);
80 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb);
81 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb);
82 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb);
83 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode);
84 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb);
85 static int send_remove(struct dlm_rsb *r);
86 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
87 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
88 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
171 static void dlm_print_rsb(struct dlm_rsb *r) in dlm_print_rsb() argument
175 r->res_nodeid, r->res_master_nodeid, r->res_dir_nodeid, in dlm_print_rsb()
176 r->res_flags, r->res_first_lkid, r->res_recover_locks_count, in dlm_print_rsb()
177 r->res_name); in dlm_print_rsb()
180 void dlm_dump_rsb(struct dlm_rsb *r) in dlm_dump_rsb() argument
184 dlm_print_rsb(r); in dlm_dump_rsb()
187 list_empty(&r->res_root_list), list_empty(&r->res_recover_list)); in dlm_dump_rsb()
189 list_for_each_entry(lkb, &r->res_lookup, lkb_rsb_lookup) in dlm_dump_rsb()
192 list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) in dlm_dump_rsb()
195 list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) in dlm_dump_rsb()
198 list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) in dlm_dump_rsb()
244 static inline int is_remote(struct dlm_rsb *r) in is_remote() argument
246 DLM_ASSERT(r->res_nodeid >= 0, dlm_print_rsb(r);); in is_remote()
247 return !!r->res_nodeid; in is_remote()
290 static void queue_cast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in queue_cast() argument
304 static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) in queue_cast_overlap() argument
306 queue_cast(r, lkb, in queue_cast_overlap()
310 static void queue_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rqmode) in queue_bast() argument
313 send_bast(r, lkb, rqmode); in queue_bast()
331 static inline void hold_rsb(struct dlm_rsb *r) in hold_rsb() argument
334 WARN_ON(rsb_flag(r, RSB_INACTIVE)); in hold_rsb()
335 kref_get(&r->res_ref); in hold_rsb()
338 void dlm_hold_rsb(struct dlm_rsb *r) in dlm_hold_rsb() argument
340 hold_rsb(r); in dlm_hold_rsb()
345 dlm_refcount_dec_and_write_lock_bh(refcount_t *r, rwlock_t *lock) in dlm_refcount_dec_and_write_lock_bh() argument
348 if (refcount_dec_not_one(r)) in dlm_refcount_dec_and_write_lock_bh()
352 if (!refcount_dec_and_test(r)) { in dlm_refcount_dec_and_write_lock_bh()
373 static void put_rsb(struct dlm_rsb *r) in put_rsb() argument
375 struct dlm_ls *ls = r->res_ls; in put_rsb()
378 rv = dlm_kref_put_write_lock_bh(&r->res_ref, deactivate_rsb, in put_rsb()
384 void dlm_put_rsb(struct dlm_rsb *r) in dlm_put_rsb() argument
386 put_rsb(r); in dlm_put_rsb()
407 struct dlm_rsb *r; in resume_scan_timer() local
410 r = list_first_entry_or_null(&ls->ls_scan_list, struct dlm_rsb, in resume_scan_timer()
412 if (r && !timer_pending(&ls->ls_scan_timer)) in resume_scan_timer()
413 enable_scan_timer(ls, r->res_toss_time); in resume_scan_timer()
419 static void del_scan(struct dlm_ls *ls, struct dlm_rsb *r) in del_scan() argument
424 WARN_ON(!rsb_flag(r, RSB_INACTIVE)); in del_scan()
427 r->res_toss_time = 0; in del_scan()
430 if (list_empty(&r->res_scan_list)) in del_scan()
436 list_del_init(&r->res_scan_list); in del_scan()
438 if (first == r) { in del_scan()
458 static void add_scan(struct dlm_ls *ls, struct dlm_rsb *r) in add_scan() argument
465 (r->res_master_nodeid != our_nodeid) && in add_scan()
466 (dlm_dir_nodeid(r) == our_nodeid)); in add_scan()
469 WARN_ON(!rsb_flag(r, RSB_INACTIVE)); in add_scan()
472 WARN_ON(!list_empty(&r->res_scan_list)); in add_scan()
476 r->res_toss_time = rsb_toss_jiffies(); in add_scan()
481 list_add_tail(&r->res_scan_list, &ls->ls_scan_list); in add_scan()
482 enable_scan_timer(ls, r->res_toss_time); in add_scan()
492 list_add_tail(&r->res_scan_list, &ls->ls_scan_list); in add_scan()
494 enable_scan_timer(ls, r->res_toss_time); in add_scan()
514 struct dlm_rsb *r; in dlm_rsb_scan() local
532 r = list_first_entry_or_null(&ls->ls_scan_list, struct dlm_rsb, in dlm_rsb_scan()
534 if (!r) { in dlm_rsb_scan()
544 if (time_before(jiffies, r->res_toss_time)) { in dlm_rsb_scan()
546 enable_scan_timer(ls, r->res_toss_time); in dlm_rsb_scan()
563 list_del(&r->res_slow_list); in dlm_rsb_scan()
564 rhashtable_remove_fast(&ls->ls_rsbtbl, &r->res_node, in dlm_rsb_scan()
566 rsb_clear_flag(r, RSB_HASHED); in dlm_rsb_scan()
571 list_del_init(&r->res_scan_list); in dlm_rsb_scan()
578 (r->res_master_nodeid != our_nodeid) && in dlm_rsb_scan()
579 (dlm_dir_nodeid(r) == our_nodeid)); in dlm_rsb_scan()
586 (r->res_master_nodeid == our_nodeid) && in dlm_rsb_scan()
587 (dlm_dir_nodeid(r) != our_nodeid)) in dlm_rsb_scan()
588 send_remove(r); in dlm_rsb_scan()
590 free_inactive_rsb(r); in dlm_rsb_scan()
601 struct dlm_rsb *r; in get_rsb_struct() local
603 r = dlm_allocate_rsb(); in get_rsb_struct()
604 if (!r) in get_rsb_struct()
607 r->res_ls = ls; in get_rsb_struct()
608 r->res_length = len; in get_rsb_struct()
609 memcpy(r->res_name, name, len); in get_rsb_struct()
610 spin_lock_init(&r->res_lock); in get_rsb_struct()
612 INIT_LIST_HEAD(&r->res_lookup); in get_rsb_struct()
613 INIT_LIST_HEAD(&r->res_grantqueue); in get_rsb_struct()
614 INIT_LIST_HEAD(&r->res_convertqueue); in get_rsb_struct()
615 INIT_LIST_HEAD(&r->res_waitqueue); in get_rsb_struct()
616 INIT_LIST_HEAD(&r->res_root_list); in get_rsb_struct()
617 INIT_LIST_HEAD(&r->res_scan_list); in get_rsb_struct()
618 INIT_LIST_HEAD(&r->res_recover_list); in get_rsb_struct()
619 INIT_LIST_HEAD(&r->res_masters_list); in get_rsb_struct()
621 *r_ret = r; in get_rsb_struct()
699 struct dlm_rsb *r = NULL; in find_rsb_dir() local
737 error = dlm_search_rsb_tree(&ls->ls_rsbtbl, name, len, &r); in find_rsb_dir()
743 if (!rsb_flag(r, RSB_HASHED)) { in find_rsb_dir()
753 if (rsb_flag(r, RSB_INACTIVE)) { in find_rsb_dir()
758 kref_get(&r->res_ref); in find_rsb_dir()
782 if (rsb_flag(r, RSB_HASHED)) { in find_rsb_dir()
783 if (!rsb_flag(r, RSB_INACTIVE)) { in find_rsb_dir()
800 if ((r->res_master_nodeid != our_nodeid) && from_other) { in find_rsb_dir()
804 from_nodeid, r->res_master_nodeid, dir_nodeid, in find_rsb_dir()
805 r->res_name); in find_rsb_dir()
811 if ((r->res_master_nodeid != our_nodeid) && from_dir) { in find_rsb_dir()
814 from_nodeid, r->res_master_nodeid); in find_rsb_dir()
815 dlm_print_rsb(r); in find_rsb_dir()
817 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
818 r->res_nodeid = 0; in find_rsb_dir()
819 rsb_clear_flag(r, RSB_MASTER_UNCERTAIN); in find_rsb_dir()
820 r->res_first_lkid = 0; in find_rsb_dir()
823 if (from_local && (r->res_master_nodeid != our_nodeid)) { in find_rsb_dir()
826 rsb_set_flag(r, RSB_MASTER_UNCERTAIN); in find_rsb_dir()
827 r->res_first_lkid = 0; in find_rsb_dir()
835 del_scan(ls, r); in find_rsb_dir()
836 list_move(&r->res_slow_list, &ls->ls_slow_active); in find_rsb_dir()
837 rsb_clear_flag(r, RSB_INACTIVE); in find_rsb_dir()
838 kref_init(&r->res_ref); /* ref is now used in active state */ in find_rsb_dir()
852 error = get_rsb_struct(ls, name, len, &r); in find_rsb_dir()
856 r->res_hash = hash; in find_rsb_dir()
857 r->res_dir_nodeid = dir_nodeid; in find_rsb_dir()
858 kref_init(&r->res_ref); in find_rsb_dir()
863 from_nodeid, r->res_name); in find_rsb_dir()
864 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
865 r->res_nodeid = 0; in find_rsb_dir()
872 from_nodeid, dir_nodeid, our_nodeid, r->res_name); in find_rsb_dir()
873 dlm_free_rsb(r); in find_rsb_dir()
874 r = NULL; in find_rsb_dir()
881 from_nodeid, dir_nodeid, r->res_name); in find_rsb_dir()
887 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
888 r->res_nodeid = 0; in find_rsb_dir()
891 r->res_master_nodeid = 0; in find_rsb_dir()
892 r->res_nodeid = -1; in find_rsb_dir()
898 error = rsb_insert(r, &ls->ls_rsbtbl); in find_rsb_dir()
904 dlm_free_rsb(r); in find_rsb_dir()
907 list_add(&r->res_slow_list, &ls->ls_slow_active); in find_rsb_dir()
911 *r_ret = r; in find_rsb_dir()
923 struct dlm_rsb *r = NULL; in find_rsb_nodir() local
929 error = dlm_search_rsb_tree(&ls->ls_rsbtbl, name, len, &r); in find_rsb_nodir()
935 if (!rsb_flag(r, RSB_HASHED)) { in find_rsb_nodir()
940 if (rsb_flag(r, RSB_INACTIVE)) { in find_rsb_nodir()
949 kref_get(&r->res_ref); in find_rsb_nodir()
959 if (rsb_flag(r, RSB_HASHED)) { in find_rsb_nodir()
960 if (!rsb_flag(r, RSB_INACTIVE)) { in find_rsb_nodir()
976 if (!recover && (r->res_master_nodeid != our_nodeid) && from_nodeid) { in find_rsb_nodir()
980 from_nodeid, r->res_master_nodeid, dir_nodeid); in find_rsb_nodir()
981 dlm_print_rsb(r); in find_rsb_nodir()
987 if (!recover && (r->res_master_nodeid != our_nodeid) && in find_rsb_nodir()
992 our_nodeid, r->res_master_nodeid, dir_nodeid); in find_rsb_nodir()
993 dlm_print_rsb(r); in find_rsb_nodir()
994 r->res_master_nodeid = our_nodeid; in find_rsb_nodir()
995 r->res_nodeid = 0; in find_rsb_nodir()
998 del_scan(ls, r); in find_rsb_nodir()
999 list_move(&r->res_slow_list, &ls->ls_slow_active); in find_rsb_nodir()
1000 rsb_clear_flag(r, RSB_INACTIVE); in find_rsb_nodir()
1001 kref_init(&r->res_ref); in find_rsb_nodir()
1012 error = get_rsb_struct(ls, name, len, &r); in find_rsb_nodir()
1016 r->res_hash = hash; in find_rsb_nodir()
1017 r->res_dir_nodeid = dir_nodeid; in find_rsb_nodir()
1018 r->res_master_nodeid = dir_nodeid; in find_rsb_nodir()
1019 r->res_nodeid = (dir_nodeid == our_nodeid) ? 0 : dir_nodeid; in find_rsb_nodir()
1020 kref_init(&r->res_ref); in find_rsb_nodir()
1023 error = rsb_insert(r, &ls->ls_rsbtbl); in find_rsb_nodir()
1029 dlm_free_rsb(r); in find_rsb_nodir()
1032 list_add(&r->res_slow_list, &ls->ls_slow_active); in find_rsb_nodir()
1037 *r_ret = r; in find_rsb_nodir()
1110 static int validate_master_nodeid(struct dlm_ls *ls, struct dlm_rsb *r, in validate_master_nodeid() argument
1115 from_nodeid, r->res_master_nodeid, in validate_master_nodeid()
1116 r->res_dir_nodeid); in validate_master_nodeid()
1117 dlm_print_rsb(r); in validate_master_nodeid()
1121 if (from_nodeid != r->res_dir_nodeid) { in validate_master_nodeid()
1126 if (r->res_master_nodeid) { in validate_master_nodeid()
1129 r->res_master_nodeid, r->res_dir_nodeid, in validate_master_nodeid()
1130 r->res_first_lkid, r->res_name); in validate_master_nodeid()
1137 if (r->res_master_nodeid) { in validate_master_nodeid()
1140 from_nodeid, r->res_master_nodeid, in validate_master_nodeid()
1141 r->res_first_lkid, r->res_name); in validate_master_nodeid()
1144 r->res_master_nodeid = dlm_our_nodeid(); in validate_master_nodeid()
1145 r->res_nodeid = 0; in validate_master_nodeid()
1150 static void __dlm_master_lookup(struct dlm_ls *ls, struct dlm_rsb *r, int our_nodeid, in __dlm_master_lookup() argument
1157 if (r->res_dir_nodeid != our_nodeid) { in __dlm_master_lookup()
1160 r->res_dir_nodeid, our_nodeid, r->res_name); in __dlm_master_lookup()
1161 r->res_dir_nodeid = our_nodeid; in __dlm_master_lookup()
1164 if (fix_master && r->res_master_nodeid && dlm_is_removed(ls, r->res_master_nodeid)) { in __dlm_master_lookup()
1171 r->res_master_nodeid = from_nodeid; in __dlm_master_lookup()
1172 r->res_nodeid = from_nodeid; in __dlm_master_lookup()
1173 rsb_set_flag(r, RSB_NEW_MASTER); in __dlm_master_lookup()
1178 dlm_dump_rsb(r); in __dlm_master_lookup()
1182 if (from_master && (r->res_master_nodeid != from_nodeid)) { in __dlm_master_lookup()
1189 __func__, from_nodeid, r->res_master_nodeid, in __dlm_master_lookup()
1190 r->res_nodeid, r->res_first_lkid, r->res_name); in __dlm_master_lookup()
1192 if (r->res_master_nodeid == our_nodeid) { in __dlm_master_lookup()
1194 dlm_dump_rsb(r); in __dlm_master_lookup()
1198 r->res_master_nodeid = from_nodeid; in __dlm_master_lookup()
1199 r->res_nodeid = from_nodeid; in __dlm_master_lookup()
1200 rsb_set_flag(r, RSB_NEW_MASTER); in __dlm_master_lookup()
1203 if (!r->res_master_nodeid) { in __dlm_master_lookup()
1209 from_nodeid, r->res_first_lkid, r->res_name); in __dlm_master_lookup()
1210 r->res_master_nodeid = from_nodeid; in __dlm_master_lookup()
1211 r->res_nodeid = from_nodeid; in __dlm_master_lookup()
1215 (r->res_master_nodeid == from_nodeid)) { in __dlm_master_lookup()
1222 __func__, from_nodeid, flags, r->res_first_lkid, in __dlm_master_lookup()
1223 r->res_name); in __dlm_master_lookup()
1227 *r_nodeid = r->res_master_nodeid; in __dlm_master_lookup()
1264 struct dlm_rsb *r = NULL; in _dlm_master_lookup() local
1289 error = dlm_search_rsb_tree(&ls->ls_rsbtbl, name, len, &r); in _dlm_master_lookup()
1295 if (!rsb_flag(r, RSB_HASHED)) { in _dlm_master_lookup()
1300 if (rsb_flag(r, RSB_INACTIVE)) { in _dlm_master_lookup()
1309 hold_rsb(r); in _dlm_master_lookup()
1311 lock_rsb(r); in _dlm_master_lookup()
1313 __dlm_master_lookup(ls, r, our_nodeid, from_nodeid, false, in _dlm_master_lookup()
1317 unlock_rsb(r); in _dlm_master_lookup()
1318 put_rsb(r); in _dlm_master_lookup()
1327 if (rsb_flag(r, RSB_HASHED)) { in _dlm_master_lookup()
1328 if (!rsb_flag(r, RSB_INACTIVE)) { in _dlm_master_lookup()
1343 __dlm_master_lookup(ls, r, our_nodeid, from_nodeid, true, flags, in _dlm_master_lookup()
1351 WARN_ON(!list_empty(&r->res_scan_list) && in _dlm_master_lookup()
1352 r->res_master_nodeid != our_nodeid); in _dlm_master_lookup()
1359 error = get_rsb_struct(ls, name, len, &r); in _dlm_master_lookup()
1363 r->res_hash = hash; in _dlm_master_lookup()
1364 r->res_dir_nodeid = our_nodeid; in _dlm_master_lookup()
1365 r->res_master_nodeid = from_nodeid; in _dlm_master_lookup()
1366 r->res_nodeid = from_nodeid; in _dlm_master_lookup()
1367 rsb_set_flag(r, RSB_INACTIVE); in _dlm_master_lookup()
1370 error = rsb_insert(r, &ls->ls_rsbtbl); in _dlm_master_lookup()
1376 dlm_free_rsb(r); in _dlm_master_lookup()
1381 dlm_free_rsb(r); in _dlm_master_lookup()
1385 list_add(&r->res_slow_list, &ls->ls_slow_inactive); in _dlm_master_lookup()
1407 struct dlm_rsb *r; in dlm_dump_rsb_hash() local
1410 list_for_each_entry(r, &ls->ls_slow_active, res_slow_list) { in dlm_dump_rsb_hash()
1411 if (r->res_hash == hash) in dlm_dump_rsb_hash()
1412 dlm_dump_rsb(r); in dlm_dump_rsb_hash()
1419 struct dlm_rsb *r = NULL; in dlm_dump_rsb_name() local
1423 error = dlm_search_rsb_tree(&ls->ls_rsbtbl, name, len, &r); in dlm_dump_rsb_name()
1427 dlm_dump_rsb(r); in dlm_dump_rsb_name()
1434 struct dlm_rsb *r = container_of(kref, struct dlm_rsb, res_ref); in deactivate_rsb() local
1435 struct dlm_ls *ls = r->res_ls; in deactivate_rsb()
1438 DLM_ASSERT(list_empty(&r->res_root_list), dlm_print_rsb(r);); in deactivate_rsb()
1439 rsb_set_flag(r, RSB_INACTIVE); in deactivate_rsb()
1440 list_move(&r->res_slow_list, &ls->ls_slow_inactive); in deactivate_rsb()
1458 (r->res_master_nodeid == our_nodeid || in deactivate_rsb()
1459 dlm_dir_nodeid(r) != our_nodeid)) in deactivate_rsb()
1460 add_scan(ls, r); in deactivate_rsb()
1462 if (r->res_lvbptr) { in deactivate_rsb()
1463 dlm_free_lvb(r->res_lvbptr); in deactivate_rsb()
1464 r->res_lvbptr = NULL; in deactivate_rsb()
1468 void free_inactive_rsb(struct dlm_rsb *r) in free_inactive_rsb() argument
1470 WARN_ON_ONCE(!rsb_flag(r, RSB_INACTIVE)); in free_inactive_rsb()
1472 DLM_ASSERT(list_empty(&r->res_lookup), dlm_dump_rsb(r);); in free_inactive_rsb()
1473 DLM_ASSERT(list_empty(&r->res_grantqueue), dlm_dump_rsb(r);); in free_inactive_rsb()
1474 DLM_ASSERT(list_empty(&r->res_convertqueue), dlm_dump_rsb(r);); in free_inactive_rsb()
1475 DLM_ASSERT(list_empty(&r->res_waitqueue), dlm_dump_rsb(r);); in free_inactive_rsb()
1476 DLM_ASSERT(list_empty(&r->res_root_list), dlm_dump_rsb(r);); in free_inactive_rsb()
1477 DLM_ASSERT(list_empty(&r->res_scan_list), dlm_dump_rsb(r);); in free_inactive_rsb()
1478 DLM_ASSERT(list_empty(&r->res_recover_list), dlm_dump_rsb(r);); in free_inactive_rsb()
1479 DLM_ASSERT(list_empty(&r->res_masters_list), dlm_dump_rsb(r);); in free_inactive_rsb()
1481 dlm_free_rsb(r); in free_inactive_rsb()
1487 static void attach_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in attach_lkb() argument
1489 hold_rsb(r); in attach_lkb()
1490 lkb->lkb_resource = r; in attach_lkb()
1656 static void add_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int status) in add_lkb() argument
1669 list_add(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1671 list_add_tail(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1675 lkb_add_ordered(&lkb->lkb_statequeue, &r->res_grantqueue, in add_lkb()
1680 list_add(&lkb->lkb_statequeue, &r->res_convertqueue); in add_lkb()
1683 &r->res_convertqueue); in add_lkb()
1690 static void del_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in del_lkb() argument
1697 static void move_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int sts) in move_lkb() argument
1699 del_lkb(r, lkb); in move_lkb()
1700 add_lkb(r, lkb, sts); in move_lkb()
1894 static void set_lvb_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_lock() argument
1896 int b, len = r->res_ls->ls_lvblen; in set_lvb_lock()
1911 if (!r->res_lvbptr) in set_lvb_lock()
1914 memcpy(lkb->lkb_lvbptr, r->res_lvbptr, len); in set_lvb_lock()
1915 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1919 rsb_set_flag(r, RSB_VALNOTVALID); in set_lvb_lock()
1929 if (!r->res_lvbptr) in set_lvb_lock()
1930 r->res_lvbptr = dlm_allocate_lvb(r->res_ls); in set_lvb_lock()
1932 if (!r->res_lvbptr) in set_lvb_lock()
1935 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, len); in set_lvb_lock()
1936 r->res_lvbseq++; in set_lvb_lock()
1937 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1938 rsb_clear_flag(r, RSB_VALNOTVALID); in set_lvb_lock()
1941 if (rsb_flag(r, RSB_VALNOTVALID)) in set_lvb_lock()
1945 static void set_lvb_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_unlock() argument
1951 rsb_set_flag(r, RSB_VALNOTVALID); in set_lvb_unlock()
1961 if (!r->res_lvbptr) in set_lvb_unlock()
1962 r->res_lvbptr = dlm_allocate_lvb(r->res_ls); in set_lvb_unlock()
1964 if (!r->res_lvbptr) in set_lvb_unlock()
1967 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in set_lvb_unlock()
1968 r->res_lvbseq++; in set_lvb_unlock()
1969 rsb_clear_flag(r, RSB_VALNOTVALID); in set_lvb_unlock()
1974 static void set_lvb_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in set_lvb_lock_pc() argument
1988 if (len > r->res_ls->ls_lvblen) in set_lvb_lock_pc()
1989 len = r->res_ls->ls_lvblen; in set_lvb_lock_pc()
2005 static void _remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _remove_lock() argument
2007 del_lkb(r, lkb); in _remove_lock()
2014 static void remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock() argument
2016 set_lvb_unlock(r, lkb); in remove_lock()
2017 _remove_lock(r, lkb); in remove_lock()
2020 static void remove_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock_pc() argument
2022 _remove_lock(r, lkb); in remove_lock_pc()
2029 static int revert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock() argument
2039 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in revert_lock()
2043 del_lkb(r, lkb); in revert_lock()
2056 static int revert_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock_pc() argument
2058 return revert_lock(r, lkb); in revert_lock_pc()
2061 static void _grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _grant_lock() argument
2066 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2068 add_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2075 static void grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock() argument
2077 set_lvb_lock(r, lkb); in grant_lock()
2078 _grant_lock(r, lkb); in grant_lock()
2081 static void grant_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in grant_lock_pc() argument
2084 set_lvb_lock_pc(r, lkb, ms); in grant_lock_pc()
2085 _grant_lock(r, lkb); in grant_lock_pc()
2092 static void grant_lock_pending(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock_pending() argument
2094 grant_lock(r, lkb); in grant_lock_pending()
2096 send_grant(r, lkb); in grant_lock_pending()
2098 queue_cast(r, lkb, 0); in grant_lock_pending()
2205 static int conversion_deadlock_detect(struct dlm_rsb *r, struct dlm_lkb *lkb2) in conversion_deadlock_detect() argument
2210 list_for_each_entry(lkb1, &r->res_convertqueue, lkb_statequeue) { in conversion_deadlock_detect()
2244 static int _can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in _can_be_granted() argument
2276 if (queue_conflict(&r->res_grantqueue, lkb)) in _can_be_granted()
2285 if (queue_conflict(&r->res_convertqueue, lkb)) in _can_be_granted()
2337 if (list_empty(&r->res_convertqueue)) in _can_be_granted()
2357 if (!now && conv && first_in_list(lkb, &r->res_convertqueue)) in _can_be_granted()
2371 if (now && !conv && list_empty(&r->res_convertqueue) && in _can_be_granted()
2372 list_empty(&r->res_waitqueue)) in _can_be_granted()
2383 if (!now && !conv && list_empty(&r->res_convertqueue) && in _can_be_granted()
2384 first_in_list(lkb, &r->res_waitqueue)) in _can_be_granted()
2390 static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in can_be_granted() argument
2400 rv = _can_be_granted(r, lkb, now, recover); in can_be_granted()
2411 conversion_deadlock_detect(r, lkb)) { in can_be_granted()
2420 dlm_dump_rsb(r); in can_be_granted()
2439 rv = _can_be_granted(r, lkb, now, 0); in can_be_granted()
2452 static int grant_pending_convert(struct dlm_rsb *r, int high, int *cw, in grant_pending_convert() argument
2456 int recover = rsb_flag(r, RSB_RECOVER_GRANT); in grant_pending_convert()
2466 list_for_each_entry_safe(lkb, s, &r->res_convertqueue, lkb_statequeue) { in grant_pending_convert()
2470 if (can_be_granted(r, lkb, 0, recover, &deadlk)) { in grant_pending_convert()
2471 grant_lock_pending(r, lkb); in grant_pending_convert()
2480 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in grant_pending_convert()
2493 queue_bast(r, lkb, lkb->lkb_rqmode); in grant_pending_convert()
2499 r->res_name); in grant_pending_convert()
2500 dlm_dump_rsb(r); in grant_pending_convert()
2521 static int grant_pending_wait(struct dlm_rsb *r, int high, int *cw, in grant_pending_wait() argument
2526 list_for_each_entry_safe(lkb, s, &r->res_waitqueue, lkb_statequeue) { in grant_pending_wait()
2527 if (can_be_granted(r, lkb, 0, 0, NULL)) { in grant_pending_wait()
2528 grant_lock_pending(r, lkb); in grant_pending_wait()
2560 static void grant_pending_locks(struct dlm_rsb *r, unsigned int *count) in grant_pending_locks() argument
2566 if (!is_master(r)) { in grant_pending_locks()
2567 log_print("grant_pending_locks r nodeid %d", r->res_nodeid); in grant_pending_locks()
2568 dlm_dump_rsb(r); in grant_pending_locks()
2572 high = grant_pending_convert(r, high, &cw, count); in grant_pending_locks()
2573 high = grant_pending_wait(r, high, &cw, count); in grant_pending_locks()
2584 list_for_each_entry_safe(lkb, s, &r->res_grantqueue, lkb_statequeue) { in grant_pending_locks()
2588 queue_bast(r, lkb, DLM_LOCK_CW); in grant_pending_locks()
2590 queue_bast(r, lkb, high); in grant_pending_locks()
2610 static void send_bast_queue(struct dlm_rsb *r, struct list_head *head, in send_bast_queue() argument
2620 queue_bast(r, gr, lkb->lkb_rqmode); in send_bast_queue()
2626 static void send_blocking_asts(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts() argument
2628 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts()
2631 static void send_blocking_asts_all(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts_all() argument
2633 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts_all()
2634 send_bast_queue(r, &r->res_convertqueue, lkb); in send_blocking_asts_all()
2637 /* set_master(r, lkb) -- set the master nodeid of a resource
2656 static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_master() argument
2660 if (rsb_flag(r, RSB_MASTER_UNCERTAIN)) { in set_master()
2661 rsb_clear_flag(r, RSB_MASTER_UNCERTAIN); in set_master()
2662 r->res_first_lkid = lkb->lkb_id; in set_master()
2663 lkb->lkb_nodeid = r->res_nodeid; in set_master()
2667 if (r->res_first_lkid && r->res_first_lkid != lkb->lkb_id) { in set_master()
2668 list_add_tail(&lkb->lkb_rsb_lookup, &r->res_lookup); in set_master()
2672 if (r->res_master_nodeid == our_nodeid) { in set_master()
2677 if (r->res_master_nodeid) { in set_master()
2678 lkb->lkb_nodeid = r->res_master_nodeid; in set_master()
2682 if (dlm_dir_nodeid(r) == our_nodeid) { in set_master()
2689 log_debug(r->res_ls, "set_master %x self master %d dir %d %s", in set_master()
2690 lkb->lkb_id, r->res_master_nodeid, r->res_dir_nodeid, in set_master()
2691 r->res_name); in set_master()
2692 r->res_master_nodeid = our_nodeid; in set_master()
2693 r->res_nodeid = 0; in set_master()
2698 r->res_first_lkid = lkb->lkb_id; in set_master()
2699 send_lookup(r, lkb); in set_master()
2703 static void process_lookup_list(struct dlm_rsb *r) in process_lookup_list() argument
2707 list_for_each_entry_safe(lkb, safe, &r->res_lookup, lkb_rsb_lookup) { in process_lookup_list()
2709 _request_lock(r, lkb); in process_lookup_list()
2715 static void confirm_master(struct dlm_rsb *r, int error) in confirm_master() argument
2719 if (!r->res_first_lkid) in confirm_master()
2725 r->res_first_lkid = 0; in confirm_master()
2726 process_lookup_list(r); in confirm_master()
2736 r->res_first_lkid = 0; in confirm_master()
2738 if (!list_empty(&r->res_lookup)) { in confirm_master()
2739 lkb = list_entry(r->res_lookup.next, struct dlm_lkb, in confirm_master()
2742 r->res_first_lkid = lkb->lkb_id; in confirm_master()
2743 _request_lock(r, lkb); in confirm_master()
2748 log_error(r->res_ls, "confirm_master unknown error %d", error); in confirm_master()
3038 static int do_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_request() argument
3042 if (can_be_granted(r, lkb, 1, 0, NULL)) { in do_request()
3043 grant_lock(r, lkb); in do_request()
3044 queue_cast(r, lkb, 0); in do_request()
3050 add_lkb(r, lkb, DLM_LKSTS_WAITING); in do_request()
3055 queue_cast(r, lkb, -EAGAIN); in do_request()
3060 static void do_request_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_request_effects() argument
3066 send_blocking_asts_all(r, lkb); in do_request_effects()
3069 send_blocking_asts(r, lkb); in do_request_effects()
3074 static int do_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_convert() argument
3081 if (can_be_granted(r, lkb, 1, 0, &deadlk)) { in do_convert()
3082 grant_lock(r, lkb); in do_convert()
3083 queue_cast(r, lkb, 0); in do_convert()
3093 revert_lock(r, lkb); in do_convert()
3094 queue_cast(r, lkb, -EDEADLK); in do_convert()
3106 grant_pending_convert(r, DLM_LOCK_IV, NULL, NULL); in do_convert()
3107 if (_can_be_granted(r, lkb, 1, 0)) { in do_convert()
3108 grant_lock(r, lkb); in do_convert()
3109 queue_cast(r, lkb, 0); in do_convert()
3117 del_lkb(r, lkb); in do_convert()
3118 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in do_convert()
3123 queue_cast(r, lkb, -EAGAIN); in do_convert()
3128 static void do_convert_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_convert_effects() argument
3133 grant_pending_locks(r, NULL); in do_convert_effects()
3138 send_blocking_asts_all(r, lkb); in do_convert_effects()
3141 send_blocking_asts(r, lkb); in do_convert_effects()
3146 static int do_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_unlock() argument
3148 remove_lock(r, lkb); in do_unlock()
3149 queue_cast(r, lkb, -DLM_EUNLOCK); in do_unlock()
3153 static void do_unlock_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_unlock_effects() argument
3156 grant_pending_locks(r, NULL); in do_unlock_effects()
3161 static int do_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_cancel() argument
3165 error = revert_lock(r, lkb); in do_cancel()
3167 queue_cast(r, lkb, -DLM_ECANCEL); in do_cancel()
3173 static void do_cancel_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_cancel_effects() argument
3177 grant_pending_locks(r, NULL); in do_cancel_effects()
3187 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _request_lock() argument
3191 /* set_master: sets lkb nodeid from r */ in _request_lock()
3193 error = set_master(r, lkb); in _request_lock()
3201 if (is_remote(r)) { in _request_lock()
3203 error = send_request(r, lkb); in _request_lock()
3205 error = do_request(r, lkb); in _request_lock()
3208 do_request_effects(r, lkb, error); in _request_lock()
3216 static int _convert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _convert_lock() argument
3220 if (is_remote(r)) { in _convert_lock()
3222 error = send_convert(r, lkb); in _convert_lock()
3224 error = do_convert(r, lkb); in _convert_lock()
3227 do_convert_effects(r, lkb, error); in _convert_lock()
3235 static int _unlock_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _unlock_lock() argument
3239 if (is_remote(r)) { in _unlock_lock()
3241 error = send_unlock(r, lkb); in _unlock_lock()
3243 error = do_unlock(r, lkb); in _unlock_lock()
3246 do_unlock_effects(r, lkb, error); in _unlock_lock()
3254 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _cancel_lock() argument
3258 if (is_remote(r)) { in _cancel_lock()
3260 error = send_cancel(r, lkb); in _cancel_lock()
3262 error = do_cancel(r, lkb); in _cancel_lock()
3265 do_cancel_effects(r, lkb, error); in _cancel_lock()
3280 struct dlm_rsb *r; in request_lock() local
3287 error = find_rsb(ls, name, len, 0, R_REQUEST, &r); in request_lock()
3291 lock_rsb(r); in request_lock()
3293 attach_lkb(r, lkb); in request_lock()
3296 error = _request_lock(r, lkb); in request_lock()
3298 unlock_rsb(r); in request_lock()
3299 put_rsb(r); in request_lock()
3306 struct dlm_rsb *r; in convert_lock() local
3309 r = lkb->lkb_resource; in convert_lock()
3311 hold_rsb(r); in convert_lock()
3312 lock_rsb(r); in convert_lock()
3318 error = _convert_lock(r, lkb); in convert_lock()
3320 unlock_rsb(r); in convert_lock()
3321 put_rsb(r); in convert_lock()
3328 struct dlm_rsb *r; in unlock_lock() local
3331 r = lkb->lkb_resource; in unlock_lock()
3333 hold_rsb(r); in unlock_lock()
3334 lock_rsb(r); in unlock_lock()
3340 error = _unlock_lock(r, lkb); in unlock_lock()
3342 unlock_rsb(r); in unlock_lock()
3343 put_rsb(r); in unlock_lock()
3350 struct dlm_rsb *r; in cancel_lock() local
3353 r = lkb->lkb_resource; in cancel_lock()
3355 hold_rsb(r); in cancel_lock()
3356 lock_rsb(r); in cancel_lock()
3362 error = _cancel_lock(r, lkb); in cancel_lock()
3364 unlock_rsb(r); in cancel_lock()
3365 put_rsb(r); in cancel_lock()
3530 static int create_message(struct dlm_rsb *r, struct dlm_lkb *lkb, in create_message() argument
3541 mb_len += r->res_length; in create_message()
3549 mb_len += r->res_ls->ls_lvblen; in create_message()
3553 return _create_message(r->res_ls, mb_len, to_nodeid, mstype, in create_message()
3567 static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_args() argument
3581 ms->m_hash = cpu_to_le32(r->res_hash); in send_args()
3597 memcpy(ms->m_extra, r->res_name, r->res_length); in send_args()
3606 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in send_args()
3611 static int send_common(struct dlm_rsb *r, struct dlm_lkb *lkb, int mstype) in send_common() argument
3617 to_nodeid = r->res_nodeid; in send_common()
3620 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common()
3624 send_args(r, lkb, ms); in send_common()
3626 error = send_message(mh, ms, r->res_name, r->res_length); in send_common()
3636 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_request() argument
3638 return send_common(r, lkb, DLM_MSG_REQUEST); in send_request()
3641 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_convert() argument
3645 error = send_common(r, lkb, DLM_MSG_CONVERT); in send_convert()
3650 r->res_ls->ls_local_ms.m_type = cpu_to_le32(DLM_MSG_CONVERT_REPLY); in send_convert()
3651 r->res_ls->ls_local_ms.m_result = 0; in send_convert()
3652 __receive_convert_reply(r, lkb, &r->res_ls->ls_local_ms, true); in send_convert()
3662 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_unlock() argument
3664 return send_common(r, lkb, DLM_MSG_UNLOCK); in send_unlock()
3667 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_cancel() argument
3669 return send_common(r, lkb, DLM_MSG_CANCEL); in send_cancel()
3672 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_grant() argument
3680 error = create_message(r, lkb, to_nodeid, DLM_MSG_GRANT, &ms, &mh); in send_grant()
3684 send_args(r, lkb, ms); in send_grant()
3688 error = send_message(mh, ms, r->res_name, r->res_length); in send_grant()
3693 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode) in send_bast() argument
3701 error = create_message(r, NULL, to_nodeid, DLM_MSG_BAST, &ms, &mh); in send_bast()
3705 send_args(r, lkb, ms); in send_bast()
3709 error = send_message(mh, ms, r->res_name, r->res_length); in send_bast()
3714 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_lookup() argument
3720 to_nodeid = dlm_dir_nodeid(r); in send_lookup()
3723 error = create_message(r, NULL, to_nodeid, DLM_MSG_LOOKUP, &ms, &mh); in send_lookup()
3727 send_args(r, lkb, ms); in send_lookup()
3729 error = send_message(mh, ms, r->res_name, r->res_length); in send_lookup()
3739 static int send_remove(struct dlm_rsb *r) in send_remove() argument
3745 to_nodeid = dlm_dir_nodeid(r); in send_remove()
3747 error = create_message(r, NULL, to_nodeid, DLM_MSG_REMOVE, &ms, &mh); in send_remove()
3751 memcpy(ms->m_extra, r->res_name, r->res_length); in send_remove()
3752 ms->m_hash = cpu_to_le32(r->res_hash); in send_remove()
3754 error = send_message(mh, ms, r->res_name, r->res_length); in send_remove()
3759 static int send_common_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_common_reply() argument
3768 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common_reply()
3772 send_args(r, lkb, ms); in send_common_reply()
3776 error = send_message(mh, ms, r->res_name, r->res_length); in send_common_reply()
3781 static int send_request_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_request_reply() argument
3783 return send_common_reply(r, lkb, DLM_MSG_REQUEST_REPLY, rv); in send_request_reply()
3786 static int send_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_convert_reply() argument
3788 return send_common_reply(r, lkb, DLM_MSG_CONVERT_REPLY, rv); in send_convert_reply()
3791 static int send_unlock_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_unlock_reply() argument
3793 return send_common_reply(r, lkb, DLM_MSG_UNLOCK_REPLY, rv); in send_unlock_reply()
3796 static int send_cancel_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_cancel_reply() argument
3798 return send_common_reply(r, lkb, DLM_MSG_CANCEL_REPLY, rv); in send_cancel_reply()
3805 struct dlm_rsb *r = &ls->ls_local_rsb; in send_lookup_reply() local
3810 error = create_message(r, NULL, nodeid, DLM_MSG_LOOKUP_REPLY, &ms, &mh); in send_lookup_reply()
3992 struct dlm_rsb *r; in receive_request() local
4019 R_RECEIVE_REQUEST, &r); in receive_request()
4025 lock_rsb(r); in receive_request()
4027 if (r->res_master_nodeid != dlm_our_nodeid()) { in receive_request()
4028 error = validate_master_nodeid(ls, r, from_nodeid); in receive_request()
4030 unlock_rsb(r); in receive_request()
4031 put_rsb(r); in receive_request()
4037 attach_lkb(r, lkb); in receive_request()
4038 error = do_request(r, lkb); in receive_request()
4039 send_request_reply(r, lkb, error); in receive_request()
4040 do_request_effects(r, lkb, error); in receive_request()
4042 unlock_rsb(r); in receive_request()
4043 put_rsb(r); in receive_request()
4071 struct dlm_rsb *r; in receive_convert() local
4089 r = lkb->lkb_resource; in receive_convert()
4091 hold_rsb(r); in receive_convert()
4092 lock_rsb(r); in receive_convert()
4102 send_convert_reply(r, lkb, error); in receive_convert()
4108 error = do_convert(r, lkb); in receive_convert()
4110 send_convert_reply(r, lkb, error); in receive_convert()
4111 do_convert_effects(r, lkb, error); in receive_convert()
4113 unlock_rsb(r); in receive_convert()
4114 put_rsb(r); in receive_convert()
4127 struct dlm_rsb *r; in receive_unlock() local
4144 r = lkb->lkb_resource; in receive_unlock()
4146 hold_rsb(r); in receive_unlock()
4147 lock_rsb(r); in receive_unlock()
4157 send_unlock_reply(r, lkb, error); in receive_unlock()
4161 error = do_unlock(r, lkb); in receive_unlock()
4162 send_unlock_reply(r, lkb, error); in receive_unlock()
4163 do_unlock_effects(r, lkb, error); in receive_unlock()
4165 unlock_rsb(r); in receive_unlock()
4166 put_rsb(r); in receive_unlock()
4179 struct dlm_rsb *r; in receive_cancel() local
4188 r = lkb->lkb_resource; in receive_cancel()
4190 hold_rsb(r); in receive_cancel()
4191 lock_rsb(r); in receive_cancel()
4197 error = do_cancel(r, lkb); in receive_cancel()
4198 send_cancel_reply(r, lkb, error); in receive_cancel()
4199 do_cancel_effects(r, lkb, error); in receive_cancel()
4201 unlock_rsb(r); in receive_cancel()
4202 put_rsb(r); in receive_cancel()
4215 struct dlm_rsb *r; in receive_grant() local
4222 r = lkb->lkb_resource; in receive_grant()
4224 hold_rsb(r); in receive_grant()
4225 lock_rsb(r); in receive_grant()
4234 grant_lock_pc(r, lkb, ms); in receive_grant()
4235 queue_cast(r, lkb, 0); in receive_grant()
4237 unlock_rsb(r); in receive_grant()
4238 put_rsb(r); in receive_grant()
4246 struct dlm_rsb *r; in receive_bast() local
4253 r = lkb->lkb_resource; in receive_bast()
4255 hold_rsb(r); in receive_bast()
4256 lock_rsb(r); in receive_bast()
4262 queue_bast(r, lkb, le32_to_cpu(ms->m_bastmode)); in receive_bast()
4265 unlock_rsb(r); in receive_bast()
4266 put_rsb(r); in receive_bast()
4294 struct dlm_rsb *r; in receive_remove() local
4329 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl, name, len, &r); in receive_remove()
4339 if (!rsb_flag(r, RSB_HASHED)) { in receive_remove()
4350 if (!rsb_flag(r, RSB_INACTIVE)) { in receive_remove()
4351 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4354 from_nodeid, r->res_master_nodeid); in receive_remove()
4355 dlm_print_rsb(r); in receive_remove()
4363 from_nodeid, r->res_master_nodeid, r->res_first_lkid, in receive_remove()
4369 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4371 from_nodeid, r->res_master_nodeid); in receive_remove()
4372 dlm_print_rsb(r); in receive_remove()
4377 list_del(&r->res_slow_list); in receive_remove()
4378 rhashtable_remove_fast(&ls->ls_rsbtbl, &r->res_node, in receive_remove()
4380 rsb_clear_flag(r, RSB_HASHED); in receive_remove()
4383 free_inactive_rsb(r); in receive_remove()
4395 struct dlm_rsb *r; in receive_request_reply() local
4403 r = lkb->lkb_resource; in receive_request_reply()
4404 hold_rsb(r); in receive_request_reply()
4405 lock_rsb(r); in receive_request_reply()
4417 dlm_dump_rsb(r); in receive_request_reply()
4424 r->res_master_nodeid = from_nodeid; in receive_request_reply()
4425 r->res_nodeid = from_nodeid; in receive_request_reply()
4435 queue_cast(r, lkb, -EAGAIN); in receive_request_reply()
4436 confirm_master(r, -EAGAIN); in receive_request_reply()
4448 add_lkb(r, lkb, DLM_LKSTS_WAITING); in receive_request_reply()
4450 grant_lock_pc(r, lkb, ms); in receive_request_reply()
4451 queue_cast(r, lkb, 0); in receive_request_reply()
4453 confirm_master(r, result); in receive_request_reply()
4461 from_nodeid, result, r->res_master_nodeid, in receive_request_reply()
4462 r->res_dir_nodeid, r->res_first_lkid, r->res_name); in receive_request_reply()
4464 if (r->res_dir_nodeid != dlm_our_nodeid() && in receive_request_reply()
4465 r->res_master_nodeid != dlm_our_nodeid()) { in receive_request_reply()
4467 r->res_master_nodeid = 0; in receive_request_reply()
4468 r->res_nodeid = -1; in receive_request_reply()
4474 queue_cast_overlap(r, lkb); in receive_request_reply()
4475 confirm_master(r, result); in receive_request_reply()
4478 _request_lock(r, lkb); in receive_request_reply()
4480 if (r->res_master_nodeid == dlm_our_nodeid()) in receive_request_reply()
4481 confirm_master(r, 0); in receive_request_reply()
4495 send_unlock(r, lkb); in receive_request_reply()
4501 send_cancel(r, lkb); in receive_request_reply()
4507 unlock_rsb(r); in receive_request_reply()
4508 put_rsb(r); in receive_request_reply()
4513 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in __receive_convert_reply() argument
4520 queue_cast(r, lkb, -EAGAIN); in __receive_convert_reply()
4525 revert_lock_pc(r, lkb); in __receive_convert_reply()
4526 queue_cast(r, lkb, -EDEADLK); in __receive_convert_reply()
4534 del_lkb(r, lkb); in __receive_convert_reply()
4535 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in __receive_convert_reply()
4543 grant_lock_pc(r, lkb, ms); in __receive_convert_reply()
4544 queue_cast(r, lkb, 0); in __receive_convert_reply()
4548 log_error(r->res_ls, "receive_convert_reply %x remote %d %x %d", in __receive_convert_reply()
4552 dlm_print_rsb(r); in __receive_convert_reply()
4560 struct dlm_rsb *r = lkb->lkb_resource; in _receive_convert_reply() local
4563 hold_rsb(r); in _receive_convert_reply()
4564 lock_rsb(r); in _receive_convert_reply()
4574 __receive_convert_reply(r, lkb, ms, local); in _receive_convert_reply()
4576 unlock_rsb(r); in _receive_convert_reply()
4577 put_rsb(r); in _receive_convert_reply()
4598 struct dlm_rsb *r = lkb->lkb_resource; in _receive_unlock_reply() local
4601 hold_rsb(r); in _receive_unlock_reply()
4602 lock_rsb(r); in _receive_unlock_reply()
4617 remove_lock_pc(r, lkb); in _receive_unlock_reply()
4618 queue_cast(r, lkb, -DLM_EUNLOCK); in _receive_unlock_reply()
4623 log_error(r->res_ls, "receive_unlock_reply %x error %d", in _receive_unlock_reply()
4627 unlock_rsb(r); in _receive_unlock_reply()
4628 put_rsb(r); in _receive_unlock_reply()
4649 struct dlm_rsb *r = lkb->lkb_resource; in _receive_cancel_reply() local
4652 hold_rsb(r); in _receive_cancel_reply()
4653 lock_rsb(r); in _receive_cancel_reply()
4668 revert_lock_pc(r, lkb); in _receive_cancel_reply()
4669 queue_cast(r, lkb, -DLM_ECANCEL); in _receive_cancel_reply()
4674 log_error(r->res_ls, "receive_cancel_reply %x error %d", in _receive_cancel_reply()
4679 unlock_rsb(r); in _receive_cancel_reply()
4680 put_rsb(r); in _receive_cancel_reply()
4702 struct dlm_rsb *r; in receive_lookup_reply() local
4716 r = lkb->lkb_resource; in receive_lookup_reply()
4717 hold_rsb(r); in receive_lookup_reply()
4718 lock_rsb(r); in receive_lookup_reply()
4732 if (r->res_master_nodeid && (r->res_master_nodeid != ret_nodeid)) { in receive_lookup_reply()
4737 ret_nodeid, r->res_master_nodeid, r->res_dir_nodeid, in receive_lookup_reply()
4738 dlm_our_nodeid(), r->res_first_lkid, r->res_name); in receive_lookup_reply()
4742 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4743 r->res_nodeid = 0; in receive_lookup_reply()
4745 r->res_first_lkid = 0; in receive_lookup_reply()
4750 r->res_master_nodeid = 0; in receive_lookup_reply()
4751 r->res_nodeid = -1; in receive_lookup_reply()
4754 /* set_master() will set lkb_nodeid from r */ in receive_lookup_reply()
4755 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4756 r->res_nodeid = ret_nodeid; in receive_lookup_reply()
4762 queue_cast_overlap(r, lkb); in receive_lookup_reply()
4767 _request_lock(r, lkb); in receive_lookup_reply()
4771 process_lookup_list(r); in receive_lookup_reply()
4773 unlock_rsb(r); in receive_lookup_reply()
4774 put_rsb(r); in receive_lookup_reply()
5199 struct dlm_rsb *r; in dlm_recover_waiters_post() local
5218 r = lkb->lkb_resource; in dlm_recover_waiters_post()
5219 hold_rsb(r); in dlm_recover_waiters_post()
5220 lock_rsb(r); in dlm_recover_waiters_post()
5237 r->res_nodeid, lkb->lkb_nodeid, lkb->lkb_wait_nodeid, in dlm_recover_waiters_post()
5238 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5279 queue_cast(r, lkb, ou ? -DLM_EUNLOCK : in dlm_recover_waiters_post()
5285 queue_cast(r, lkb, -DLM_ECANCEL); in dlm_recover_waiters_post()
5288 _unlock_lock(r, lkb); in dlm_recover_waiters_post()
5298 _request_lock(r, lkb); in dlm_recover_waiters_post()
5299 if (r->res_nodeid != -1 && is_master(r)) in dlm_recover_waiters_post()
5300 confirm_master(r, 0); in dlm_recover_waiters_post()
5303 _convert_lock(r, lkb); in dlm_recover_waiters_post()
5313 lkb->lkb_id, mstype, r->res_nodeid, in dlm_recover_waiters_post()
5314 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5316 unlock_rsb(r); in dlm_recover_waiters_post()
5317 put_rsb(r); in dlm_recover_waiters_post()
5324 static void purge_mstcpy_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_mstcpy_list() argument
5339 del_lkb(r, lkb); in purge_mstcpy_list()
5347 void dlm_purge_mstcpy_locks(struct dlm_rsb *r) in dlm_purge_mstcpy_locks() argument
5349 struct dlm_ls *ls = r->res_ls; in dlm_purge_mstcpy_locks()
5351 purge_mstcpy_list(ls, r, &r->res_grantqueue); in dlm_purge_mstcpy_locks()
5352 purge_mstcpy_list(ls, r, &r->res_convertqueue); in dlm_purge_mstcpy_locks()
5353 purge_mstcpy_list(ls, r, &r->res_waitqueue); in dlm_purge_mstcpy_locks()
5356 static void purge_dead_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_dead_list() argument
5373 rsb_set_flag(r, RSB_RECOVER_LVB_INVAL); in purge_dead_list()
5376 del_lkb(r, lkb); in purge_dead_list()
5382 rsb_set_flag(r, RSB_RECOVER_GRANT); in purge_dead_list()
5393 struct dlm_rsb *r; in dlm_recover_purge() local
5410 list_for_each_entry(r, root_list, res_root_list) { in dlm_recover_purge()
5411 lock_rsb(r); in dlm_recover_purge()
5412 if (r->res_nodeid != -1 && is_master(r)) { in dlm_recover_purge()
5413 purge_dead_list(ls, r, &r->res_grantqueue, in dlm_recover_purge()
5415 purge_dead_list(ls, r, &r->res_convertqueue, in dlm_recover_purge()
5417 purge_dead_list(ls, r, &r->res_waitqueue, in dlm_recover_purge()
5420 unlock_rsb(r); in dlm_recover_purge()
5432 struct dlm_rsb *r; in find_grant_rsb() local
5435 list_for_each_entry(r, &ls->ls_slow_active, res_slow_list) { in find_grant_rsb()
5436 if (!rsb_flag(r, RSB_RECOVER_GRANT)) in find_grant_rsb()
5438 if (!is_master(r)) { in find_grant_rsb()
5439 rsb_clear_flag(r, RSB_RECOVER_GRANT); in find_grant_rsb()
5442 hold_rsb(r); in find_grant_rsb()
5444 return r; in find_grant_rsb()
5469 struct dlm_rsb *r; in dlm_recover_grant() local
5475 r = find_grant_rsb(ls); in dlm_recover_grant()
5476 if (!r) in dlm_recover_grant()
5481 lock_rsb(r); in dlm_recover_grant()
5483 grant_pending_locks(r, &count); in dlm_recover_grant()
5484 rsb_clear_flag(r, RSB_RECOVER_GRANT); in dlm_recover_grant()
5486 confirm_master(r, 0); in dlm_recover_grant()
5487 unlock_rsb(r); in dlm_recover_grant()
5488 put_rsb(r); in dlm_recover_grant()
5509 static struct dlm_lkb *search_remid(struct dlm_rsb *r, int nodeid, in search_remid() argument
5514 lkb = search_remid_list(&r->res_grantqueue, nodeid, remid); in search_remid()
5517 lkb = search_remid_list(&r->res_convertqueue, nodeid, remid); in search_remid()
5520 lkb = search_remid_list(&r->res_waitqueue, nodeid, remid); in search_remid()
5528 struct dlm_rsb *r, const struct dlm_rcom *rc) in receive_rcom_lock_args() argument
5566 rsb_set_flag(r, RSB_RECOVER_CONVERT); in receive_rcom_lock_args()
5583 struct dlm_rsb *r; in dlm_recover_master_copy() local
5608 from_nodeid, R_RECEIVE_RECOVER, &r); in dlm_recover_master_copy()
5612 lock_rsb(r); in dlm_recover_master_copy()
5614 if (dlm_no_directory(ls) && (dlm_dir_nodeid(r) != dlm_our_nodeid())) { in dlm_recover_master_copy()
5621 lkb = search_remid(r, from_nodeid, remid); in dlm_recover_master_copy()
5631 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5637 attach_lkb(r, lkb); in dlm_recover_master_copy()
5638 add_lkb(r, lkb, rl->rl_status); in dlm_recover_master_copy()
5641 if (!list_empty(&r->res_waitqueue) || !list_empty(&r->res_convertqueue)) in dlm_recover_master_copy()
5642 rsb_set_flag(r, RSB_RECOVER_GRANT); in dlm_recover_master_copy()
5652 unlock_rsb(r); in dlm_recover_master_copy()
5653 put_rsb(r); in dlm_recover_master_copy()
5667 struct dlm_rsb *r; in dlm_recover_process_copy() local
5684 r = lkb->lkb_resource; in dlm_recover_process_copy()
5685 hold_rsb(r); in dlm_recover_process_copy()
5686 lock_rsb(r); in dlm_recover_process_copy()
5692 dlm_dump_rsb(r); in dlm_recover_process_copy()
5693 unlock_rsb(r); in dlm_recover_process_copy()
5694 put_rsb(r); in dlm_recover_process_copy()
5709 dlm_send_rcom_lock(r, lkb, seq); in dlm_recover_process_copy()
5723 dlm_recovered_lock(r); in dlm_recover_process_copy()
5725 unlock_rsb(r); in dlm_recover_process_copy()
5726 put_rsb(r); in dlm_recover_process_copy()
6026 struct dlm_rsb *r; in dlm_user_deadlock() local
6045 r = lkb->lkb_resource; in dlm_user_deadlock()
6046 hold_rsb(r); in dlm_user_deadlock()
6047 lock_rsb(r); in dlm_user_deadlock()
6054 error = _cancel_lock(r, lkb); in dlm_user_deadlock()
6056 unlock_rsb(r); in dlm_user_deadlock()
6057 put_rsb(r); in dlm_user_deadlock()
6284 struct dlm_rsb *r; in dlm_debug_add_lkb() local
6308 error = find_rsb(ls, name, len, 0, R_REQUEST, &r); in dlm_debug_add_lkb()
6315 lock_rsb(r); in dlm_debug_add_lkb()
6316 attach_lkb(r, lkb); in dlm_debug_add_lkb()
6317 add_lkb(r, lkb, lkb_status); in dlm_debug_add_lkb()
6318 unlock_rsb(r); in dlm_debug_add_lkb()
6319 put_rsb(r); in dlm_debug_add_lkb()