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()
3561 static int create_message(struct dlm_rsb *r, struct dlm_lkb *lkb, in create_message() argument
3572 mb_len += r->res_length; in create_message()
3580 mb_len += r->res_ls->ls_lvblen; in create_message()
3584 return _create_message(r->res_ls, mb_len, to_nodeid, mstype, in create_message()
3598 static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_args() argument
3612 ms->m_hash = r->res_hash; in send_args()
3628 memcpy(ms->m_extra, r->res_name, r->res_length); in send_args()
3637 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in send_args()
3642 static int send_common(struct dlm_rsb *r, struct dlm_lkb *lkb, int mstype) in send_common() argument
3648 to_nodeid = r->res_nodeid; in send_common()
3654 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common()
3658 send_args(r, lkb, ms); in send_common()
3670 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_request() argument
3672 return send_common(r, lkb, DLM_MSG_REQUEST); in send_request()
3675 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_convert() argument
3679 error = send_common(r, lkb, DLM_MSG_CONVERT); in send_convert()
3684 r->res_ls->ls_stub_ms.m_flags = DLM_IFL_STUB_MS; in send_convert()
3685 r->res_ls->ls_stub_ms.m_type = DLM_MSG_CONVERT_REPLY; in send_convert()
3686 r->res_ls->ls_stub_ms.m_result = 0; in send_convert()
3687 __receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms); in send_convert()
3697 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_unlock() argument
3699 return send_common(r, lkb, DLM_MSG_UNLOCK); in send_unlock()
3702 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_cancel() argument
3704 return send_common(r, lkb, DLM_MSG_CANCEL); in send_cancel()
3707 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_grant() argument
3715 error = create_message(r, lkb, to_nodeid, DLM_MSG_GRANT, &ms, &mh); in send_grant()
3719 send_args(r, lkb, ms); in send_grant()
3728 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode) in send_bast() argument
3736 error = create_message(r, NULL, to_nodeid, DLM_MSG_BAST, &ms, &mh); in send_bast()
3740 send_args(r, lkb, ms); in send_bast()
3749 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_lookup() argument
3755 to_nodeid = dlm_dir_nodeid(r); in send_lookup()
3761 error = create_message(r, NULL, to_nodeid, DLM_MSG_LOOKUP, &ms, &mh); in send_lookup()
3765 send_args(r, lkb, ms); in send_lookup()
3777 static int send_remove(struct dlm_rsb *r) in send_remove() argument
3783 to_nodeid = dlm_dir_nodeid(r); in send_remove()
3785 error = create_message(r, NULL, to_nodeid, DLM_MSG_REMOVE, &ms, &mh); in send_remove()
3789 memcpy(ms->m_extra, r->res_name, r->res_length); in send_remove()
3790 ms->m_hash = r->res_hash; in send_remove()
3797 static int send_common_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_common_reply() argument
3806 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common_reply()
3810 send_args(r, lkb, ms); in send_common_reply()
3819 static int send_request_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_request_reply() argument
3821 return send_common_reply(r, lkb, DLM_MSG_REQUEST_REPLY, rv); in send_request_reply()
3824 static int send_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_convert_reply() argument
3826 return send_common_reply(r, lkb, DLM_MSG_CONVERT_REPLY, rv); in send_convert_reply()
3829 static int send_unlock_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_unlock_reply() argument
3831 return send_common_reply(r, lkb, DLM_MSG_UNLOCK_REPLY, rv); in send_unlock_reply()
3834 static int send_cancel_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_cancel_reply() argument
3836 return send_common_reply(r, lkb, DLM_MSG_CANCEL_REPLY, rv); in send_cancel_reply()
3842 struct dlm_rsb *r = &ls->ls_stub_rsb; in send_lookup_reply() local
3847 error = create_message(r, NULL, nodeid, DLM_MSG_LOOKUP_REPLY, &ms, &mh); in send_lookup_reply()
4019 struct dlm_rsb *r; in send_repeat_remove() local
4034 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in send_repeat_remove()
4041 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in send_repeat_remove()
4075 struct dlm_rsb *r; in receive_request() local
4102 R_RECEIVE_REQUEST, &r); in receive_request()
4108 lock_rsb(r); in receive_request()
4110 if (r->res_master_nodeid != dlm_our_nodeid()) { in receive_request()
4111 error = validate_master_nodeid(ls, r, from_nodeid); in receive_request()
4113 unlock_rsb(r); in receive_request()
4114 put_rsb(r); in receive_request()
4120 attach_lkb(r, lkb); in receive_request()
4121 error = do_request(r, lkb); in receive_request()
4122 send_request_reply(r, lkb, error); in receive_request()
4123 do_request_effects(r, lkb, error); in receive_request()
4125 unlock_rsb(r); in receive_request()
4126 put_rsb(r); in receive_request()
4168 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
4239 r = lkb->lkb_resource; in receive_unlock()
4241 hold_rsb(r); in receive_unlock()
4242 lock_rsb(r); in receive_unlock()
4252 send_unlock_reply(r, lkb, error); in receive_unlock()
4256 error = do_unlock(r, lkb); in receive_unlock()
4257 send_unlock_reply(r, lkb, error); in receive_unlock()
4258 do_unlock_effects(r, lkb, error); in receive_unlock()
4260 unlock_rsb(r); in receive_unlock()
4261 put_rsb(r); in receive_unlock()
4274 struct dlm_rsb *r; in receive_cancel() local
4283 r = lkb->lkb_resource; in receive_cancel()
4285 hold_rsb(r); in receive_cancel()
4286 lock_rsb(r); in receive_cancel()
4292 error = do_cancel(r, lkb); in receive_cancel()
4293 send_cancel_reply(r, lkb, error); in receive_cancel()
4294 do_cancel_effects(r, lkb, error); in receive_cancel()
4296 unlock_rsb(r); in receive_cancel()
4297 put_rsb(r); in receive_cancel()
4310 struct dlm_rsb *r; in receive_grant() local
4317 r = lkb->lkb_resource; in receive_grant()
4319 hold_rsb(r); in receive_grant()
4320 lock_rsb(r); in receive_grant()
4329 grant_lock_pc(r, lkb, ms); in receive_grant()
4330 queue_cast(r, lkb, 0); in receive_grant()
4332 unlock_rsb(r); in receive_grant()
4333 put_rsb(r); in receive_grant()
4341 struct dlm_rsb *r; in receive_bast() local
4348 r = lkb->lkb_resource; in receive_bast()
4350 hold_rsb(r); in receive_bast()
4351 lock_rsb(r); in receive_bast()
4357 queue_bast(r, lkb, ms->m_bastmode); in receive_bast()
4360 unlock_rsb(r); in receive_bast()
4361 put_rsb(r); in receive_bast()
4389 struct dlm_rsb *r; in receive_remove() local
4427 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in receive_remove()
4430 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in receive_remove()
4438 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4441 from_nodeid, r->res_master_nodeid); in receive_remove()
4442 dlm_print_rsb(r); in receive_remove()
4448 from_nodeid, r->res_master_nodeid, r->res_first_lkid, in receive_remove()
4454 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4456 from_nodeid, r->res_master_nodeid); in receive_remove()
4457 dlm_print_rsb(r); in receive_remove()
4462 if (kref_put(&r->res_ref, kill_rsb)) { in receive_remove()
4463 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in receive_remove()
4465 dlm_free_rsb(r); in receive_remove()
4469 dlm_print_rsb(r); in receive_remove()
4482 struct dlm_rsb *r; in receive_request_reply() local
4490 r = lkb->lkb_resource; in receive_request_reply()
4491 hold_rsb(r); in receive_request_reply()
4492 lock_rsb(r); in receive_request_reply()
4503 dlm_dump_rsb(r); in receive_request_reply()
4510 r->res_master_nodeid = from_nodeid; in receive_request_reply()
4511 r->res_nodeid = from_nodeid; in receive_request_reply()
4521 queue_cast(r, lkb, -EAGAIN); in receive_request_reply()
4522 confirm_master(r, -EAGAIN); in receive_request_reply()
4534 add_lkb(r, lkb, DLM_LKSTS_WAITING); in receive_request_reply()
4537 grant_lock_pc(r, lkb, ms); in receive_request_reply()
4538 queue_cast(r, lkb, 0); in receive_request_reply()
4540 confirm_master(r, result); in receive_request_reply()
4548 from_nodeid, result, r->res_master_nodeid, in receive_request_reply()
4549 r->res_dir_nodeid, r->res_first_lkid, r->res_name); in receive_request_reply()
4551 if (r->res_dir_nodeid != dlm_our_nodeid() && in receive_request_reply()
4552 r->res_master_nodeid != dlm_our_nodeid()) { in receive_request_reply()
4554 r->res_master_nodeid = 0; in receive_request_reply()
4555 r->res_nodeid = -1; in receive_request_reply()
4561 queue_cast_overlap(r, lkb); in receive_request_reply()
4562 confirm_master(r, result); in receive_request_reply()
4565 _request_lock(r, lkb); in receive_request_reply()
4567 if (r->res_master_nodeid == dlm_our_nodeid()) in receive_request_reply()
4568 confirm_master(r, 0); in receive_request_reply()
4582 send_unlock(r, lkb); in receive_request_reply()
4587 send_cancel(r, lkb); in receive_request_reply()
4593 unlock_rsb(r); in receive_request_reply()
4594 put_rsb(r); in receive_request_reply()
4599 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in __receive_convert_reply() argument
4606 queue_cast(r, lkb, -EAGAIN); in __receive_convert_reply()
4611 revert_lock_pc(r, lkb); in __receive_convert_reply()
4612 queue_cast(r, lkb, -EDEADLK); in __receive_convert_reply()
4620 del_lkb(r, lkb); in __receive_convert_reply()
4621 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in __receive_convert_reply()
4630 grant_lock_pc(r, lkb, ms); in __receive_convert_reply()
4631 queue_cast(r, lkb, 0); in __receive_convert_reply()
4635 log_error(r->res_ls, "receive_convert_reply %x remote %d %x %d", in __receive_convert_reply()
4638 dlm_print_rsb(r); in __receive_convert_reply()
4645 struct dlm_rsb *r = lkb->lkb_resource; in _receive_convert_reply() local
4648 hold_rsb(r); in _receive_convert_reply()
4649 lock_rsb(r); in _receive_convert_reply()
4660 __receive_convert_reply(r, lkb, ms); in _receive_convert_reply()
4662 unlock_rsb(r); in _receive_convert_reply()
4663 put_rsb(r); in _receive_convert_reply()
4682 struct dlm_rsb *r = lkb->lkb_resource; in _receive_unlock_reply() local
4685 hold_rsb(r); in _receive_unlock_reply()
4686 lock_rsb(r); in _receive_unlock_reply()
4702 remove_lock_pc(r, lkb); in _receive_unlock_reply()
4703 queue_cast(r, lkb, -DLM_EUNLOCK); in _receive_unlock_reply()
4708 log_error(r->res_ls, "receive_unlock_reply %x error %d", in _receive_unlock_reply()
4712 unlock_rsb(r); in _receive_unlock_reply()
4713 put_rsb(r); in _receive_unlock_reply()
4732 struct dlm_rsb *r = lkb->lkb_resource; in _receive_cancel_reply() local
4735 hold_rsb(r); in _receive_cancel_reply()
4736 lock_rsb(r); in _receive_cancel_reply()
4752 revert_lock_pc(r, lkb); in _receive_cancel_reply()
4753 queue_cast(r, lkb, -DLM_ECANCEL); in _receive_cancel_reply()
4758 log_error(r->res_ls, "receive_cancel_reply %x error %d", in _receive_cancel_reply()
4762 unlock_rsb(r); in _receive_cancel_reply()
4763 put_rsb(r); in _receive_cancel_reply()
4783 struct dlm_rsb *r; in receive_lookup_reply() local
4796 r = lkb->lkb_resource; in receive_lookup_reply()
4797 hold_rsb(r); in receive_lookup_reply()
4798 lock_rsb(r); in receive_lookup_reply()
4812 if (r->res_master_nodeid && (r->res_master_nodeid != ret_nodeid)) { in receive_lookup_reply()
4817 r->res_master_nodeid, r->res_dir_nodeid, in receive_lookup_reply()
4818 dlm_our_nodeid(), r->res_first_lkid, r->res_name); in receive_lookup_reply()
4822 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4823 r->res_nodeid = 0; in receive_lookup_reply()
4825 r->res_first_lkid = 0; in receive_lookup_reply()
4830 r->res_master_nodeid = 0; in receive_lookup_reply()
4831 r->res_nodeid = -1; in receive_lookup_reply()
4835 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4836 r->res_nodeid = ret_nodeid; in receive_lookup_reply()
4842 queue_cast_overlap(r, lkb); in receive_lookup_reply()
4847 _request_lock(r, lkb); in receive_lookup_reply()
4851 process_lookup_list(r); in receive_lookup_reply()
4853 unlock_rsb(r); in receive_lookup_reply()
4854 put_rsb(r); in receive_lookup_reply()
5269 struct dlm_rsb *r; in dlm_recover_waiters_post() local
5283 r = lkb->lkb_resource; in dlm_recover_waiters_post()
5284 hold_rsb(r); in dlm_recover_waiters_post()
5285 lock_rsb(r); in dlm_recover_waiters_post()
5295 r->res_nodeid, lkb->lkb_nodeid, lkb->lkb_wait_nodeid, in dlm_recover_waiters_post()
5296 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5317 queue_cast(r, lkb, ou ? -DLM_EUNLOCK : in dlm_recover_waiters_post()
5323 queue_cast(r, lkb, -DLM_ECANCEL); in dlm_recover_waiters_post()
5326 _unlock_lock(r, lkb); in dlm_recover_waiters_post()
5336 _request_lock(r, lkb); in dlm_recover_waiters_post()
5337 if (is_master(r)) in dlm_recover_waiters_post()
5338 confirm_master(r, 0); in dlm_recover_waiters_post()
5341 _convert_lock(r, lkb); in dlm_recover_waiters_post()
5351 lkb->lkb_id, mstype, r->res_nodeid, in dlm_recover_waiters_post()
5352 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5354 unlock_rsb(r); in dlm_recover_waiters_post()
5355 put_rsb(r); in dlm_recover_waiters_post()
5362 static void purge_mstcpy_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_mstcpy_list() argument
5377 del_lkb(r, lkb); in purge_mstcpy_list()
5385 void dlm_purge_mstcpy_locks(struct dlm_rsb *r) in dlm_purge_mstcpy_locks() argument
5387 struct dlm_ls *ls = r->res_ls; in dlm_purge_mstcpy_locks()
5389 purge_mstcpy_list(ls, r, &r->res_grantqueue); in dlm_purge_mstcpy_locks()
5390 purge_mstcpy_list(ls, r, &r->res_convertqueue); in dlm_purge_mstcpy_locks()
5391 purge_mstcpy_list(ls, r, &r->res_waitqueue); in dlm_purge_mstcpy_locks()
5394 static void purge_dead_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_dead_list() argument
5411 rsb_set_flag(r, RSB_RECOVER_LVB_INVAL); in purge_dead_list()
5414 del_lkb(r, lkb); in purge_dead_list()
5420 rsb_set_flag(r, RSB_RECOVER_GRANT); in purge_dead_list()
5431 struct dlm_rsb *r; in dlm_recover_purge() local
5449 list_for_each_entry(r, &ls->ls_root_list, res_root_list) { in dlm_recover_purge()
5450 hold_rsb(r); in dlm_recover_purge()
5451 lock_rsb(r); in dlm_recover_purge()
5452 if (is_master(r)) { in dlm_recover_purge()
5453 purge_dead_list(ls, r, &r->res_grantqueue, in dlm_recover_purge()
5455 purge_dead_list(ls, r, &r->res_convertqueue, in dlm_recover_purge()
5457 purge_dead_list(ls, r, &r->res_waitqueue, in dlm_recover_purge()
5460 unlock_rsb(r); in dlm_recover_purge()
5461 unhold_rsb(r); in dlm_recover_purge()
5474 struct dlm_rsb *r; in find_grant_rsb() local
5478 r = rb_entry(n, struct dlm_rsb, res_hashnode); in find_grant_rsb()
5480 if (!rsb_flag(r, RSB_RECOVER_GRANT)) in find_grant_rsb()
5482 if (!is_master(r)) { in find_grant_rsb()
5483 rsb_clear_flag(r, RSB_RECOVER_GRANT); in find_grant_rsb()
5486 hold_rsb(r); in find_grant_rsb()
5488 return r; in find_grant_rsb()
5513 struct dlm_rsb *r; in dlm_recover_grant() local
5520 r = find_grant_rsb(ls, bucket); in dlm_recover_grant()
5521 if (!r) { in dlm_recover_grant()
5529 lock_rsb(r); in dlm_recover_grant()
5531 grant_pending_locks(r, &count); in dlm_recover_grant()
5532 rsb_clear_flag(r, RSB_RECOVER_GRANT); in dlm_recover_grant()
5534 confirm_master(r, 0); in dlm_recover_grant()
5535 unlock_rsb(r); in dlm_recover_grant()
5536 put_rsb(r); in dlm_recover_grant()
5557 static struct dlm_lkb *search_remid(struct dlm_rsb *r, int nodeid, in search_remid() argument
5562 lkb = search_remid_list(&r->res_grantqueue, nodeid, remid); in search_remid()
5565 lkb = search_remid_list(&r->res_convertqueue, nodeid, remid); in search_remid()
5568 lkb = search_remid_list(&r->res_waitqueue, nodeid, remid); in search_remid()
5576 struct dlm_rsb *r, struct dlm_rcom *rc) in receive_rcom_lock_args() argument
5613 rsb_set_flag(r, RSB_RECOVER_CONVERT); in receive_rcom_lock_args()
5629 struct dlm_rsb *r; in dlm_recover_master_copy() local
5651 from_nodeid, R_RECEIVE_RECOVER, &r); in dlm_recover_master_copy()
5655 lock_rsb(r); in dlm_recover_master_copy()
5657 if (dlm_no_directory(ls) && (dlm_dir_nodeid(r) != dlm_our_nodeid())) { in dlm_recover_master_copy()
5664 lkb = search_remid(r, from_nodeid, remid); in dlm_recover_master_copy()
5674 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5680 attach_lkb(r, lkb); in dlm_recover_master_copy()
5681 add_lkb(r, lkb, rl->rl_status); in dlm_recover_master_copy()
5685 if (!list_empty(&r->res_waitqueue) || !list_empty(&r->res_convertqueue)) in dlm_recover_master_copy()
5686 rsb_set_flag(r, RSB_RECOVER_GRANT); in dlm_recover_master_copy()
5696 unlock_rsb(r); in dlm_recover_master_copy()
5697 put_rsb(r); in dlm_recover_master_copy()
5710 struct dlm_rsb *r; in dlm_recover_process_copy() local
5726 r = lkb->lkb_resource; in dlm_recover_process_copy()
5727 hold_rsb(r); in dlm_recover_process_copy()
5728 lock_rsb(r); in dlm_recover_process_copy()
5733 dlm_dump_rsb(r); in dlm_recover_process_copy()
5734 unlock_rsb(r); in dlm_recover_process_copy()
5735 put_rsb(r); in dlm_recover_process_copy()
5749 dlm_send_rcom_lock(r, lkb); in dlm_recover_process_copy()
5762 dlm_recovered_lock(r); in dlm_recover_process_copy()
5764 unlock_rsb(r); in dlm_recover_process_copy()
5765 put_rsb(r); in dlm_recover_process_copy()
6054 struct dlm_rsb *r; in dlm_user_deadlock() local
6071 r = lkb->lkb_resource; in dlm_user_deadlock()
6072 hold_rsb(r); in dlm_user_deadlock()
6073 lock_rsb(r); in dlm_user_deadlock()
6080 error = _cancel_lock(r, lkb); in dlm_user_deadlock()
6082 unlock_rsb(r); in dlm_user_deadlock()
6083 put_rsb(r); in dlm_user_deadlock()