Lines Matching refs:r
76 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb);
77 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb);
78 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb);
79 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb);
80 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb);
81 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode);
82 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb);
83 static int send_remove(struct dlm_rsb *r);
84 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
85 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
86 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
170 static void dlm_print_rsb(struct dlm_rsb *r) in dlm_print_rsb() argument
174 r->res_nodeid, r->res_master_nodeid, r->res_dir_nodeid, in dlm_print_rsb()
175 r->res_flags, r->res_first_lkid, r->res_recover_locks_count, in dlm_print_rsb()
176 r->res_name); in dlm_print_rsb()
179 void dlm_dump_rsb(struct dlm_rsb *r) in dlm_dump_rsb() argument
183 dlm_print_rsb(r); in dlm_dump_rsb()
186 list_empty(&r->res_root_list), list_empty(&r->res_recover_list)); in dlm_dump_rsb()
188 list_for_each_entry(lkb, &r->res_lookup, lkb_rsb_lookup) in dlm_dump_rsb()
191 list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) in dlm_dump_rsb()
194 list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) in dlm_dump_rsb()
197 list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) in dlm_dump_rsb()
243 static inline int is_remote(struct dlm_rsb *r) in is_remote() argument
245 DLM_ASSERT(r->res_nodeid >= 0, dlm_print_rsb(r);); in is_remote()
246 return !!r->res_nodeid; in is_remote()
288 static void queue_cast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in queue_cast() argument
312 static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) in queue_cast_overlap() argument
314 queue_cast(r, lkb, in queue_cast_overlap()
318 static void queue_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rqmode) in queue_bast() argument
321 send_bast(r, lkb, rqmode); in queue_bast()
334 static inline void hold_rsb(struct dlm_rsb *r) in hold_rsb() argument
336 kref_get(&r->res_ref); in hold_rsb()
339 void dlm_hold_rsb(struct dlm_rsb *r) in dlm_hold_rsb() argument
341 hold_rsb(r); in dlm_hold_rsb()
347 static void put_rsb(struct dlm_rsb *r) in put_rsb() argument
349 struct dlm_ls *ls = r->res_ls; in put_rsb()
350 uint32_t bucket = r->res_bucket; in put_rsb()
353 kref_put(&r->res_ref, toss_rsb); in put_rsb()
357 void dlm_put_rsb(struct dlm_rsb *r) in dlm_put_rsb() argument
359 put_rsb(r); in dlm_put_rsb()
401 struct dlm_rsb *r; in get_rsb_struct() local
413 r = list_first_entry(&ls->ls_new_rsb, struct dlm_rsb, res_hashchain); in get_rsb_struct()
414 list_del(&r->res_hashchain); in get_rsb_struct()
416 memset(&r->res_hashnode, 0, sizeof(struct rb_node)); in get_rsb_struct()
420 r->res_ls = ls; in get_rsb_struct()
421 r->res_length = len; in get_rsb_struct()
422 memcpy(r->res_name, name, len); in get_rsb_struct()
423 mutex_init(&r->res_mutex); in get_rsb_struct()
425 INIT_LIST_HEAD(&r->res_lookup); in get_rsb_struct()
426 INIT_LIST_HEAD(&r->res_grantqueue); in get_rsb_struct()
427 INIT_LIST_HEAD(&r->res_convertqueue); in get_rsb_struct()
428 INIT_LIST_HEAD(&r->res_waitqueue); in get_rsb_struct()
429 INIT_LIST_HEAD(&r->res_root_list); in get_rsb_struct()
430 INIT_LIST_HEAD(&r->res_recover_list); in get_rsb_struct()
432 *r_ret = r; in get_rsb_struct()
436 static int rsb_cmp(struct dlm_rsb *r, const char *name, int nlen) in rsb_cmp() argument
442 return memcmp(r->res_name, maxname, DLM_RESNAME_MAXLEN); in rsb_cmp()
449 struct dlm_rsb *r; in dlm_search_rsb_tree() local
453 r = rb_entry(node, struct dlm_rsb, res_hashnode); in dlm_search_rsb_tree()
454 rc = rsb_cmp(r, name, len); in dlm_search_rsb_tree()
466 *r_ret = r; in dlm_search_rsb_tree()
548 struct dlm_rsb *r = NULL; in find_rsb_dir() local
594 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_dir()
602 kref_get(&r->res_ref); in find_rsb_dir()
608 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_dir()
619 if ((r->res_master_nodeid != our_nodeid) && from_other) { in find_rsb_dir()
623 from_nodeid, r->res_master_nodeid, dir_nodeid, in find_rsb_dir()
624 r->res_name); in find_rsb_dir()
629 if ((r->res_master_nodeid != our_nodeid) && from_dir) { in find_rsb_dir()
632 from_nodeid, r->res_master_nodeid); in find_rsb_dir()
633 dlm_print_rsb(r); in find_rsb_dir()
635 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
636 r->res_nodeid = 0; in find_rsb_dir()
637 rsb_clear_flag(r, RSB_MASTER_UNCERTAIN); in find_rsb_dir()
638 r->res_first_lkid = 0; in find_rsb_dir()
641 if (from_local && (r->res_master_nodeid != our_nodeid)) { in find_rsb_dir()
644 rsb_set_flag(r, RSB_MASTER_UNCERTAIN); in find_rsb_dir()
645 r->res_first_lkid = 0; in find_rsb_dir()
648 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_dir()
649 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
661 error = get_rsb_struct(ls, name, len, &r); in find_rsb_dir()
669 r->res_hash = hash; in find_rsb_dir()
670 r->res_bucket = b; in find_rsb_dir()
671 r->res_dir_nodeid = dir_nodeid; in find_rsb_dir()
672 kref_init(&r->res_ref); in find_rsb_dir()
677 from_nodeid, r->res_name); in find_rsb_dir()
678 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
679 r->res_nodeid = 0; in find_rsb_dir()
686 from_nodeid, dir_nodeid, our_nodeid, r->res_name); in find_rsb_dir()
687 dlm_free_rsb(r); in find_rsb_dir()
688 r = NULL; in find_rsb_dir()
695 from_nodeid, dir_nodeid, r->res_name); in find_rsb_dir()
701 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
702 r->res_nodeid = 0; in find_rsb_dir()
705 r->res_master_nodeid = 0; in find_rsb_dir()
706 r->res_nodeid = -1; in find_rsb_dir()
710 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
714 *r_ret = r; in find_rsb_dir()
727 struct dlm_rsb *r = NULL; in find_rsb_nodir() local
739 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_nodir()
747 kref_get(&r->res_ref); in find_rsb_nodir()
752 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_nodir()
762 if (!recover && (r->res_master_nodeid != our_nodeid) && from_nodeid) { in find_rsb_nodir()
766 from_nodeid, r->res_master_nodeid, dir_nodeid); in find_rsb_nodir()
767 dlm_print_rsb(r); in find_rsb_nodir()
772 if (!recover && (r->res_master_nodeid != our_nodeid) && in find_rsb_nodir()
777 our_nodeid, r->res_master_nodeid, dir_nodeid); in find_rsb_nodir()
778 dlm_print_rsb(r); in find_rsb_nodir()
779 r->res_master_nodeid = our_nodeid; in find_rsb_nodir()
780 r->res_nodeid = 0; in find_rsb_nodir()
783 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_nodir()
784 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
793 error = get_rsb_struct(ls, name, len, &r); in find_rsb_nodir()
801 r->res_hash = hash; in find_rsb_nodir()
802 r->res_bucket = b; in find_rsb_nodir()
803 r->res_dir_nodeid = dir_nodeid; in find_rsb_nodir()
804 r->res_master_nodeid = dir_nodeid; in find_rsb_nodir()
805 r->res_nodeid = (dir_nodeid == our_nodeid) ? 0 : dir_nodeid; in find_rsb_nodir()
806 kref_init(&r->res_ref); in find_rsb_nodir()
808 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
812 *r_ret = r; in find_rsb_nodir()
841 static int validate_master_nodeid(struct dlm_ls *ls, struct dlm_rsb *r, in validate_master_nodeid() argument
846 from_nodeid, r->res_master_nodeid, in validate_master_nodeid()
847 r->res_dir_nodeid); in validate_master_nodeid()
848 dlm_print_rsb(r); in validate_master_nodeid()
852 if (from_nodeid != r->res_dir_nodeid) { in validate_master_nodeid()
857 if (r->res_master_nodeid) { in validate_master_nodeid()
860 r->res_master_nodeid, r->res_dir_nodeid, in validate_master_nodeid()
861 r->res_first_lkid, r->res_name); in validate_master_nodeid()
868 if (r->res_master_nodeid) { in validate_master_nodeid()
871 from_nodeid, r->res_master_nodeid, in validate_master_nodeid()
872 r->res_first_lkid, r->res_name); in validate_master_nodeid()
875 r->res_master_nodeid = dlm_our_nodeid(); in validate_master_nodeid()
876 r->res_nodeid = 0; in validate_master_nodeid()
913 struct dlm_rsb *r = NULL; in dlm_master_lookup() local
947 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_master_lookup()
952 hold_rsb(r); in dlm_master_lookup()
954 lock_rsb(r); in dlm_master_lookup()
958 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_master_lookup()
967 if (r->res_dir_nodeid != our_nodeid) { in dlm_master_lookup()
970 r->res_dir_nodeid, our_nodeid, r->res_name); in dlm_master_lookup()
971 r->res_dir_nodeid = our_nodeid; in dlm_master_lookup()
974 if (fix_master && dlm_is_removed(ls, r->res_master_nodeid)) { in dlm_master_lookup()
980 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
981 r->res_nodeid = from_nodeid; in dlm_master_lookup()
982 rsb_set_flag(r, RSB_NEW_MASTER); in dlm_master_lookup()
987 dlm_dump_rsb(r); in dlm_master_lookup()
991 if (from_master && (r->res_master_nodeid != from_nodeid)) { in dlm_master_lookup()
998 from_nodeid, r->res_master_nodeid, r->res_nodeid, in dlm_master_lookup()
999 r->res_first_lkid, r->res_name); in dlm_master_lookup()
1001 if (r->res_master_nodeid == our_nodeid) { in dlm_master_lookup()
1003 dlm_dump_rsb(r); in dlm_master_lookup()
1007 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
1008 r->res_nodeid = from_nodeid; in dlm_master_lookup()
1009 rsb_set_flag(r, RSB_NEW_MASTER); in dlm_master_lookup()
1012 if (!r->res_master_nodeid) { in dlm_master_lookup()
1017 from_nodeid, r->res_first_lkid, r->res_name); in dlm_master_lookup()
1018 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
1019 r->res_nodeid = from_nodeid; in dlm_master_lookup()
1023 (r->res_master_nodeid == from_nodeid)) { in dlm_master_lookup()
1030 r->res_first_lkid, r->res_name); in dlm_master_lookup()
1034 *r_nodeid = r->res_master_nodeid; in dlm_master_lookup()
1039 r->res_toss_time = jiffies; in dlm_master_lookup()
1044 unlock_rsb(r); in dlm_master_lookup()
1045 put_rsb(r); in dlm_master_lookup()
1050 error = get_rsb_struct(ls, name, len, &r); in dlm_master_lookup()
1058 r->res_hash = hash; in dlm_master_lookup()
1059 r->res_bucket = b; in dlm_master_lookup()
1060 r->res_dir_nodeid = our_nodeid; in dlm_master_lookup()
1061 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
1062 r->res_nodeid = from_nodeid; in dlm_master_lookup()
1063 kref_init(&r->res_ref); in dlm_master_lookup()
1064 r->res_toss_time = jiffies; in dlm_master_lookup()
1066 error = rsb_insert(r, &ls->ls_rsbtbl[b].toss); in dlm_master_lookup()
1069 dlm_free_rsb(r); in dlm_master_lookup()
1086 struct dlm_rsb *r; in dlm_dump_rsb_hash() local
1092 r = rb_entry(n, struct dlm_rsb, res_hashnode); in dlm_dump_rsb_hash()
1093 if (r->res_hash == hash) in dlm_dump_rsb_hash()
1094 dlm_dump_rsb(r); in dlm_dump_rsb_hash()
1102 struct dlm_rsb *r = NULL; in dlm_dump_rsb_name() local
1110 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_dump_rsb_name()
1114 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_dump_rsb_name()
1118 dlm_dump_rsb(r); in dlm_dump_rsb_name()
1125 struct dlm_rsb *r = container_of(kref, struct dlm_rsb, res_ref); in toss_rsb() local
1126 struct dlm_ls *ls = r->res_ls; in toss_rsb()
1128 DLM_ASSERT(list_empty(&r->res_root_list), dlm_print_rsb(r);); in toss_rsb()
1129 kref_init(&r->res_ref); in toss_rsb()
1130 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[r->res_bucket].keep); in toss_rsb()
1131 rsb_insert(r, &ls->ls_rsbtbl[r->res_bucket].toss); in toss_rsb()
1132 r->res_toss_time = jiffies; in toss_rsb()
1133 ls->ls_rsbtbl[r->res_bucket].flags |= DLM_RTF_SHRINK; in toss_rsb()
1134 if (r->res_lvbptr) { in toss_rsb()
1135 dlm_free_lvb(r->res_lvbptr); in toss_rsb()
1136 r->res_lvbptr = NULL; in toss_rsb()
1142 static void unhold_rsb(struct dlm_rsb *r) in unhold_rsb() argument
1145 rv = kref_put(&r->res_ref, toss_rsb); in unhold_rsb()
1146 DLM_ASSERT(!rv, dlm_dump_rsb(r);); in unhold_rsb()
1151 struct dlm_rsb *r = container_of(kref, struct dlm_rsb, res_ref); in kill_rsb() local
1156 DLM_ASSERT(list_empty(&r->res_lookup), dlm_dump_rsb(r);); in kill_rsb()
1157 DLM_ASSERT(list_empty(&r->res_grantqueue), dlm_dump_rsb(r);); in kill_rsb()
1158 DLM_ASSERT(list_empty(&r->res_convertqueue), dlm_dump_rsb(r);); in kill_rsb()
1159 DLM_ASSERT(list_empty(&r->res_waitqueue), dlm_dump_rsb(r);); in kill_rsb()
1160 DLM_ASSERT(list_empty(&r->res_root_list), dlm_dump_rsb(r);); in kill_rsb()
1161 DLM_ASSERT(list_empty(&r->res_recover_list), dlm_dump_rsb(r);); in kill_rsb()
1167 static void attach_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in attach_lkb() argument
1169 hold_rsb(r); in attach_lkb()
1170 lkb->lkb_resource = r; in attach_lkb()
1312 static void add_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int status) in add_lkb() argument
1325 list_add(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1327 list_add_tail(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1331 lkb_add_ordered(&lkb->lkb_statequeue, &r->res_grantqueue, in add_lkb()
1336 list_add(&lkb->lkb_statequeue, &r->res_convertqueue); in add_lkb()
1339 &r->res_convertqueue); in add_lkb()
1346 static void del_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in del_lkb() argument
1353 static void move_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int sts) in move_lkb() argument
1356 del_lkb(r, lkb); in move_lkb()
1357 add_lkb(r, lkb, sts); in move_lkb()
1625 static void wait_pending_remove(struct dlm_rsb *r) in wait_pending_remove() argument
1627 struct dlm_ls *ls = r->res_ls; in wait_pending_remove()
1631 !rsb_cmp(r, ls->ls_remove_name, ls->ls_remove_len)) { in wait_pending_remove()
1633 r->res_dir_nodeid, r->res_name); in wait_pending_remove()
1651 struct dlm_rsb *r; in shrink_bucket() local
1669 r = rb_entry(n, struct dlm_rsb, res_hashnode); in shrink_bucket()
1677 (r->res_master_nodeid != our_nodeid) && in shrink_bucket()
1678 (dlm_dir_nodeid(r) == our_nodeid)) { in shrink_bucket()
1684 if (!time_after_eq(jiffies, r->res_toss_time + in shrink_bucket()
1690 (r->res_master_nodeid == our_nodeid) && in shrink_bucket()
1691 (dlm_dir_nodeid(r) != our_nodeid)) { in shrink_bucket()
1697 ls->ls_remove_lens[remote_count] = r->res_length; in shrink_bucket()
1698 memcpy(ls->ls_remove_names[remote_count], r->res_name, in shrink_bucket()
1707 if (!kref_put(&r->res_ref, kill_rsb)) { in shrink_bucket()
1708 log_error(ls, "tossed rsb in use %s", r->res_name); in shrink_bucket()
1712 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1713 dlm_free_rsb(r); in shrink_bucket()
1741 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in shrink_bucket()
1748 if (r->res_master_nodeid != our_nodeid) { in shrink_bucket()
1751 r->res_master_nodeid, r->res_dir_nodeid, in shrink_bucket()
1756 if (r->res_dir_nodeid == our_nodeid) { in shrink_bucket()
1760 r->res_dir_nodeid, r->res_master_nodeid, in shrink_bucket()
1765 if (!time_after_eq(jiffies, r->res_toss_time + in shrink_bucket()
1769 r->res_toss_time, jiffies, name); in shrink_bucket()
1773 if (!kref_put(&r->res_ref, kill_rsb)) { in shrink_bucket()
1779 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1788 send_remove(r); in shrink_bucket()
1796 dlm_free_rsb(r); in shrink_bucket()
1856 struct dlm_rsb *r; in dlm_scan_timeout() local
1891 r = lkb->lkb_resource; in dlm_scan_timeout()
1892 hold_rsb(r); in dlm_scan_timeout()
1893 lock_rsb(r); in dlm_scan_timeout()
1905 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in dlm_scan_timeout()
1909 _cancel_lock(r, lkb); in dlm_scan_timeout()
1912 unlock_rsb(r); in dlm_scan_timeout()
1913 unhold_rsb(r); in dlm_scan_timeout()
1945 static void set_lvb_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_lock() argument
1947 int b, len = r->res_ls->ls_lvblen; in set_lvb_lock()
1962 if (!r->res_lvbptr) in set_lvb_lock()
1965 memcpy(lkb->lkb_lvbptr, r->res_lvbptr, len); in set_lvb_lock()
1966 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1970 rsb_set_flag(r, RSB_VALNOTVALID); in set_lvb_lock()
1980 if (!r->res_lvbptr) in set_lvb_lock()
1981 r->res_lvbptr = dlm_allocate_lvb(r->res_ls); in set_lvb_lock()
1983 if (!r->res_lvbptr) in set_lvb_lock()
1986 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, len); in set_lvb_lock()
1987 r->res_lvbseq++; in set_lvb_lock()
1988 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1989 rsb_clear_flag(r, RSB_VALNOTVALID); in set_lvb_lock()
1992 if (rsb_flag(r, RSB_VALNOTVALID)) in set_lvb_lock()
1996 static void set_lvb_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_unlock() argument
2002 rsb_set_flag(r, RSB_VALNOTVALID); in set_lvb_unlock()
2012 if (!r->res_lvbptr) in set_lvb_unlock()
2013 r->res_lvbptr = dlm_allocate_lvb(r->res_ls); in set_lvb_unlock()
2015 if (!r->res_lvbptr) in set_lvb_unlock()
2018 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in set_lvb_unlock()
2019 r->res_lvbseq++; in set_lvb_unlock()
2020 rsb_clear_flag(r, RSB_VALNOTVALID); in set_lvb_unlock()
2025 static void set_lvb_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in set_lvb_lock_pc() argument
2039 if (len > r->res_ls->ls_lvblen) in set_lvb_lock_pc()
2040 len = r->res_ls->ls_lvblen; in set_lvb_lock_pc()
2056 static void _remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _remove_lock() argument
2058 del_lkb(r, lkb); in _remove_lock()
2065 static void remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock() argument
2067 set_lvb_unlock(r, lkb); in remove_lock()
2068 _remove_lock(r, lkb); in remove_lock()
2071 static void remove_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock_pc() argument
2073 _remove_lock(r, lkb); in remove_lock_pc()
2080 static int revert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock() argument
2090 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in revert_lock()
2094 del_lkb(r, lkb); in revert_lock()
2107 static int revert_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock_pc() argument
2109 return revert_lock(r, lkb); in revert_lock_pc()
2112 static void _grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _grant_lock() argument
2117 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2119 add_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2126 static void grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock() argument
2128 set_lvb_lock(r, lkb); in grant_lock()
2129 _grant_lock(r, lkb); in grant_lock()
2132 static void grant_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in grant_lock_pc() argument
2135 set_lvb_lock_pc(r, lkb, ms); in grant_lock_pc()
2136 _grant_lock(r, lkb); in grant_lock_pc()
2143 static void grant_lock_pending(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock_pending() argument
2145 grant_lock(r, lkb); in grant_lock_pending()
2147 send_grant(r, lkb); in grant_lock_pending()
2149 queue_cast(r, lkb, 0); in grant_lock_pending()
2256 static int conversion_deadlock_detect(struct dlm_rsb *r, struct dlm_lkb *lkb2) in conversion_deadlock_detect() argument
2261 list_for_each_entry(lkb1, &r->res_convertqueue, lkb_statequeue) { in conversion_deadlock_detect()
2295 static int _can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in _can_be_granted() argument
2327 if (queue_conflict(&r->res_grantqueue, lkb)) in _can_be_granted()
2336 if (queue_conflict(&r->res_convertqueue, lkb)) in _can_be_granted()
2388 if (list_empty(&r->res_convertqueue)) in _can_be_granted()
2408 if (!now && conv && first_in_list(lkb, &r->res_convertqueue)) in _can_be_granted()
2422 if (now && !conv && list_empty(&r->res_convertqueue) && in _can_be_granted()
2423 list_empty(&r->res_waitqueue)) in _can_be_granted()
2434 if (!now && !conv && list_empty(&r->res_convertqueue) && in _can_be_granted()
2435 first_in_list(lkb, &r->res_waitqueue)) in _can_be_granted()
2441 static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in can_be_granted() argument
2451 rv = _can_be_granted(r, lkb, now, recover); in can_be_granted()
2462 conversion_deadlock_detect(r, lkb)) { in can_be_granted()
2471 dlm_dump_rsb(r); in can_be_granted()
2490 rv = _can_be_granted(r, lkb, now, 0); in can_be_granted()
2503 static int grant_pending_convert(struct dlm_rsb *r, int high, int *cw, in grant_pending_convert() argument
2507 int recover = rsb_flag(r, RSB_RECOVER_GRANT); in grant_pending_convert()
2517 list_for_each_entry_safe(lkb, s, &r->res_convertqueue, lkb_statequeue) { in grant_pending_convert()
2521 if (can_be_granted(r, lkb, 0, recover, &deadlk)) { in grant_pending_convert()
2522 grant_lock_pending(r, lkb); in grant_pending_convert()
2531 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in grant_pending_convert()
2544 queue_bast(r, lkb, lkb->lkb_rqmode); in grant_pending_convert()
2550 r->res_name); in grant_pending_convert()
2551 dlm_dump_rsb(r); in grant_pending_convert()
2572 static int grant_pending_wait(struct dlm_rsb *r, int high, int *cw, in grant_pending_wait() argument
2577 list_for_each_entry_safe(lkb, s, &r->res_waitqueue, lkb_statequeue) { in grant_pending_wait()
2578 if (can_be_granted(r, lkb, 0, 0, NULL)) { in grant_pending_wait()
2579 grant_lock_pending(r, lkb); in grant_pending_wait()
2611 static void grant_pending_locks(struct dlm_rsb *r, unsigned int *count) in grant_pending_locks() argument
2617 if (!is_master(r)) { in grant_pending_locks()
2618 log_print("grant_pending_locks r nodeid %d", r->res_nodeid); in grant_pending_locks()
2619 dlm_dump_rsb(r); in grant_pending_locks()
2623 high = grant_pending_convert(r, high, &cw, count); in grant_pending_locks()
2624 high = grant_pending_wait(r, high, &cw, count); in grant_pending_locks()
2635 list_for_each_entry_safe(lkb, s, &r->res_grantqueue, lkb_statequeue) { in grant_pending_locks()
2639 queue_bast(r, lkb, DLM_LOCK_CW); in grant_pending_locks()
2641 queue_bast(r, lkb, high); in grant_pending_locks()
2661 static void send_bast_queue(struct dlm_rsb *r, struct list_head *head, in send_bast_queue() argument
2671 queue_bast(r, gr, lkb->lkb_rqmode); in send_bast_queue()
2677 static void send_blocking_asts(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts() argument
2679 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts()
2682 static void send_blocking_asts_all(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts_all() argument
2684 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts_all()
2685 send_bast_queue(r, &r->res_convertqueue, lkb); in send_blocking_asts_all()
2707 static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_master() argument
2711 if (rsb_flag(r, RSB_MASTER_UNCERTAIN)) { in set_master()
2712 rsb_clear_flag(r, RSB_MASTER_UNCERTAIN); in set_master()
2713 r->res_first_lkid = lkb->lkb_id; in set_master()
2714 lkb->lkb_nodeid = r->res_nodeid; in set_master()
2718 if (r->res_first_lkid && r->res_first_lkid != lkb->lkb_id) { in set_master()
2719 list_add_tail(&lkb->lkb_rsb_lookup, &r->res_lookup); in set_master()
2723 if (r->res_master_nodeid == our_nodeid) { in set_master()
2728 if (r->res_master_nodeid) { in set_master()
2729 lkb->lkb_nodeid = r->res_master_nodeid; in set_master()
2733 if (dlm_dir_nodeid(r) == our_nodeid) { in set_master()
2740 log_debug(r->res_ls, "set_master %x self master %d dir %d %s", in set_master()
2741 lkb->lkb_id, r->res_master_nodeid, r->res_dir_nodeid, in set_master()
2742 r->res_name); in set_master()
2743 r->res_master_nodeid = our_nodeid; in set_master()
2744 r->res_nodeid = 0; in set_master()
2749 wait_pending_remove(r); in set_master()
2751 r->res_first_lkid = lkb->lkb_id; in set_master()
2752 send_lookup(r, lkb); in set_master()
2756 static void process_lookup_list(struct dlm_rsb *r) in process_lookup_list() argument
2760 list_for_each_entry_safe(lkb, safe, &r->res_lookup, lkb_rsb_lookup) { in process_lookup_list()
2762 _request_lock(r, lkb); in process_lookup_list()
2769 static void confirm_master(struct dlm_rsb *r, int error) in confirm_master() argument
2773 if (!r->res_first_lkid) in confirm_master()
2779 r->res_first_lkid = 0; in confirm_master()
2780 process_lookup_list(r); in confirm_master()
2790 r->res_first_lkid = 0; in confirm_master()
2792 if (!list_empty(&r->res_lookup)) { in confirm_master()
2793 lkb = list_entry(r->res_lookup.next, struct dlm_lkb, in confirm_master()
2796 r->res_first_lkid = lkb->lkb_id; in confirm_master()
2797 _request_lock(r, lkb); in confirm_master()
2802 log_error(r->res_ls, "confirm_master unknown error %d", error); in confirm_master()
3074 static int do_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_request() argument
3078 if (can_be_granted(r, lkb, 1, 0, NULL)) { in do_request()
3079 grant_lock(r, lkb); in do_request()
3080 queue_cast(r, lkb, 0); in do_request()
3086 add_lkb(r, lkb, DLM_LKSTS_WAITING); in do_request()
3092 queue_cast(r, lkb, -EAGAIN); in do_request()
3097 static void do_request_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_request_effects() argument
3103 send_blocking_asts_all(r, lkb); in do_request_effects()
3106 send_blocking_asts(r, lkb); in do_request_effects()
3111 static int do_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_convert() argument
3118 if (can_be_granted(r, lkb, 1, 0, &deadlk)) { in do_convert()
3119 grant_lock(r, lkb); in do_convert()
3120 queue_cast(r, lkb, 0); in do_convert()
3130 revert_lock(r, lkb); in do_convert()
3131 queue_cast(r, lkb, -EDEADLK); in do_convert()
3143 grant_pending_convert(r, DLM_LOCK_IV, NULL, NULL); in do_convert()
3144 if (_can_be_granted(r, lkb, 1, 0)) { in do_convert()
3145 grant_lock(r, lkb); in do_convert()
3146 queue_cast(r, lkb, 0); in do_convert()
3154 del_lkb(r, lkb); in do_convert()
3155 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in do_convert()
3161 queue_cast(r, lkb, -EAGAIN); in do_convert()
3166 static void do_convert_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_convert_effects() argument
3171 grant_pending_locks(r, NULL); in do_convert_effects()
3176 send_blocking_asts_all(r, lkb); in do_convert_effects()
3179 send_blocking_asts(r, lkb); in do_convert_effects()
3184 static int do_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_unlock() argument
3186 remove_lock(r, lkb); in do_unlock()
3187 queue_cast(r, lkb, -DLM_EUNLOCK); in do_unlock()
3191 static void do_unlock_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_unlock_effects() argument
3194 grant_pending_locks(r, NULL); in do_unlock_effects()
3199 static int do_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_cancel() argument
3203 error = revert_lock(r, lkb); in do_cancel()
3205 queue_cast(r, lkb, -DLM_ECANCEL); in do_cancel()
3211 static void do_cancel_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_cancel_effects() argument
3215 grant_pending_locks(r, NULL); in do_cancel_effects()
3225 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _request_lock() argument
3231 error = set_master(r, lkb); in _request_lock()
3239 if (is_remote(r)) { in _request_lock()
3241 error = send_request(r, lkb); in _request_lock()
3243 error = do_request(r, lkb); in _request_lock()
3246 do_request_effects(r, lkb, error); in _request_lock()
3254 static int _convert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _convert_lock() argument
3258 if (is_remote(r)) { in _convert_lock()
3260 error = send_convert(r, lkb); in _convert_lock()
3262 error = do_convert(r, lkb); in _convert_lock()
3265 do_convert_effects(r, lkb, error); in _convert_lock()
3273 static int _unlock_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _unlock_lock() argument
3277 if (is_remote(r)) { in _unlock_lock()
3279 error = send_unlock(r, lkb); in _unlock_lock()
3281 error = do_unlock(r, lkb); in _unlock_lock()
3284 do_unlock_effects(r, lkb, error); in _unlock_lock()
3292 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _cancel_lock() argument
3296 if (is_remote(r)) { in _cancel_lock()
3298 error = send_cancel(r, lkb); in _cancel_lock()
3300 error = do_cancel(r, lkb); in _cancel_lock()
3303 do_cancel_effects(r, lkb, error); in _cancel_lock()
3317 struct dlm_rsb *r; in request_lock() local
3324 error = find_rsb(ls, name, len, 0, R_REQUEST, &r); in request_lock()
3328 lock_rsb(r); in request_lock()
3330 attach_lkb(r, lkb); in request_lock()
3333 error = _request_lock(r, lkb); in request_lock()
3335 unlock_rsb(r); in request_lock()
3336 put_rsb(r); in request_lock()
3343 struct dlm_rsb *r; in convert_lock() local
3346 r = lkb->lkb_resource; in convert_lock()
3348 hold_rsb(r); in convert_lock()
3349 lock_rsb(r); in convert_lock()
3355 error = _convert_lock(r, lkb); in convert_lock()
3357 unlock_rsb(r); in convert_lock()
3358 put_rsb(r); in convert_lock()
3365 struct dlm_rsb *r; in unlock_lock() local
3368 r = lkb->lkb_resource; in unlock_lock()
3370 hold_rsb(r); in unlock_lock()
3371 lock_rsb(r); in unlock_lock()
3377 error = _unlock_lock(r, lkb); in unlock_lock()
3379 unlock_rsb(r); in unlock_lock()
3380 put_rsb(r); in unlock_lock()
3387 struct dlm_rsb *r; in cancel_lock() local
3390 r = lkb->lkb_resource; in cancel_lock()
3392 hold_rsb(r); in cancel_lock()
3393 lock_rsb(r); in cancel_lock()
3399 error = _cancel_lock(r, lkb); in cancel_lock()
3401 unlock_rsb(r); in cancel_lock()
3402 put_rsb(r); in cancel_lock()
3559 static int create_message(struct dlm_rsb *r, struct dlm_lkb *lkb, in create_message() argument
3570 mb_len += r->res_length; in create_message()
3578 mb_len += r->res_ls->ls_lvblen; in create_message()
3582 return _create_message(r->res_ls, mb_len, to_nodeid, mstype, in create_message()
3596 static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_args() argument
3610 ms->m_hash = r->res_hash; in send_args()
3626 memcpy(ms->m_extra, r->res_name, r->res_length); in send_args()
3635 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in send_args()
3640 static int send_common(struct dlm_rsb *r, struct dlm_lkb *lkb, int mstype) in send_common() argument
3646 to_nodeid = r->res_nodeid; in send_common()
3652 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common()
3656 send_args(r, lkb, ms); in send_common()
3668 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_request() argument
3670 return send_common(r, lkb, DLM_MSG_REQUEST); in send_request()
3673 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_convert() argument
3677 error = send_common(r, lkb, DLM_MSG_CONVERT); in send_convert()
3682 r->res_ls->ls_stub_ms.m_flags = DLM_IFL_STUB_MS; in send_convert()
3683 r->res_ls->ls_stub_ms.m_type = DLM_MSG_CONVERT_REPLY; in send_convert()
3684 r->res_ls->ls_stub_ms.m_result = 0; in send_convert()
3685 __receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms); in send_convert()
3695 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_unlock() argument
3697 return send_common(r, lkb, DLM_MSG_UNLOCK); in send_unlock()
3700 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_cancel() argument
3702 return send_common(r, lkb, DLM_MSG_CANCEL); in send_cancel()
3705 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_grant() argument
3713 error = create_message(r, lkb, to_nodeid, DLM_MSG_GRANT, &ms, &mh); in send_grant()
3717 send_args(r, lkb, ms); in send_grant()
3726 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode) in send_bast() argument
3734 error = create_message(r, NULL, to_nodeid, DLM_MSG_BAST, &ms, &mh); in send_bast()
3738 send_args(r, lkb, ms); in send_bast()
3747 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_lookup() argument
3753 to_nodeid = dlm_dir_nodeid(r); in send_lookup()
3759 error = create_message(r, NULL, to_nodeid, DLM_MSG_LOOKUP, &ms, &mh); in send_lookup()
3763 send_args(r, lkb, ms); in send_lookup()
3775 static int send_remove(struct dlm_rsb *r) in send_remove() argument
3781 to_nodeid = dlm_dir_nodeid(r); in send_remove()
3783 error = create_message(r, NULL, to_nodeid, DLM_MSG_REMOVE, &ms, &mh); in send_remove()
3787 memcpy(ms->m_extra, r->res_name, r->res_length); in send_remove()
3788 ms->m_hash = r->res_hash; in send_remove()
3795 static int send_common_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_common_reply() argument
3804 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common_reply()
3808 send_args(r, lkb, ms); in send_common_reply()
3817 static int send_request_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_request_reply() argument
3819 return send_common_reply(r, lkb, DLM_MSG_REQUEST_REPLY, rv); in send_request_reply()
3822 static int send_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_convert_reply() argument
3824 return send_common_reply(r, lkb, DLM_MSG_CONVERT_REPLY, rv); in send_convert_reply()
3827 static int send_unlock_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_unlock_reply() argument
3829 return send_common_reply(r, lkb, DLM_MSG_UNLOCK_REPLY, rv); in send_unlock_reply()
3832 static int send_cancel_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_cancel_reply() argument
3834 return send_common_reply(r, lkb, DLM_MSG_CANCEL_REPLY, rv); in send_cancel_reply()
3840 struct dlm_rsb *r = &ls->ls_stub_rsb; in send_lookup_reply() local
3845 error = create_message(r, NULL, nodeid, DLM_MSG_LOOKUP_REPLY, &ms, &mh); in send_lookup_reply()
4017 struct dlm_rsb *r; in send_repeat_remove() local
4032 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in send_repeat_remove()
4039 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in send_repeat_remove()
4073 struct dlm_rsb *r; in receive_request() local
4100 R_RECEIVE_REQUEST, &r); in receive_request()
4106 lock_rsb(r); in receive_request()
4108 if (r->res_master_nodeid != dlm_our_nodeid()) { in receive_request()
4109 error = validate_master_nodeid(ls, r, from_nodeid); in receive_request()
4111 unlock_rsb(r); in receive_request()
4112 put_rsb(r); in receive_request()
4118 attach_lkb(r, lkb); in receive_request()
4119 error = do_request(r, lkb); in receive_request()
4120 send_request_reply(r, lkb, error); in receive_request()
4121 do_request_effects(r, lkb, error); in receive_request()
4123 unlock_rsb(r); in receive_request()
4124 put_rsb(r); in receive_request()
4166 struct dlm_rsb *r; in receive_convert() local
4183 r = lkb->lkb_resource; in receive_convert()
4185 hold_rsb(r); in receive_convert()
4186 lock_rsb(r); in receive_convert()
4196 send_convert_reply(r, lkb, error); in receive_convert()
4202 error = do_convert(r, lkb); in receive_convert()
4204 send_convert_reply(r, lkb, error); in receive_convert()
4205 do_convert_effects(r, lkb, error); in receive_convert()
4207 unlock_rsb(r); in receive_convert()
4208 put_rsb(r); in receive_convert()
4221 struct dlm_rsb *r; in receive_unlock() local
4237 r = lkb->lkb_resource; in receive_unlock()
4239 hold_rsb(r); in receive_unlock()
4240 lock_rsb(r); in receive_unlock()
4250 send_unlock_reply(r, lkb, error); in receive_unlock()
4254 error = do_unlock(r, lkb); in receive_unlock()
4255 send_unlock_reply(r, lkb, error); in receive_unlock()
4256 do_unlock_effects(r, lkb, error); in receive_unlock()
4258 unlock_rsb(r); in receive_unlock()
4259 put_rsb(r); in receive_unlock()
4272 struct dlm_rsb *r; in receive_cancel() local
4281 r = lkb->lkb_resource; in receive_cancel()
4283 hold_rsb(r); in receive_cancel()
4284 lock_rsb(r); in receive_cancel()
4290 error = do_cancel(r, lkb); in receive_cancel()
4291 send_cancel_reply(r, lkb, error); in receive_cancel()
4292 do_cancel_effects(r, lkb, error); in receive_cancel()
4294 unlock_rsb(r); in receive_cancel()
4295 put_rsb(r); in receive_cancel()
4308 struct dlm_rsb *r; in receive_grant() local
4315 r = lkb->lkb_resource; in receive_grant()
4317 hold_rsb(r); in receive_grant()
4318 lock_rsb(r); in receive_grant()
4327 grant_lock_pc(r, lkb, ms); in receive_grant()
4328 queue_cast(r, lkb, 0); in receive_grant()
4330 unlock_rsb(r); in receive_grant()
4331 put_rsb(r); in receive_grant()
4339 struct dlm_rsb *r; in receive_bast() local
4346 r = lkb->lkb_resource; in receive_bast()
4348 hold_rsb(r); in receive_bast()
4349 lock_rsb(r); in receive_bast()
4355 queue_bast(r, lkb, ms->m_bastmode); in receive_bast()
4358 unlock_rsb(r); in receive_bast()
4359 put_rsb(r); in receive_bast()
4387 struct dlm_rsb *r; in receive_remove() local
4425 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in receive_remove()
4428 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in receive_remove()
4436 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4439 from_nodeid, r->res_master_nodeid); in receive_remove()
4440 dlm_print_rsb(r); in receive_remove()
4446 from_nodeid, r->res_master_nodeid, r->res_first_lkid, in receive_remove()
4452 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4454 from_nodeid, r->res_master_nodeid); in receive_remove()
4455 dlm_print_rsb(r); in receive_remove()
4460 if (kref_put(&r->res_ref, kill_rsb)) { in receive_remove()
4461 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in receive_remove()
4463 dlm_free_rsb(r); in receive_remove()
4467 dlm_print_rsb(r); in receive_remove()
4480 struct dlm_rsb *r; in receive_request_reply() local
4488 r = lkb->lkb_resource; in receive_request_reply()
4489 hold_rsb(r); in receive_request_reply()
4490 lock_rsb(r); in receive_request_reply()
4501 dlm_dump_rsb(r); in receive_request_reply()
4508 r->res_master_nodeid = from_nodeid; in receive_request_reply()
4509 r->res_nodeid = from_nodeid; in receive_request_reply()
4519 queue_cast(r, lkb, -EAGAIN); in receive_request_reply()
4520 confirm_master(r, -EAGAIN); in receive_request_reply()
4532 add_lkb(r, lkb, DLM_LKSTS_WAITING); in receive_request_reply()
4535 grant_lock_pc(r, lkb, ms); in receive_request_reply()
4536 queue_cast(r, lkb, 0); in receive_request_reply()
4538 confirm_master(r, result); in receive_request_reply()
4546 from_nodeid, result, r->res_master_nodeid, in receive_request_reply()
4547 r->res_dir_nodeid, r->res_first_lkid, r->res_name); in receive_request_reply()
4549 if (r->res_dir_nodeid != dlm_our_nodeid() && in receive_request_reply()
4550 r->res_master_nodeid != dlm_our_nodeid()) { in receive_request_reply()
4552 r->res_master_nodeid = 0; in receive_request_reply()
4553 r->res_nodeid = -1; in receive_request_reply()
4559 queue_cast_overlap(r, lkb); in receive_request_reply()
4560 confirm_master(r, result); in receive_request_reply()
4563 _request_lock(r, lkb); in receive_request_reply()
4565 if (r->res_master_nodeid == dlm_our_nodeid()) in receive_request_reply()
4566 confirm_master(r, 0); in receive_request_reply()
4580 send_unlock(r, lkb); in receive_request_reply()
4585 send_cancel(r, lkb); in receive_request_reply()
4591 unlock_rsb(r); in receive_request_reply()
4592 put_rsb(r); in receive_request_reply()
4597 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in __receive_convert_reply() argument
4604 queue_cast(r, lkb, -EAGAIN); in __receive_convert_reply()
4609 revert_lock_pc(r, lkb); in __receive_convert_reply()
4610 queue_cast(r, lkb, -EDEADLK); in __receive_convert_reply()
4618 del_lkb(r, lkb); in __receive_convert_reply()
4619 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in __receive_convert_reply()
4628 grant_lock_pc(r, lkb, ms); in __receive_convert_reply()
4629 queue_cast(r, lkb, 0); in __receive_convert_reply()
4633 log_error(r->res_ls, "receive_convert_reply %x remote %d %x %d", in __receive_convert_reply()
4636 dlm_print_rsb(r); in __receive_convert_reply()
4643 struct dlm_rsb *r = lkb->lkb_resource; in _receive_convert_reply() local
4646 hold_rsb(r); in _receive_convert_reply()
4647 lock_rsb(r); in _receive_convert_reply()
4658 __receive_convert_reply(r, lkb, ms); in _receive_convert_reply()
4660 unlock_rsb(r); in _receive_convert_reply()
4661 put_rsb(r); in _receive_convert_reply()
4680 struct dlm_rsb *r = lkb->lkb_resource; in _receive_unlock_reply() local
4683 hold_rsb(r); in _receive_unlock_reply()
4684 lock_rsb(r); in _receive_unlock_reply()
4700 remove_lock_pc(r, lkb); in _receive_unlock_reply()
4701 queue_cast(r, lkb, -DLM_EUNLOCK); in _receive_unlock_reply()
4706 log_error(r->res_ls, "receive_unlock_reply %x error %d", in _receive_unlock_reply()
4710 unlock_rsb(r); in _receive_unlock_reply()
4711 put_rsb(r); in _receive_unlock_reply()
4730 struct dlm_rsb *r = lkb->lkb_resource; in _receive_cancel_reply() local
4733 hold_rsb(r); in _receive_cancel_reply()
4734 lock_rsb(r); in _receive_cancel_reply()
4750 revert_lock_pc(r, lkb); in _receive_cancel_reply()
4751 queue_cast(r, lkb, -DLM_ECANCEL); in _receive_cancel_reply()
4756 log_error(r->res_ls, "receive_cancel_reply %x error %d", in _receive_cancel_reply()
4760 unlock_rsb(r); in _receive_cancel_reply()
4761 put_rsb(r); in _receive_cancel_reply()
4781 struct dlm_rsb *r; in receive_lookup_reply() local
4794 r = lkb->lkb_resource; in receive_lookup_reply()
4795 hold_rsb(r); in receive_lookup_reply()
4796 lock_rsb(r); in receive_lookup_reply()
4810 if (r->res_master_nodeid && (r->res_master_nodeid != ret_nodeid)) { in receive_lookup_reply()
4815 r->res_master_nodeid, r->res_dir_nodeid, in receive_lookup_reply()
4816 dlm_our_nodeid(), r->res_first_lkid, r->res_name); in receive_lookup_reply()
4820 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4821 r->res_nodeid = 0; in receive_lookup_reply()
4823 r->res_first_lkid = 0; in receive_lookup_reply()
4828 r->res_master_nodeid = 0; in receive_lookup_reply()
4829 r->res_nodeid = -1; in receive_lookup_reply()
4833 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4834 r->res_nodeid = ret_nodeid; in receive_lookup_reply()
4840 queue_cast_overlap(r, lkb); in receive_lookup_reply()
4845 _request_lock(r, lkb); in receive_lookup_reply()
4849 process_lookup_list(r); in receive_lookup_reply()
4851 unlock_rsb(r); in receive_lookup_reply()
4852 put_rsb(r); in receive_lookup_reply()
5267 struct dlm_rsb *r; in dlm_recover_waiters_post() local
5281 r = lkb->lkb_resource; in dlm_recover_waiters_post()
5282 hold_rsb(r); in dlm_recover_waiters_post()
5283 lock_rsb(r); in dlm_recover_waiters_post()
5293 r->res_nodeid, lkb->lkb_nodeid, lkb->lkb_wait_nodeid, in dlm_recover_waiters_post()
5294 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5315 queue_cast(r, lkb, ou ? -DLM_EUNLOCK : in dlm_recover_waiters_post()
5321 queue_cast(r, lkb, -DLM_ECANCEL); in dlm_recover_waiters_post()
5324 _unlock_lock(r, lkb); in dlm_recover_waiters_post()
5334 _request_lock(r, lkb); in dlm_recover_waiters_post()
5335 if (is_master(r)) in dlm_recover_waiters_post()
5336 confirm_master(r, 0); in dlm_recover_waiters_post()
5339 _convert_lock(r, lkb); in dlm_recover_waiters_post()
5349 lkb->lkb_id, mstype, r->res_nodeid, in dlm_recover_waiters_post()
5350 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5352 unlock_rsb(r); in dlm_recover_waiters_post()
5353 put_rsb(r); in dlm_recover_waiters_post()
5360 static void purge_mstcpy_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_mstcpy_list() argument
5375 del_lkb(r, lkb); in purge_mstcpy_list()
5383 void dlm_purge_mstcpy_locks(struct dlm_rsb *r) in dlm_purge_mstcpy_locks() argument
5385 struct dlm_ls *ls = r->res_ls; in dlm_purge_mstcpy_locks()
5387 purge_mstcpy_list(ls, r, &r->res_grantqueue); in dlm_purge_mstcpy_locks()
5388 purge_mstcpy_list(ls, r, &r->res_convertqueue); in dlm_purge_mstcpy_locks()
5389 purge_mstcpy_list(ls, r, &r->res_waitqueue); in dlm_purge_mstcpy_locks()
5392 static void purge_dead_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_dead_list() argument
5409 rsb_set_flag(r, RSB_RECOVER_LVB_INVAL); in purge_dead_list()
5412 del_lkb(r, lkb); in purge_dead_list()
5418 rsb_set_flag(r, RSB_RECOVER_GRANT); in purge_dead_list()
5429 struct dlm_rsb *r; in dlm_recover_purge() local
5447 list_for_each_entry(r, &ls->ls_root_list, res_root_list) { in dlm_recover_purge()
5448 hold_rsb(r); in dlm_recover_purge()
5449 lock_rsb(r); in dlm_recover_purge()
5450 if (is_master(r)) { in dlm_recover_purge()
5451 purge_dead_list(ls, r, &r->res_grantqueue, in dlm_recover_purge()
5453 purge_dead_list(ls, r, &r->res_convertqueue, in dlm_recover_purge()
5455 purge_dead_list(ls, r, &r->res_waitqueue, in dlm_recover_purge()
5458 unlock_rsb(r); in dlm_recover_purge()
5459 unhold_rsb(r); in dlm_recover_purge()
5472 struct dlm_rsb *r; in find_grant_rsb() local
5476 r = rb_entry(n, struct dlm_rsb, res_hashnode); in find_grant_rsb()
5478 if (!rsb_flag(r, RSB_RECOVER_GRANT)) in find_grant_rsb()
5480 if (!is_master(r)) { in find_grant_rsb()
5481 rsb_clear_flag(r, RSB_RECOVER_GRANT); in find_grant_rsb()
5484 hold_rsb(r); in find_grant_rsb()
5486 return r; in find_grant_rsb()
5511 struct dlm_rsb *r; in dlm_recover_grant() local
5518 r = find_grant_rsb(ls, bucket); in dlm_recover_grant()
5519 if (!r) { in dlm_recover_grant()
5527 lock_rsb(r); in dlm_recover_grant()
5529 grant_pending_locks(r, &count); in dlm_recover_grant()
5530 rsb_clear_flag(r, RSB_RECOVER_GRANT); in dlm_recover_grant()
5532 confirm_master(r, 0); in dlm_recover_grant()
5533 unlock_rsb(r); in dlm_recover_grant()
5534 put_rsb(r); in dlm_recover_grant()
5555 static struct dlm_lkb *search_remid(struct dlm_rsb *r, int nodeid, in search_remid() argument
5560 lkb = search_remid_list(&r->res_grantqueue, nodeid, remid); in search_remid()
5563 lkb = search_remid_list(&r->res_convertqueue, nodeid, remid); in search_remid()
5566 lkb = search_remid_list(&r->res_waitqueue, nodeid, remid); in search_remid()
5574 struct dlm_rsb *r, struct dlm_rcom *rc) in receive_rcom_lock_args() argument
5611 rsb_set_flag(r, RSB_RECOVER_CONVERT); in receive_rcom_lock_args()
5627 struct dlm_rsb *r; in dlm_recover_master_copy() local
5649 from_nodeid, R_RECEIVE_RECOVER, &r); in dlm_recover_master_copy()
5653 lock_rsb(r); in dlm_recover_master_copy()
5655 if (dlm_no_directory(ls) && (dlm_dir_nodeid(r) != dlm_our_nodeid())) { in dlm_recover_master_copy()
5662 lkb = search_remid(r, from_nodeid, remid); in dlm_recover_master_copy()
5672 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5678 attach_lkb(r, lkb); in dlm_recover_master_copy()
5679 add_lkb(r, lkb, rl->rl_status); in dlm_recover_master_copy()
5683 if (!list_empty(&r->res_waitqueue) || !list_empty(&r->res_convertqueue)) in dlm_recover_master_copy()
5684 rsb_set_flag(r, RSB_RECOVER_GRANT); in dlm_recover_master_copy()
5694 unlock_rsb(r); in dlm_recover_master_copy()
5695 put_rsb(r); in dlm_recover_master_copy()
5708 struct dlm_rsb *r; in dlm_recover_process_copy() local
5724 r = lkb->lkb_resource; in dlm_recover_process_copy()
5725 hold_rsb(r); in dlm_recover_process_copy()
5726 lock_rsb(r); in dlm_recover_process_copy()
5731 dlm_dump_rsb(r); in dlm_recover_process_copy()
5732 unlock_rsb(r); in dlm_recover_process_copy()
5733 put_rsb(r); in dlm_recover_process_copy()
5747 dlm_send_rcom_lock(r, lkb); in dlm_recover_process_copy()
5760 dlm_recovered_lock(r); in dlm_recover_process_copy()
5762 unlock_rsb(r); in dlm_recover_process_copy()
5763 put_rsb(r); in dlm_recover_process_copy()
6052 struct dlm_rsb *r; in dlm_user_deadlock() local
6069 r = lkb->lkb_resource; in dlm_user_deadlock()
6070 hold_rsb(r); in dlm_user_deadlock()
6071 lock_rsb(r); in dlm_user_deadlock()
6078 error = _cancel_lock(r, lkb); in dlm_user_deadlock()
6080 unlock_rsb(r); in dlm_user_deadlock()
6081 put_rsb(r); in dlm_user_deadlock()