Lines Matching refs:r

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,
172 static void dlm_print_rsb(struct dlm_rsb *r) in dlm_print_rsb() argument
176 r->res_nodeid, r->res_master_nodeid, r->res_dir_nodeid, in dlm_print_rsb()
177 r->res_flags, r->res_first_lkid, r->res_recover_locks_count, in dlm_print_rsb()
178 r->res_name); in dlm_print_rsb()
181 void dlm_dump_rsb(struct dlm_rsb *r) in dlm_dump_rsb() argument
185 dlm_print_rsb(r); in dlm_dump_rsb()
188 list_empty(&r->res_root_list), list_empty(&r->res_recover_list)); in dlm_dump_rsb()
190 list_for_each_entry(lkb, &r->res_lookup, lkb_rsb_lookup) in dlm_dump_rsb()
193 list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) in dlm_dump_rsb()
196 list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) in dlm_dump_rsb()
199 list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) in dlm_dump_rsb()
245 static inline int is_remote(struct dlm_rsb *r) in is_remote() argument
247 DLM_ASSERT(r->res_nodeid >= 0, dlm_print_rsb(r);); in is_remote()
248 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
314 static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) in queue_cast_overlap() argument
316 queue_cast(r, lkb, in queue_cast_overlap()
320 static void queue_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rqmode) in queue_bast() argument
323 send_bast(r, lkb, rqmode); in queue_bast()
336 static inline void hold_rsb(struct dlm_rsb *r) in hold_rsb() argument
338 kref_get(&r->res_ref); in hold_rsb()
341 void dlm_hold_rsb(struct dlm_rsb *r) in dlm_hold_rsb() argument
343 hold_rsb(r); in dlm_hold_rsb()
349 static void put_rsb(struct dlm_rsb *r) in put_rsb() argument
351 struct dlm_ls *ls = r->res_ls; in put_rsb()
352 uint32_t bucket = r->res_bucket; in put_rsb()
355 kref_put(&r->res_ref, toss_rsb); in put_rsb()
359 void dlm_put_rsb(struct dlm_rsb *r) in dlm_put_rsb() argument
361 put_rsb(r); in dlm_put_rsb()
403 struct dlm_rsb *r; in get_rsb_struct() local
415 r = list_first_entry(&ls->ls_new_rsb, struct dlm_rsb, res_hashchain); in get_rsb_struct()
416 list_del(&r->res_hashchain); in get_rsb_struct()
418 memset(&r->res_hashnode, 0, sizeof(struct rb_node)); in get_rsb_struct()
422 r->res_ls = ls; in get_rsb_struct()
423 r->res_length = len; in get_rsb_struct()
424 memcpy(r->res_name, name, len); in get_rsb_struct()
425 mutex_init(&r->res_mutex); in get_rsb_struct()
427 INIT_LIST_HEAD(&r->res_lookup); in get_rsb_struct()
428 INIT_LIST_HEAD(&r->res_grantqueue); in get_rsb_struct()
429 INIT_LIST_HEAD(&r->res_convertqueue); in get_rsb_struct()
430 INIT_LIST_HEAD(&r->res_waitqueue); in get_rsb_struct()
431 INIT_LIST_HEAD(&r->res_root_list); in get_rsb_struct()
432 INIT_LIST_HEAD(&r->res_recover_list); in get_rsb_struct()
434 *r_ret = r; in get_rsb_struct()
438 static int rsb_cmp(struct dlm_rsb *r, const char *name, int nlen) in rsb_cmp() argument
444 return memcmp(r->res_name, maxname, DLM_RESNAME_MAXLEN); in rsb_cmp()
451 struct dlm_rsb *r; in dlm_search_rsb_tree() local
455 r = rb_entry(node, struct dlm_rsb, res_hashnode); in dlm_search_rsb_tree()
456 rc = rsb_cmp(r, name, len); in dlm_search_rsb_tree()
468 *r_ret = r; in dlm_search_rsb_tree()
550 struct dlm_rsb *r = NULL; in find_rsb_dir() local
596 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_dir()
604 kref_get(&r->res_ref); in find_rsb_dir()
610 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_dir()
621 if ((r->res_master_nodeid != our_nodeid) && from_other) { in find_rsb_dir()
625 from_nodeid, r->res_master_nodeid, dir_nodeid, in find_rsb_dir()
626 r->res_name); in find_rsb_dir()
631 if ((r->res_master_nodeid != our_nodeid) && from_dir) { in find_rsb_dir()
634 from_nodeid, r->res_master_nodeid); in find_rsb_dir()
635 dlm_print_rsb(r); in find_rsb_dir()
637 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
638 r->res_nodeid = 0; in find_rsb_dir()
639 rsb_clear_flag(r, RSB_MASTER_UNCERTAIN); in find_rsb_dir()
640 r->res_first_lkid = 0; in find_rsb_dir()
643 if (from_local && (r->res_master_nodeid != our_nodeid)) { in find_rsb_dir()
646 rsb_set_flag(r, RSB_MASTER_UNCERTAIN); in find_rsb_dir()
647 r->res_first_lkid = 0; in find_rsb_dir()
650 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_dir()
651 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
663 error = get_rsb_struct(ls, name, len, &r); in find_rsb_dir()
671 r->res_hash = hash; in find_rsb_dir()
672 r->res_bucket = b; in find_rsb_dir()
673 r->res_dir_nodeid = dir_nodeid; in find_rsb_dir()
674 kref_init(&r->res_ref); in find_rsb_dir()
679 from_nodeid, r->res_name); in find_rsb_dir()
680 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
681 r->res_nodeid = 0; in find_rsb_dir()
688 from_nodeid, dir_nodeid, our_nodeid, r->res_name); in find_rsb_dir()
689 dlm_free_rsb(r); in find_rsb_dir()
690 r = NULL; in find_rsb_dir()
697 from_nodeid, dir_nodeid, r->res_name); in find_rsb_dir()
703 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
704 r->res_nodeid = 0; in find_rsb_dir()
707 r->res_master_nodeid = 0; in find_rsb_dir()
708 r->res_nodeid = -1; in find_rsb_dir()
712 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
716 *r_ret = r; in find_rsb_dir()
729 struct dlm_rsb *r = NULL; in find_rsb_nodir() local
741 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_nodir()
749 kref_get(&r->res_ref); in find_rsb_nodir()
754 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_nodir()
764 if (!recover && (r->res_master_nodeid != our_nodeid) && from_nodeid) { in find_rsb_nodir()
768 from_nodeid, r->res_master_nodeid, dir_nodeid); in find_rsb_nodir()
769 dlm_print_rsb(r); in find_rsb_nodir()
774 if (!recover && (r->res_master_nodeid != our_nodeid) && in find_rsb_nodir()
779 our_nodeid, r->res_master_nodeid, dir_nodeid); in find_rsb_nodir()
780 dlm_print_rsb(r); in find_rsb_nodir()
781 r->res_master_nodeid = our_nodeid; in find_rsb_nodir()
782 r->res_nodeid = 0; in find_rsb_nodir()
785 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_nodir()
786 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
795 error = get_rsb_struct(ls, name, len, &r); in find_rsb_nodir()
803 r->res_hash = hash; in find_rsb_nodir()
804 r->res_bucket = b; in find_rsb_nodir()
805 r->res_dir_nodeid = dir_nodeid; in find_rsb_nodir()
806 r->res_master_nodeid = dir_nodeid; in find_rsb_nodir()
807 r->res_nodeid = (dir_nodeid == our_nodeid) ? 0 : dir_nodeid; in find_rsb_nodir()
808 kref_init(&r->res_ref); in find_rsb_nodir()
810 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
814 *r_ret = r; in find_rsb_nodir()
843 static int validate_master_nodeid(struct dlm_ls *ls, struct dlm_rsb *r, in validate_master_nodeid() argument
848 from_nodeid, r->res_master_nodeid, in validate_master_nodeid()
849 r->res_dir_nodeid); in validate_master_nodeid()
850 dlm_print_rsb(r); in validate_master_nodeid()
854 if (from_nodeid != r->res_dir_nodeid) { in validate_master_nodeid()
859 if (r->res_master_nodeid) { in validate_master_nodeid()
862 r->res_master_nodeid, r->res_dir_nodeid, in validate_master_nodeid()
863 r->res_first_lkid, r->res_name); in validate_master_nodeid()
870 if (r->res_master_nodeid) { in validate_master_nodeid()
873 from_nodeid, r->res_master_nodeid, in validate_master_nodeid()
874 r->res_first_lkid, r->res_name); in validate_master_nodeid()
877 r->res_master_nodeid = dlm_our_nodeid(); in validate_master_nodeid()
878 r->res_nodeid = 0; in validate_master_nodeid()
915 struct dlm_rsb *r = NULL; in dlm_master_lookup() local
949 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_master_lookup()
954 hold_rsb(r); in dlm_master_lookup()
956 lock_rsb(r); in dlm_master_lookup()
960 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_master_lookup()
969 if (r->res_dir_nodeid != our_nodeid) { in dlm_master_lookup()
972 r->res_dir_nodeid, our_nodeid, r->res_name); in dlm_master_lookup()
973 r->res_dir_nodeid = our_nodeid; in dlm_master_lookup()
976 if (fix_master && dlm_is_removed(ls, r->res_master_nodeid)) { in dlm_master_lookup()
982 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
983 r->res_nodeid = from_nodeid; in dlm_master_lookup()
984 rsb_set_flag(r, RSB_NEW_MASTER); in dlm_master_lookup()
989 dlm_dump_rsb(r); in dlm_master_lookup()
993 if (from_master && (r->res_master_nodeid != from_nodeid)) { in dlm_master_lookup()
1000 from_nodeid, r->res_master_nodeid, r->res_nodeid, in dlm_master_lookup()
1001 r->res_first_lkid, r->res_name); in dlm_master_lookup()
1003 if (r->res_master_nodeid == our_nodeid) { in dlm_master_lookup()
1005 dlm_dump_rsb(r); in dlm_master_lookup()
1009 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
1010 r->res_nodeid = from_nodeid; in dlm_master_lookup()
1011 rsb_set_flag(r, RSB_NEW_MASTER); in dlm_master_lookup()
1014 if (!r->res_master_nodeid) { in dlm_master_lookup()
1019 from_nodeid, r->res_first_lkid, r->res_name); in dlm_master_lookup()
1020 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
1021 r->res_nodeid = from_nodeid; in dlm_master_lookup()
1025 (r->res_master_nodeid == from_nodeid)) { in dlm_master_lookup()
1032 r->res_first_lkid, r->res_name); in dlm_master_lookup()
1036 *r_nodeid = r->res_master_nodeid; in dlm_master_lookup()
1041 r->res_toss_time = jiffies; in dlm_master_lookup()
1046 unlock_rsb(r); in dlm_master_lookup()
1047 put_rsb(r); in dlm_master_lookup()
1052 error = get_rsb_struct(ls, name, len, &r); in dlm_master_lookup()
1060 r->res_hash = hash; in dlm_master_lookup()
1061 r->res_bucket = b; in dlm_master_lookup()
1062 r->res_dir_nodeid = our_nodeid; in dlm_master_lookup()
1063 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
1064 r->res_nodeid = from_nodeid; in dlm_master_lookup()
1065 kref_init(&r->res_ref); in dlm_master_lookup()
1066 r->res_toss_time = jiffies; in dlm_master_lookup()
1068 error = rsb_insert(r, &ls->ls_rsbtbl[b].toss); in dlm_master_lookup()
1071 dlm_free_rsb(r); in dlm_master_lookup()
1088 struct dlm_rsb *r; in dlm_dump_rsb_hash() local
1094 r = rb_entry(n, struct dlm_rsb, res_hashnode); in dlm_dump_rsb_hash()
1095 if (r->res_hash == hash) in dlm_dump_rsb_hash()
1096 dlm_dump_rsb(r); in dlm_dump_rsb_hash()
1104 struct dlm_rsb *r = NULL; in dlm_dump_rsb_name() local
1112 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_dump_rsb_name()
1116 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_dump_rsb_name()
1120 dlm_dump_rsb(r); in dlm_dump_rsb_name()
1127 struct dlm_rsb *r = container_of(kref, struct dlm_rsb, res_ref); in toss_rsb() local
1128 struct dlm_ls *ls = r->res_ls; in toss_rsb()
1130 DLM_ASSERT(list_empty(&r->res_root_list), dlm_print_rsb(r);); in toss_rsb()
1131 kref_init(&r->res_ref); in toss_rsb()
1132 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[r->res_bucket].keep); in toss_rsb()
1133 rsb_insert(r, &ls->ls_rsbtbl[r->res_bucket].toss); in toss_rsb()
1134 r->res_toss_time = jiffies; in toss_rsb()
1135 ls->ls_rsbtbl[r->res_bucket].flags |= DLM_RTF_SHRINK; in toss_rsb()
1136 if (r->res_lvbptr) { in toss_rsb()
1137 dlm_free_lvb(r->res_lvbptr); in toss_rsb()
1138 r->res_lvbptr = NULL; in toss_rsb()
1144 static void unhold_rsb(struct dlm_rsb *r) in unhold_rsb() argument
1147 rv = kref_put(&r->res_ref, toss_rsb); in unhold_rsb()
1148 DLM_ASSERT(!rv, dlm_dump_rsb(r);); in unhold_rsb()
1153 struct dlm_rsb *r = container_of(kref, struct dlm_rsb, res_ref); in kill_rsb() local
1158 DLM_ASSERT(list_empty(&r->res_lookup), dlm_dump_rsb(r);); in kill_rsb()
1159 DLM_ASSERT(list_empty(&r->res_grantqueue), dlm_dump_rsb(r);); in kill_rsb()
1160 DLM_ASSERT(list_empty(&r->res_convertqueue), dlm_dump_rsb(r);); in kill_rsb()
1161 DLM_ASSERT(list_empty(&r->res_waitqueue), dlm_dump_rsb(r);); in kill_rsb()
1162 DLM_ASSERT(list_empty(&r->res_root_list), dlm_dump_rsb(r);); in kill_rsb()
1163 DLM_ASSERT(list_empty(&r->res_recover_list), dlm_dump_rsb(r);); in kill_rsb()
1169 static void attach_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in attach_lkb() argument
1171 hold_rsb(r); in attach_lkb()
1172 lkb->lkb_resource = r; in attach_lkb()
1313 static void add_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int status) in add_lkb() argument
1326 list_add(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1328 list_add_tail(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1332 lkb_add_ordered(&lkb->lkb_statequeue, &r->res_grantqueue, in add_lkb()
1337 list_add(&lkb->lkb_statequeue, &r->res_convertqueue); in add_lkb()
1340 &r->res_convertqueue); in add_lkb()
1347 static void del_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in del_lkb() argument
1354 static void move_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int sts) in move_lkb() argument
1357 del_lkb(r, lkb); in move_lkb()
1358 add_lkb(r, lkb, sts); in move_lkb()
1626 static void wait_pending_remove(struct dlm_rsb *r) in wait_pending_remove() argument
1628 struct dlm_ls *ls = r->res_ls; in wait_pending_remove()
1632 !rsb_cmp(r, ls->ls_remove_name, ls->ls_remove_len)) { in wait_pending_remove()
1634 r->res_dir_nodeid, r->res_name); in wait_pending_remove()
1652 struct dlm_rsb *r; in shrink_bucket() local
1670 r = rb_entry(n, struct dlm_rsb, res_hashnode); in shrink_bucket()
1678 (r->res_master_nodeid != our_nodeid) && in shrink_bucket()
1679 (dlm_dir_nodeid(r) == our_nodeid)) { in shrink_bucket()
1685 if (!time_after_eq(jiffies, r->res_toss_time + in shrink_bucket()
1691 (r->res_master_nodeid == our_nodeid) && in shrink_bucket()
1692 (dlm_dir_nodeid(r) != our_nodeid)) { in shrink_bucket()
1698 ls->ls_remove_lens[remote_count] = r->res_length; in shrink_bucket()
1699 memcpy(ls->ls_remove_names[remote_count], r->res_name, in shrink_bucket()
1708 if (!kref_put(&r->res_ref, kill_rsb)) { in shrink_bucket()
1709 log_error(ls, "tossed rsb in use %s", r->res_name); in shrink_bucket()
1713 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1714 dlm_free_rsb(r); in shrink_bucket()
1742 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in shrink_bucket()
1749 if (r->res_master_nodeid != our_nodeid) { in shrink_bucket()
1752 r->res_master_nodeid, r->res_dir_nodeid, in shrink_bucket()
1757 if (r->res_dir_nodeid == our_nodeid) { in shrink_bucket()
1761 r->res_dir_nodeid, r->res_master_nodeid, in shrink_bucket()
1766 if (!time_after_eq(jiffies, r->res_toss_time + in shrink_bucket()
1770 r->res_toss_time, jiffies, name); in shrink_bucket()
1774 if (!kref_put(&r->res_ref, kill_rsb)) { in shrink_bucket()
1780 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1789 send_remove(r); in shrink_bucket()
1797 dlm_free_rsb(r); in shrink_bucket()
1857 struct dlm_rsb *r; in dlm_scan_timeout() local
1892 r = lkb->lkb_resource; in dlm_scan_timeout()
1893 hold_rsb(r); in dlm_scan_timeout()
1894 lock_rsb(r); in dlm_scan_timeout()
1906 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in dlm_scan_timeout()
1910 _cancel_lock(r, lkb); in dlm_scan_timeout()
1913 unlock_rsb(r); in dlm_scan_timeout()
1914 unhold_rsb(r); in dlm_scan_timeout()
1946 static void set_lvb_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_lock() argument
1948 int b, len = r->res_ls->ls_lvblen; in set_lvb_lock()
1963 if (!r->res_lvbptr) in set_lvb_lock()
1966 memcpy(lkb->lkb_lvbptr, r->res_lvbptr, len); in set_lvb_lock()
1967 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1971 rsb_set_flag(r, RSB_VALNOTVALID); in set_lvb_lock()
1981 if (!r->res_lvbptr) in set_lvb_lock()
1982 r->res_lvbptr = dlm_allocate_lvb(r->res_ls); in set_lvb_lock()
1984 if (!r->res_lvbptr) in set_lvb_lock()
1987 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, len); in set_lvb_lock()
1988 r->res_lvbseq++; in set_lvb_lock()
1989 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1990 rsb_clear_flag(r, RSB_VALNOTVALID); in set_lvb_lock()
1993 if (rsb_flag(r, RSB_VALNOTVALID)) in set_lvb_lock()
1997 static void set_lvb_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_unlock() argument
2003 rsb_set_flag(r, RSB_VALNOTVALID); in set_lvb_unlock()
2013 if (!r->res_lvbptr) in set_lvb_unlock()
2014 r->res_lvbptr = dlm_allocate_lvb(r->res_ls); in set_lvb_unlock()
2016 if (!r->res_lvbptr) in set_lvb_unlock()
2019 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in set_lvb_unlock()
2020 r->res_lvbseq++; in set_lvb_unlock()
2021 rsb_clear_flag(r, RSB_VALNOTVALID); in set_lvb_unlock()
2026 static void set_lvb_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in set_lvb_lock_pc() argument
2040 if (len > r->res_ls->ls_lvblen) in set_lvb_lock_pc()
2041 len = r->res_ls->ls_lvblen; in set_lvb_lock_pc()
2057 static void _remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _remove_lock() argument
2059 del_lkb(r, lkb); in _remove_lock()
2066 static void remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock() argument
2068 set_lvb_unlock(r, lkb); in remove_lock()
2069 _remove_lock(r, lkb); in remove_lock()
2072 static void remove_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock_pc() argument
2074 _remove_lock(r, lkb); in remove_lock_pc()
2081 static int revert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock() argument
2091 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in revert_lock()
2095 del_lkb(r, lkb); in revert_lock()
2108 static int revert_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock_pc() argument
2110 return revert_lock(r, lkb); in revert_lock_pc()
2113 static void _grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _grant_lock() argument
2118 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2120 add_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2127 static void grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock() argument
2129 set_lvb_lock(r, lkb); in grant_lock()
2130 _grant_lock(r, lkb); in grant_lock()
2133 static void grant_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in grant_lock_pc() argument
2136 set_lvb_lock_pc(r, lkb, ms); in grant_lock_pc()
2137 _grant_lock(r, lkb); in grant_lock_pc()
2144 static void grant_lock_pending(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock_pending() argument
2146 grant_lock(r, lkb); in grant_lock_pending()
2148 send_grant(r, lkb); in grant_lock_pending()
2150 queue_cast(r, lkb, 0); in grant_lock_pending()
2257 static int conversion_deadlock_detect(struct dlm_rsb *r, struct dlm_lkb *lkb2) in conversion_deadlock_detect() argument
2262 list_for_each_entry(lkb1, &r->res_convertqueue, lkb_statequeue) { in conversion_deadlock_detect()
2296 static int _can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in _can_be_granted() argument
2328 if (queue_conflict(&r->res_grantqueue, lkb)) in _can_be_granted()
2337 if (queue_conflict(&r->res_convertqueue, lkb)) in _can_be_granted()
2389 if (list_empty(&r->res_convertqueue)) in _can_be_granted()
2409 if (!now && conv && first_in_list(lkb, &r->res_convertqueue)) in _can_be_granted()
2423 if (now && !conv && list_empty(&r->res_convertqueue) && in _can_be_granted()
2424 list_empty(&r->res_waitqueue)) in _can_be_granted()
2435 if (!now && !conv && list_empty(&r->res_convertqueue) && in _can_be_granted()
2436 first_in_list(lkb, &r->res_waitqueue)) in _can_be_granted()
2442 static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in can_be_granted() argument
2452 rv = _can_be_granted(r, lkb, now, recover); in can_be_granted()
2463 conversion_deadlock_detect(r, lkb)) { in can_be_granted()
2472 dlm_dump_rsb(r); in can_be_granted()
2491 rv = _can_be_granted(r, lkb, now, 0); in can_be_granted()
2504 static int grant_pending_convert(struct dlm_rsb *r, int high, int *cw, in grant_pending_convert() argument
2508 int recover = rsb_flag(r, RSB_RECOVER_GRANT); in grant_pending_convert()
2518 list_for_each_entry_safe(lkb, s, &r->res_convertqueue, lkb_statequeue) { in grant_pending_convert()
2522 if (can_be_granted(r, lkb, 0, recover, &deadlk)) { in grant_pending_convert()
2523 grant_lock_pending(r, lkb); in grant_pending_convert()
2532 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in grant_pending_convert()
2545 queue_bast(r, lkb, lkb->lkb_rqmode); in grant_pending_convert()
2551 r->res_name); in grant_pending_convert()
2552 dlm_dump_rsb(r); in grant_pending_convert()
2573 static int grant_pending_wait(struct dlm_rsb *r, int high, int *cw, in grant_pending_wait() argument
2578 list_for_each_entry_safe(lkb, s, &r->res_waitqueue, lkb_statequeue) { in grant_pending_wait()
2579 if (can_be_granted(r, lkb, 0, 0, NULL)) { in grant_pending_wait()
2580 grant_lock_pending(r, lkb); in grant_pending_wait()
2612 static void grant_pending_locks(struct dlm_rsb *r, unsigned int *count) in grant_pending_locks() argument
2618 if (!is_master(r)) { in grant_pending_locks()
2619 log_print("grant_pending_locks r nodeid %d", r->res_nodeid); in grant_pending_locks()
2620 dlm_dump_rsb(r); in grant_pending_locks()
2624 high = grant_pending_convert(r, high, &cw, count); in grant_pending_locks()
2625 high = grant_pending_wait(r, high, &cw, count); in grant_pending_locks()
2636 list_for_each_entry_safe(lkb, s, &r->res_grantqueue, lkb_statequeue) { in grant_pending_locks()
2640 queue_bast(r, lkb, DLM_LOCK_CW); in grant_pending_locks()
2642 queue_bast(r, lkb, high); in grant_pending_locks()
2662 static void send_bast_queue(struct dlm_rsb *r, struct list_head *head, in send_bast_queue() argument
2672 queue_bast(r, gr, lkb->lkb_rqmode); in send_bast_queue()
2678 static void send_blocking_asts(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts() argument
2680 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts()
2683 static void send_blocking_asts_all(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts_all() argument
2685 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts_all()
2686 send_bast_queue(r, &r->res_convertqueue, lkb); in send_blocking_asts_all()
2708 static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_master() argument
2712 if (rsb_flag(r, RSB_MASTER_UNCERTAIN)) { in set_master()
2713 rsb_clear_flag(r, RSB_MASTER_UNCERTAIN); in set_master()
2714 r->res_first_lkid = lkb->lkb_id; in set_master()
2715 lkb->lkb_nodeid = r->res_nodeid; in set_master()
2719 if (r->res_first_lkid && r->res_first_lkid != lkb->lkb_id) { in set_master()
2720 list_add_tail(&lkb->lkb_rsb_lookup, &r->res_lookup); in set_master()
2724 if (r->res_master_nodeid == our_nodeid) { in set_master()
2729 if (r->res_master_nodeid) { in set_master()
2730 lkb->lkb_nodeid = r->res_master_nodeid; in set_master()
2734 if (dlm_dir_nodeid(r) == our_nodeid) { in set_master()
2741 log_debug(r->res_ls, "set_master %x self master %d dir %d %s", in set_master()
2742 lkb->lkb_id, r->res_master_nodeid, r->res_dir_nodeid, in set_master()
2743 r->res_name); in set_master()
2744 r->res_master_nodeid = our_nodeid; in set_master()
2745 r->res_nodeid = 0; in set_master()
2750 wait_pending_remove(r); in set_master()
2752 r->res_first_lkid = lkb->lkb_id; in set_master()
2753 send_lookup(r, lkb); in set_master()
2757 static void process_lookup_list(struct dlm_rsb *r) in process_lookup_list() argument
2761 list_for_each_entry_safe(lkb, safe, &r->res_lookup, lkb_rsb_lookup) { in process_lookup_list()
2763 _request_lock(r, lkb); in process_lookup_list()
2770 static void confirm_master(struct dlm_rsb *r, int error) in confirm_master() argument
2774 if (!r->res_first_lkid) in confirm_master()
2780 r->res_first_lkid = 0; in confirm_master()
2781 process_lookup_list(r); in confirm_master()
2791 r->res_first_lkid = 0; in confirm_master()
2793 if (!list_empty(&r->res_lookup)) { in confirm_master()
2794 lkb = list_entry(r->res_lookup.next, struct dlm_lkb, in confirm_master()
2797 r->res_first_lkid = lkb->lkb_id; in confirm_master()
2798 _request_lock(r, lkb); in confirm_master()
2803 log_error(r->res_ls, "confirm_master unknown error %d", error); in confirm_master()
3075 static int do_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_request() argument
3079 if (can_be_granted(r, lkb, 1, 0, NULL)) { in do_request()
3080 grant_lock(r, lkb); in do_request()
3081 queue_cast(r, lkb, 0); in do_request()
3087 add_lkb(r, lkb, DLM_LKSTS_WAITING); in do_request()
3093 queue_cast(r, lkb, -EAGAIN); in do_request()
3098 static void do_request_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_request_effects() argument
3104 send_blocking_asts_all(r, lkb); in do_request_effects()
3107 send_blocking_asts(r, lkb); in do_request_effects()
3112 static int do_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_convert() argument
3119 if (can_be_granted(r, lkb, 1, 0, &deadlk)) { in do_convert()
3120 grant_lock(r, lkb); in do_convert()
3121 queue_cast(r, lkb, 0); in do_convert()
3131 revert_lock(r, lkb); in do_convert()
3132 queue_cast(r, lkb, -EDEADLK); in do_convert()
3144 grant_pending_convert(r, DLM_LOCK_IV, NULL, NULL); in do_convert()
3145 if (_can_be_granted(r, lkb, 1, 0)) { in do_convert()
3146 grant_lock(r, lkb); in do_convert()
3147 queue_cast(r, lkb, 0); in do_convert()
3155 del_lkb(r, lkb); in do_convert()
3156 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in do_convert()
3162 queue_cast(r, lkb, -EAGAIN); in do_convert()
3167 static void do_convert_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_convert_effects() argument
3172 grant_pending_locks(r, NULL); in do_convert_effects()
3177 send_blocking_asts_all(r, lkb); in do_convert_effects()
3180 send_blocking_asts(r, lkb); in do_convert_effects()
3185 static int do_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_unlock() argument
3187 remove_lock(r, lkb); in do_unlock()
3188 queue_cast(r, lkb, -DLM_EUNLOCK); in do_unlock()
3192 static void do_unlock_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_unlock_effects() argument
3195 grant_pending_locks(r, NULL); in do_unlock_effects()
3200 static int do_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_cancel() argument
3204 error = revert_lock(r, lkb); in do_cancel()
3206 queue_cast(r, lkb, -DLM_ECANCEL); in do_cancel()
3212 static void do_cancel_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_cancel_effects() argument
3216 grant_pending_locks(r, NULL); in do_cancel_effects()
3226 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _request_lock() argument
3232 error = set_master(r, lkb); in _request_lock()
3240 if (is_remote(r)) { in _request_lock()
3242 error = send_request(r, lkb); in _request_lock()
3244 error = do_request(r, lkb); in _request_lock()
3247 do_request_effects(r, lkb, error); in _request_lock()
3255 static int _convert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _convert_lock() argument
3259 if (is_remote(r)) { in _convert_lock()
3261 error = send_convert(r, lkb); in _convert_lock()
3263 error = do_convert(r, lkb); in _convert_lock()
3266 do_convert_effects(r, lkb, error); in _convert_lock()
3274 static int _unlock_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _unlock_lock() argument
3278 if (is_remote(r)) { in _unlock_lock()
3280 error = send_unlock(r, lkb); in _unlock_lock()
3282 error = do_unlock(r, lkb); in _unlock_lock()
3285 do_unlock_effects(r, lkb, error); in _unlock_lock()
3293 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _cancel_lock() argument
3297 if (is_remote(r)) { in _cancel_lock()
3299 error = send_cancel(r, lkb); in _cancel_lock()
3301 error = do_cancel(r, lkb); in _cancel_lock()
3304 do_cancel_effects(r, lkb, error); in _cancel_lock()
3318 struct dlm_rsb *r; in request_lock() local
3325 error = find_rsb(ls, name, len, 0, R_REQUEST, &r); in request_lock()
3329 lock_rsb(r); in request_lock()
3331 attach_lkb(r, lkb); in request_lock()
3334 error = _request_lock(r, lkb); in request_lock()
3336 unlock_rsb(r); in request_lock()
3337 put_rsb(r); in request_lock()
3344 struct dlm_rsb *r; in convert_lock() local
3347 r = lkb->lkb_resource; in convert_lock()
3349 hold_rsb(r); in convert_lock()
3350 lock_rsb(r); in convert_lock()
3356 error = _convert_lock(r, lkb); in convert_lock()
3358 unlock_rsb(r); in convert_lock()
3359 put_rsb(r); in convert_lock()
3366 struct dlm_rsb *r; in unlock_lock() local
3369 r = lkb->lkb_resource; in unlock_lock()
3371 hold_rsb(r); in unlock_lock()
3372 lock_rsb(r); in unlock_lock()
3378 error = _unlock_lock(r, lkb); in unlock_lock()
3380 unlock_rsb(r); in unlock_lock()
3381 put_rsb(r); in unlock_lock()
3388 struct dlm_rsb *r; in cancel_lock() local
3391 r = lkb->lkb_resource; in cancel_lock()
3393 hold_rsb(r); in cancel_lock()
3394 lock_rsb(r); in cancel_lock()
3400 error = _cancel_lock(r, lkb); in cancel_lock()
3402 unlock_rsb(r); in cancel_lock()
3403 put_rsb(r); in cancel_lock()
3562 static int create_message(struct dlm_rsb *r, struct dlm_lkb *lkb, in create_message() argument
3573 mb_len += r->res_length; in create_message()
3581 mb_len += r->res_ls->ls_lvblen; in create_message()
3585 return _create_message(r->res_ls, mb_len, to_nodeid, mstype, in create_message()
3599 static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_args() argument
3613 ms->m_hash = r->res_hash; in send_args()
3629 memcpy(ms->m_extra, r->res_name, r->res_length); in send_args()
3638 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in send_args()
3643 static int send_common(struct dlm_rsb *r, struct dlm_lkb *lkb, int mstype) in send_common() argument
3649 to_nodeid = r->res_nodeid; in send_common()
3655 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common()
3659 send_args(r, lkb, ms); in send_common()
3671 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_request() argument
3673 return send_common(r, lkb, DLM_MSG_REQUEST); in send_request()
3676 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_convert() argument
3680 error = send_common(r, lkb, DLM_MSG_CONVERT); in send_convert()
3685 r->res_ls->ls_stub_ms.m_flags = DLM_IFL_STUB_MS; in send_convert()
3686 r->res_ls->ls_stub_ms.m_type = DLM_MSG_CONVERT_REPLY; in send_convert()
3687 r->res_ls->ls_stub_ms.m_result = 0; in send_convert()
3688 __receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms); in send_convert()
3698 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_unlock() argument
3700 return send_common(r, lkb, DLM_MSG_UNLOCK); in send_unlock()
3703 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_cancel() argument
3705 return send_common(r, lkb, DLM_MSG_CANCEL); in send_cancel()
3708 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_grant() argument
3716 error = create_message(r, lkb, to_nodeid, DLM_MSG_GRANT, &ms, &mh); in send_grant()
3720 send_args(r, lkb, ms); in send_grant()
3729 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode) in send_bast() argument
3737 error = create_message(r, NULL, to_nodeid, DLM_MSG_BAST, &ms, &mh); in send_bast()
3741 send_args(r, lkb, ms); in send_bast()
3750 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_lookup() argument
3756 to_nodeid = dlm_dir_nodeid(r); in send_lookup()
3762 error = create_message(r, NULL, to_nodeid, DLM_MSG_LOOKUP, &ms, &mh); in send_lookup()
3766 send_args(r, lkb, ms); in send_lookup()
3778 static int send_remove(struct dlm_rsb *r) in send_remove() argument
3784 to_nodeid = dlm_dir_nodeid(r); in send_remove()
3786 error = create_message(r, NULL, to_nodeid, DLM_MSG_REMOVE, &ms, &mh); in send_remove()
3790 memcpy(ms->m_extra, r->res_name, r->res_length); in send_remove()
3791 ms->m_hash = r->res_hash; in send_remove()
3798 static int send_common_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_common_reply() argument
3807 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common_reply()
3811 send_args(r, lkb, ms); in send_common_reply()
3820 static int send_request_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_request_reply() argument
3822 return send_common_reply(r, lkb, DLM_MSG_REQUEST_REPLY, rv); in send_request_reply()
3825 static int send_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_convert_reply() argument
3827 return send_common_reply(r, lkb, DLM_MSG_CONVERT_REPLY, rv); in send_convert_reply()
3830 static int send_unlock_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_unlock_reply() argument
3832 return send_common_reply(r, lkb, DLM_MSG_UNLOCK_REPLY, rv); in send_unlock_reply()
3835 static int send_cancel_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_cancel_reply() argument
3837 return send_common_reply(r, lkb, DLM_MSG_CANCEL_REPLY, rv); in send_cancel_reply()
3843 struct dlm_rsb *r = &ls->ls_stub_rsb; in send_lookup_reply() local
3848 error = create_message(r, NULL, nodeid, DLM_MSG_LOOKUP_REPLY, &ms, &mh); in send_lookup_reply()
4020 struct dlm_rsb *r; in send_repeat_remove() local
4035 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in send_repeat_remove()
4042 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in send_repeat_remove()
4076 struct dlm_rsb *r; in receive_request() local
4103 R_RECEIVE_REQUEST, &r); in receive_request()
4109 lock_rsb(r); in receive_request()
4111 if (r->res_master_nodeid != dlm_our_nodeid()) { in receive_request()
4112 error = validate_master_nodeid(ls, r, from_nodeid); in receive_request()
4114 unlock_rsb(r); in receive_request()
4115 put_rsb(r); in receive_request()
4121 attach_lkb(r, lkb); in receive_request()
4122 error = do_request(r, lkb); in receive_request()
4123 send_request_reply(r, lkb, error); in receive_request()
4124 do_request_effects(r, lkb, error); in receive_request()
4126 unlock_rsb(r); in receive_request()
4127 put_rsb(r); in receive_request()
4169 struct dlm_rsb *r; in receive_convert() local
4185 r = lkb->lkb_resource; in receive_convert()
4187 hold_rsb(r); in receive_convert()
4188 lock_rsb(r); in receive_convert()
4198 send_convert_reply(r, lkb, error); in receive_convert()
4204 error = do_convert(r, lkb); in receive_convert()
4206 send_convert_reply(r, lkb, error); in receive_convert()
4207 do_convert_effects(r, lkb, error); in receive_convert()
4209 unlock_rsb(r); in receive_convert()
4210 put_rsb(r); in receive_convert()
4223 struct dlm_rsb *r; in receive_unlock() local
4238 r = lkb->lkb_resource; in receive_unlock()
4240 hold_rsb(r); in receive_unlock()
4241 lock_rsb(r); in receive_unlock()
4251 send_unlock_reply(r, lkb, error); in receive_unlock()
4255 error = do_unlock(r, lkb); in receive_unlock()
4256 send_unlock_reply(r, lkb, error); in receive_unlock()
4257 do_unlock_effects(r, lkb, error); in receive_unlock()
4259 unlock_rsb(r); in receive_unlock()
4260 put_rsb(r); in receive_unlock()
4273 struct dlm_rsb *r; in receive_cancel() local
4282 r = lkb->lkb_resource; in receive_cancel()
4284 hold_rsb(r); in receive_cancel()
4285 lock_rsb(r); in receive_cancel()
4291 error = do_cancel(r, lkb); in receive_cancel()
4292 send_cancel_reply(r, lkb, error); in receive_cancel()
4293 do_cancel_effects(r, lkb, error); in receive_cancel()
4295 unlock_rsb(r); in receive_cancel()
4296 put_rsb(r); in receive_cancel()
4309 struct dlm_rsb *r; in receive_grant() local
4316 r = lkb->lkb_resource; in receive_grant()
4318 hold_rsb(r); in receive_grant()
4319 lock_rsb(r); in receive_grant()
4328 grant_lock_pc(r, lkb, ms); in receive_grant()
4329 queue_cast(r, lkb, 0); in receive_grant()
4331 unlock_rsb(r); in receive_grant()
4332 put_rsb(r); in receive_grant()
4340 struct dlm_rsb *r; in receive_bast() local
4347 r = lkb->lkb_resource; in receive_bast()
4349 hold_rsb(r); in receive_bast()
4350 lock_rsb(r); in receive_bast()
4356 queue_bast(r, lkb, ms->m_bastmode); in receive_bast()
4359 unlock_rsb(r); in receive_bast()
4360 put_rsb(r); in receive_bast()
4388 struct dlm_rsb *r; in receive_remove() local
4426 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in receive_remove()
4429 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in receive_remove()
4437 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4440 from_nodeid, r->res_master_nodeid); in receive_remove()
4441 dlm_print_rsb(r); in receive_remove()
4447 from_nodeid, r->res_master_nodeid, r->res_first_lkid, in receive_remove()
4453 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4455 from_nodeid, r->res_master_nodeid); in receive_remove()
4456 dlm_print_rsb(r); in receive_remove()
4461 if (kref_put(&r->res_ref, kill_rsb)) { in receive_remove()
4462 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in receive_remove()
4464 dlm_free_rsb(r); in receive_remove()
4468 dlm_print_rsb(r); in receive_remove()
4481 struct dlm_rsb *r; in receive_request_reply() local
4489 r = lkb->lkb_resource; in receive_request_reply()
4490 hold_rsb(r); in receive_request_reply()
4491 lock_rsb(r); in receive_request_reply()
4502 dlm_dump_rsb(r); in receive_request_reply()
4509 r->res_master_nodeid = from_nodeid; in receive_request_reply()
4510 r->res_nodeid = from_nodeid; in receive_request_reply()
4520 queue_cast(r, lkb, -EAGAIN); in receive_request_reply()
4521 confirm_master(r, -EAGAIN); in receive_request_reply()
4533 add_lkb(r, lkb, DLM_LKSTS_WAITING); in receive_request_reply()
4536 grant_lock_pc(r, lkb, ms); in receive_request_reply()
4537 queue_cast(r, lkb, 0); in receive_request_reply()
4539 confirm_master(r, result); in receive_request_reply()
4547 from_nodeid, result, r->res_master_nodeid, in receive_request_reply()
4548 r->res_dir_nodeid, r->res_first_lkid, r->res_name); in receive_request_reply()
4550 if (r->res_dir_nodeid != dlm_our_nodeid() && in receive_request_reply()
4551 r->res_master_nodeid != dlm_our_nodeid()) { in receive_request_reply()
4553 r->res_master_nodeid = 0; in receive_request_reply()
4554 r->res_nodeid = -1; in receive_request_reply()
4560 queue_cast_overlap(r, lkb); in receive_request_reply()
4561 confirm_master(r, result); in receive_request_reply()
4564 _request_lock(r, lkb); in receive_request_reply()
4566 if (r->res_master_nodeid == dlm_our_nodeid()) in receive_request_reply()
4567 confirm_master(r, 0); in receive_request_reply()
4581 send_unlock(r, lkb); in receive_request_reply()
4586 send_cancel(r, lkb); in receive_request_reply()
4592 unlock_rsb(r); in receive_request_reply()
4593 put_rsb(r); in receive_request_reply()
4598 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in __receive_convert_reply() argument
4605 queue_cast(r, lkb, -EAGAIN); in __receive_convert_reply()
4610 revert_lock_pc(r, lkb); in __receive_convert_reply()
4611 queue_cast(r, lkb, -EDEADLK); in __receive_convert_reply()
4619 del_lkb(r, lkb); in __receive_convert_reply()
4620 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in __receive_convert_reply()
4629 grant_lock_pc(r, lkb, ms); in __receive_convert_reply()
4630 queue_cast(r, lkb, 0); in __receive_convert_reply()
4634 log_error(r->res_ls, "receive_convert_reply %x remote %d %x %d", in __receive_convert_reply()
4637 dlm_print_rsb(r); in __receive_convert_reply()
4644 struct dlm_rsb *r = lkb->lkb_resource; in _receive_convert_reply() local
4647 hold_rsb(r); in _receive_convert_reply()
4648 lock_rsb(r); in _receive_convert_reply()
4659 __receive_convert_reply(r, lkb, ms); in _receive_convert_reply()
4661 unlock_rsb(r); in _receive_convert_reply()
4662 put_rsb(r); in _receive_convert_reply()
4681 struct dlm_rsb *r = lkb->lkb_resource; in _receive_unlock_reply() local
4684 hold_rsb(r); in _receive_unlock_reply()
4685 lock_rsb(r); in _receive_unlock_reply()
4701 remove_lock_pc(r, lkb); in _receive_unlock_reply()
4702 queue_cast(r, lkb, -DLM_EUNLOCK); in _receive_unlock_reply()
4707 log_error(r->res_ls, "receive_unlock_reply %x error %d", in _receive_unlock_reply()
4711 unlock_rsb(r); in _receive_unlock_reply()
4712 put_rsb(r); in _receive_unlock_reply()
4731 struct dlm_rsb *r = lkb->lkb_resource; in _receive_cancel_reply() local
4734 hold_rsb(r); in _receive_cancel_reply()
4735 lock_rsb(r); in _receive_cancel_reply()
4751 revert_lock_pc(r, lkb); in _receive_cancel_reply()
4752 queue_cast(r, lkb, -DLM_ECANCEL); in _receive_cancel_reply()
4757 log_error(r->res_ls, "receive_cancel_reply %x error %d", in _receive_cancel_reply()
4761 unlock_rsb(r); in _receive_cancel_reply()
4762 put_rsb(r); in _receive_cancel_reply()
4782 struct dlm_rsb *r; in receive_lookup_reply() local
4795 r = lkb->lkb_resource; in receive_lookup_reply()
4796 hold_rsb(r); in receive_lookup_reply()
4797 lock_rsb(r); in receive_lookup_reply()
4811 if (r->res_master_nodeid && (r->res_master_nodeid != ret_nodeid)) { in receive_lookup_reply()
4816 r->res_master_nodeid, r->res_dir_nodeid, in receive_lookup_reply()
4817 dlm_our_nodeid(), r->res_first_lkid, r->res_name); in receive_lookup_reply()
4821 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4822 r->res_nodeid = 0; in receive_lookup_reply()
4824 r->res_first_lkid = 0; in receive_lookup_reply()
4829 r->res_master_nodeid = 0; in receive_lookup_reply()
4830 r->res_nodeid = -1; in receive_lookup_reply()
4834 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4835 r->res_nodeid = ret_nodeid; in receive_lookup_reply()
4841 queue_cast_overlap(r, lkb); in receive_lookup_reply()
4846 _request_lock(r, lkb); in receive_lookup_reply()
4850 process_lookup_list(r); in receive_lookup_reply()
4852 unlock_rsb(r); in receive_lookup_reply()
4853 put_rsb(r); in receive_lookup_reply()
5268 struct dlm_rsb *r; in dlm_recover_waiters_post() local
5282 r = lkb->lkb_resource; in dlm_recover_waiters_post()
5283 hold_rsb(r); in dlm_recover_waiters_post()
5284 lock_rsb(r); in dlm_recover_waiters_post()
5294 r->res_nodeid, lkb->lkb_nodeid, lkb->lkb_wait_nodeid, in dlm_recover_waiters_post()
5295 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5316 queue_cast(r, lkb, ou ? -DLM_EUNLOCK : in dlm_recover_waiters_post()
5322 queue_cast(r, lkb, -DLM_ECANCEL); in dlm_recover_waiters_post()
5325 _unlock_lock(r, lkb); in dlm_recover_waiters_post()
5335 _request_lock(r, lkb); in dlm_recover_waiters_post()
5336 if (is_master(r)) in dlm_recover_waiters_post()
5337 confirm_master(r, 0); in dlm_recover_waiters_post()
5340 _convert_lock(r, lkb); in dlm_recover_waiters_post()
5350 lkb->lkb_id, mstype, r->res_nodeid, in dlm_recover_waiters_post()
5351 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5353 unlock_rsb(r); in dlm_recover_waiters_post()
5354 put_rsb(r); in dlm_recover_waiters_post()
5361 static void purge_mstcpy_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_mstcpy_list() argument
5376 del_lkb(r, lkb); in purge_mstcpy_list()
5384 void dlm_purge_mstcpy_locks(struct dlm_rsb *r) in dlm_purge_mstcpy_locks() argument
5386 struct dlm_ls *ls = r->res_ls; in dlm_purge_mstcpy_locks()
5388 purge_mstcpy_list(ls, r, &r->res_grantqueue); in dlm_purge_mstcpy_locks()
5389 purge_mstcpy_list(ls, r, &r->res_convertqueue); in dlm_purge_mstcpy_locks()
5390 purge_mstcpy_list(ls, r, &r->res_waitqueue); in dlm_purge_mstcpy_locks()
5393 static void purge_dead_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_dead_list() argument
5410 rsb_set_flag(r, RSB_RECOVER_LVB_INVAL); in purge_dead_list()
5413 del_lkb(r, lkb); in purge_dead_list()
5419 rsb_set_flag(r, RSB_RECOVER_GRANT); in purge_dead_list()
5430 struct dlm_rsb *r; in dlm_recover_purge() local
5448 list_for_each_entry(r, &ls->ls_root_list, res_root_list) { in dlm_recover_purge()
5449 hold_rsb(r); in dlm_recover_purge()
5450 lock_rsb(r); in dlm_recover_purge()
5451 if (is_master(r)) { in dlm_recover_purge()
5452 purge_dead_list(ls, r, &r->res_grantqueue, in dlm_recover_purge()
5454 purge_dead_list(ls, r, &r->res_convertqueue, in dlm_recover_purge()
5456 purge_dead_list(ls, r, &r->res_waitqueue, in dlm_recover_purge()
5459 unlock_rsb(r); in dlm_recover_purge()
5460 unhold_rsb(r); in dlm_recover_purge()
5473 struct dlm_rsb *r; in find_grant_rsb() local
5477 r = rb_entry(n, struct dlm_rsb, res_hashnode); in find_grant_rsb()
5479 if (!rsb_flag(r, RSB_RECOVER_GRANT)) in find_grant_rsb()
5481 if (!is_master(r)) { in find_grant_rsb()
5482 rsb_clear_flag(r, RSB_RECOVER_GRANT); in find_grant_rsb()
5485 hold_rsb(r); in find_grant_rsb()
5487 return r; in find_grant_rsb()
5512 struct dlm_rsb *r; in dlm_recover_grant() local
5519 r = find_grant_rsb(ls, bucket); in dlm_recover_grant()
5520 if (!r) { in dlm_recover_grant()
5528 lock_rsb(r); in dlm_recover_grant()
5530 grant_pending_locks(r, &count); in dlm_recover_grant()
5531 rsb_clear_flag(r, RSB_RECOVER_GRANT); in dlm_recover_grant()
5533 confirm_master(r, 0); in dlm_recover_grant()
5534 unlock_rsb(r); in dlm_recover_grant()
5535 put_rsb(r); in dlm_recover_grant()
5556 static struct dlm_lkb *search_remid(struct dlm_rsb *r, int nodeid, in search_remid() argument
5561 lkb = search_remid_list(&r->res_grantqueue, nodeid, remid); in search_remid()
5564 lkb = search_remid_list(&r->res_convertqueue, nodeid, remid); in search_remid()
5567 lkb = search_remid_list(&r->res_waitqueue, nodeid, remid); in search_remid()
5575 struct dlm_rsb *r, struct dlm_rcom *rc) in receive_rcom_lock_args() argument
5612 rsb_set_flag(r, RSB_RECOVER_CONVERT); in receive_rcom_lock_args()
5628 struct dlm_rsb *r; in dlm_recover_master_copy() local
5650 from_nodeid, R_RECEIVE_RECOVER, &r); in dlm_recover_master_copy()
5654 lock_rsb(r); in dlm_recover_master_copy()
5656 if (dlm_no_directory(ls) && (dlm_dir_nodeid(r) != dlm_our_nodeid())) { in dlm_recover_master_copy()
5663 lkb = search_remid(r, from_nodeid, remid); in dlm_recover_master_copy()
5673 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5679 attach_lkb(r, lkb); in dlm_recover_master_copy()
5680 add_lkb(r, lkb, rl->rl_status); in dlm_recover_master_copy()
5684 if (!list_empty(&r->res_waitqueue) || !list_empty(&r->res_convertqueue)) in dlm_recover_master_copy()
5685 rsb_set_flag(r, RSB_RECOVER_GRANT); in dlm_recover_master_copy()
5695 unlock_rsb(r); in dlm_recover_master_copy()
5696 put_rsb(r); in dlm_recover_master_copy()
5709 struct dlm_rsb *r; in dlm_recover_process_copy() local
5725 r = lkb->lkb_resource; in dlm_recover_process_copy()
5726 hold_rsb(r); in dlm_recover_process_copy()
5727 lock_rsb(r); in dlm_recover_process_copy()
5732 dlm_dump_rsb(r); in dlm_recover_process_copy()
5733 unlock_rsb(r); in dlm_recover_process_copy()
5734 put_rsb(r); in dlm_recover_process_copy()
5748 dlm_send_rcom_lock(r, lkb); in dlm_recover_process_copy()
5761 dlm_recovered_lock(r); in dlm_recover_process_copy()
5763 unlock_rsb(r); in dlm_recover_process_copy()
5764 put_rsb(r); in dlm_recover_process_copy()
6053 struct dlm_rsb *r; in dlm_user_deadlock() local
6070 r = lkb->lkb_resource; in dlm_user_deadlock()
6071 hold_rsb(r); in dlm_user_deadlock()
6072 lock_rsb(r); in dlm_user_deadlock()
6079 error = _cancel_lock(r, lkb); in dlm_user_deadlock()
6081 unlock_rsb(r); in dlm_user_deadlock()
6082 put_rsb(r); in dlm_user_deadlock()