Lines Matching refs:r

78 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb);
79 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb);
80 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb);
81 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb);
82 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb);
83 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode);
84 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb);
85 static int send_remove(struct dlm_rsb *r);
86 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
87 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
88 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
172 static void dlm_print_rsb(struct dlm_rsb *r) in dlm_print_rsb() argument
176 r->res_nodeid, r->res_master_nodeid, r->res_dir_nodeid, in dlm_print_rsb()
177 r->res_flags, r->res_first_lkid, r->res_recover_locks_count, in dlm_print_rsb()
178 r->res_name); in dlm_print_rsb()
181 void dlm_dump_rsb(struct dlm_rsb *r) in dlm_dump_rsb() argument
185 dlm_print_rsb(r); in dlm_dump_rsb()
188 list_empty(&r->res_root_list), list_empty(&r->res_recover_list)); in dlm_dump_rsb()
190 list_for_each_entry(lkb, &r->res_lookup, lkb_rsb_lookup) in dlm_dump_rsb()
193 list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) in dlm_dump_rsb()
196 list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) in dlm_dump_rsb()
199 list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) in dlm_dump_rsb()
245 static inline int is_remote(struct dlm_rsb *r) in is_remote() argument
247 DLM_ASSERT(r->res_nodeid >= 0, dlm_print_rsb(r);); in is_remote()
248 return !!r->res_nodeid; in is_remote()
290 static void queue_cast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in queue_cast() argument
314 static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) in queue_cast_overlap() argument
316 queue_cast(r, lkb, in queue_cast_overlap()
320 static void queue_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rqmode) in queue_bast() argument
323 send_bast(r, lkb, rqmode); in queue_bast()
336 static inline void hold_rsb(struct dlm_rsb *r) in hold_rsb() argument
338 kref_get(&r->res_ref); in hold_rsb()
341 void dlm_hold_rsb(struct dlm_rsb *r) in dlm_hold_rsb() argument
343 hold_rsb(r); in dlm_hold_rsb()
349 static void put_rsb(struct dlm_rsb *r) in put_rsb() argument
351 struct dlm_ls *ls = r->res_ls; in put_rsb()
352 uint32_t bucket = r->res_bucket; in put_rsb()
355 kref_put(&r->res_ref, toss_rsb); in put_rsb()
359 void dlm_put_rsb(struct dlm_rsb *r) in dlm_put_rsb() argument
361 put_rsb(r); in dlm_put_rsb()
403 struct dlm_rsb *r; in get_rsb_struct() local
415 r = list_first_entry(&ls->ls_new_rsb, struct dlm_rsb, res_hashchain); in get_rsb_struct()
416 list_del(&r->res_hashchain); in get_rsb_struct()
418 memset(&r->res_hashnode, 0, sizeof(struct rb_node)); in get_rsb_struct()
422 r->res_ls = ls; in get_rsb_struct()
423 r->res_length = len; in get_rsb_struct()
424 memcpy(r->res_name, name, len); in get_rsb_struct()
425 mutex_init(&r->res_mutex); in get_rsb_struct()
427 INIT_LIST_HEAD(&r->res_lookup); in get_rsb_struct()
428 INIT_LIST_HEAD(&r->res_grantqueue); in get_rsb_struct()
429 INIT_LIST_HEAD(&r->res_convertqueue); in get_rsb_struct()
430 INIT_LIST_HEAD(&r->res_waitqueue); in get_rsb_struct()
431 INIT_LIST_HEAD(&r->res_root_list); in get_rsb_struct()
432 INIT_LIST_HEAD(&r->res_recover_list); in get_rsb_struct()
434 *r_ret = r; in get_rsb_struct()
438 static int rsb_cmp(struct dlm_rsb *r, const char *name, int nlen) in rsb_cmp() argument
444 return memcmp(r->res_name, maxname, DLM_RESNAME_MAXLEN); in rsb_cmp()
451 struct dlm_rsb *r; in dlm_search_rsb_tree() local
455 r = rb_entry(node, struct dlm_rsb, res_hashnode); in dlm_search_rsb_tree()
456 rc = rsb_cmp(r, name, len); in dlm_search_rsb_tree()
468 *r_ret = r; in dlm_search_rsb_tree()
550 struct dlm_rsb *r = NULL; in find_rsb_dir() local
596 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_dir()
604 kref_get(&r->res_ref); in find_rsb_dir()
610 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_dir()
621 if ((r->res_master_nodeid != our_nodeid) && from_other) { in find_rsb_dir()
625 from_nodeid, r->res_master_nodeid, dir_nodeid, in find_rsb_dir()
626 r->res_name); in find_rsb_dir()
631 if ((r->res_master_nodeid != our_nodeid) && from_dir) { in find_rsb_dir()
634 from_nodeid, r->res_master_nodeid); in find_rsb_dir()
635 dlm_print_rsb(r); in find_rsb_dir()
637 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
638 r->res_nodeid = 0; in find_rsb_dir()
639 rsb_clear_flag(r, RSB_MASTER_UNCERTAIN); in find_rsb_dir()
640 r->res_first_lkid = 0; in find_rsb_dir()
643 if (from_local && (r->res_master_nodeid != our_nodeid)) { in find_rsb_dir()
646 rsb_set_flag(r, RSB_MASTER_UNCERTAIN); in find_rsb_dir()
647 r->res_first_lkid = 0; in find_rsb_dir()
650 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_dir()
651 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
663 error = get_rsb_struct(ls, name, len, &r); in find_rsb_dir()
671 r->res_hash = hash; in find_rsb_dir()
672 r->res_bucket = b; in find_rsb_dir()
673 r->res_dir_nodeid = dir_nodeid; in find_rsb_dir()
674 kref_init(&r->res_ref); in find_rsb_dir()
679 from_nodeid, r->res_name); in find_rsb_dir()
680 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
681 r->res_nodeid = 0; in find_rsb_dir()
688 from_nodeid, dir_nodeid, our_nodeid, r->res_name); in find_rsb_dir()
689 dlm_free_rsb(r); in find_rsb_dir()
690 r = NULL; in find_rsb_dir()
697 from_nodeid, dir_nodeid, r->res_name); in find_rsb_dir()
703 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
704 r->res_nodeid = 0; in find_rsb_dir()
707 r->res_master_nodeid = 0; in find_rsb_dir()
708 r->res_nodeid = -1; in find_rsb_dir()
712 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_dir()
716 *r_ret = r; in find_rsb_dir()
729 struct dlm_rsb *r = NULL; in find_rsb_nodir() local
741 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in find_rsb_nodir()
749 kref_get(&r->res_ref); in find_rsb_nodir()
754 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in find_rsb_nodir()
764 if (!recover && (r->res_master_nodeid != our_nodeid) && from_nodeid) { in find_rsb_nodir()
768 from_nodeid, r->res_master_nodeid, dir_nodeid); in find_rsb_nodir()
769 dlm_print_rsb(r); in find_rsb_nodir()
774 if (!recover && (r->res_master_nodeid != our_nodeid) && in find_rsb_nodir()
779 our_nodeid, r->res_master_nodeid, dir_nodeid); in find_rsb_nodir()
780 dlm_print_rsb(r); in find_rsb_nodir()
781 r->res_master_nodeid = our_nodeid; in find_rsb_nodir()
782 r->res_nodeid = 0; in find_rsb_nodir()
785 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in find_rsb_nodir()
786 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
795 error = get_rsb_struct(ls, name, len, &r); in find_rsb_nodir()
803 r->res_hash = hash; in find_rsb_nodir()
804 r->res_bucket = b; in find_rsb_nodir()
805 r->res_dir_nodeid = dir_nodeid; in find_rsb_nodir()
806 r->res_master_nodeid = dir_nodeid; in find_rsb_nodir()
807 r->res_nodeid = (dir_nodeid == our_nodeid) ? 0 : dir_nodeid; in find_rsb_nodir()
808 kref_init(&r->res_ref); in find_rsb_nodir()
810 error = rsb_insert(r, &ls->ls_rsbtbl[b].keep); in find_rsb_nodir()
814 *r_ret = r; in find_rsb_nodir()
843 static int validate_master_nodeid(struct dlm_ls *ls, struct dlm_rsb *r, in validate_master_nodeid() argument
848 from_nodeid, r->res_master_nodeid, in validate_master_nodeid()
849 r->res_dir_nodeid); in validate_master_nodeid()
850 dlm_print_rsb(r); in validate_master_nodeid()
854 if (from_nodeid != r->res_dir_nodeid) { in validate_master_nodeid()
859 if (r->res_master_nodeid) { in validate_master_nodeid()
862 r->res_master_nodeid, r->res_dir_nodeid, in validate_master_nodeid()
863 r->res_first_lkid, r->res_name); in validate_master_nodeid()
870 if (r->res_master_nodeid) { in validate_master_nodeid()
873 from_nodeid, r->res_master_nodeid, in validate_master_nodeid()
874 r->res_first_lkid, r->res_name); in validate_master_nodeid()
877 r->res_master_nodeid = dlm_our_nodeid(); in validate_master_nodeid()
878 r->res_nodeid = 0; in validate_master_nodeid()
915 struct dlm_rsb *r = NULL; in dlm_master_lookup() local
949 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_master_lookup()
954 hold_rsb(r); in dlm_master_lookup()
956 lock_rsb(r); in dlm_master_lookup()
960 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_master_lookup()
969 if (r->res_dir_nodeid != our_nodeid) { in dlm_master_lookup()
972 r->res_dir_nodeid, our_nodeid, r->res_name); in dlm_master_lookup()
973 r->res_dir_nodeid = our_nodeid; in dlm_master_lookup()
976 if (fix_master && dlm_is_removed(ls, r->res_master_nodeid)) { in dlm_master_lookup()
982 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
983 r->res_nodeid = from_nodeid; in dlm_master_lookup()
984 rsb_set_flag(r, RSB_NEW_MASTER); in dlm_master_lookup()
989 dlm_dump_rsb(r); in dlm_master_lookup()
993 if (from_master && (r->res_master_nodeid != from_nodeid)) { in dlm_master_lookup()
1000 from_nodeid, r->res_master_nodeid, r->res_nodeid, in dlm_master_lookup()
1001 r->res_first_lkid, r->res_name); in dlm_master_lookup()
1003 if (r->res_master_nodeid == our_nodeid) { in dlm_master_lookup()
1005 dlm_dump_rsb(r); in dlm_master_lookup()
1006 dlm_send_rcom_lookup_dump(r, from_nodeid); in dlm_master_lookup()
1010 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
1011 r->res_nodeid = from_nodeid; in dlm_master_lookup()
1012 rsb_set_flag(r, RSB_NEW_MASTER); in dlm_master_lookup()
1015 if (!r->res_master_nodeid) { in dlm_master_lookup()
1020 from_nodeid, r->res_first_lkid, r->res_name); in dlm_master_lookup()
1021 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
1022 r->res_nodeid = from_nodeid; in dlm_master_lookup()
1026 (r->res_master_nodeid == from_nodeid)) { in dlm_master_lookup()
1033 r->res_first_lkid, r->res_name); in dlm_master_lookup()
1037 *r_nodeid = r->res_master_nodeid; in dlm_master_lookup()
1042 r->res_toss_time = jiffies; in dlm_master_lookup()
1047 unlock_rsb(r); in dlm_master_lookup()
1048 put_rsb(r); in dlm_master_lookup()
1053 error = get_rsb_struct(ls, name, len, &r); in dlm_master_lookup()
1061 r->res_hash = hash; in dlm_master_lookup()
1062 r->res_bucket = b; in dlm_master_lookup()
1063 r->res_dir_nodeid = our_nodeid; in dlm_master_lookup()
1064 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
1065 r->res_nodeid = from_nodeid; in dlm_master_lookup()
1066 kref_init(&r->res_ref); in dlm_master_lookup()
1067 r->res_toss_time = jiffies; in dlm_master_lookup()
1069 error = rsb_insert(r, &ls->ls_rsbtbl[b].toss); in dlm_master_lookup()
1072 dlm_free_rsb(r); in dlm_master_lookup()
1089 struct dlm_rsb *r; in dlm_dump_rsb_hash() local
1095 r = rb_entry(n, struct dlm_rsb, res_hashnode); in dlm_dump_rsb_hash()
1096 if (r->res_hash == hash) in dlm_dump_rsb_hash()
1097 dlm_dump_rsb(r); in dlm_dump_rsb_hash()
1105 struct dlm_rsb *r = NULL; in dlm_dump_rsb_name() local
1113 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_dump_rsb_name()
1117 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in dlm_dump_rsb_name()
1121 dlm_dump_rsb(r); in dlm_dump_rsb_name()
1128 struct dlm_rsb *r = container_of(kref, struct dlm_rsb, res_ref); in toss_rsb() local
1129 struct dlm_ls *ls = r->res_ls; in toss_rsb()
1131 DLM_ASSERT(list_empty(&r->res_root_list), dlm_print_rsb(r);); in toss_rsb()
1132 kref_init(&r->res_ref); in toss_rsb()
1133 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[r->res_bucket].keep); in toss_rsb()
1134 rsb_insert(r, &ls->ls_rsbtbl[r->res_bucket].toss); in toss_rsb()
1135 r->res_toss_time = jiffies; in toss_rsb()
1136 ls->ls_rsbtbl[r->res_bucket].flags |= DLM_RTF_SHRINK; in toss_rsb()
1137 if (r->res_lvbptr) { in toss_rsb()
1138 dlm_free_lvb(r->res_lvbptr); in toss_rsb()
1139 r->res_lvbptr = NULL; in toss_rsb()
1145 static void unhold_rsb(struct dlm_rsb *r) in unhold_rsb() argument
1148 rv = kref_put(&r->res_ref, toss_rsb); in unhold_rsb()
1149 DLM_ASSERT(!rv, dlm_dump_rsb(r);); in unhold_rsb()
1154 struct dlm_rsb *r = container_of(kref, struct dlm_rsb, res_ref); in kill_rsb() local
1159 DLM_ASSERT(list_empty(&r->res_lookup), dlm_dump_rsb(r);); in kill_rsb()
1160 DLM_ASSERT(list_empty(&r->res_grantqueue), dlm_dump_rsb(r);); in kill_rsb()
1161 DLM_ASSERT(list_empty(&r->res_convertqueue), dlm_dump_rsb(r);); in kill_rsb()
1162 DLM_ASSERT(list_empty(&r->res_waitqueue), dlm_dump_rsb(r);); in kill_rsb()
1163 DLM_ASSERT(list_empty(&r->res_root_list), dlm_dump_rsb(r);); in kill_rsb()
1164 DLM_ASSERT(list_empty(&r->res_recover_list), dlm_dump_rsb(r);); in kill_rsb()
1170 static void attach_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in attach_lkb() argument
1172 hold_rsb(r); in attach_lkb()
1173 lkb->lkb_resource = r; in attach_lkb()
1314 static void add_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int status) in add_lkb() argument
1327 list_add(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1329 list_add_tail(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1333 lkb_add_ordered(&lkb->lkb_statequeue, &r->res_grantqueue, in add_lkb()
1338 list_add(&lkb->lkb_statequeue, &r->res_convertqueue); in add_lkb()
1341 &r->res_convertqueue); in add_lkb()
1348 static void del_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in del_lkb() argument
1355 static void move_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int sts) in move_lkb() argument
1358 del_lkb(r, lkb); in move_lkb()
1359 add_lkb(r, lkb, sts); in move_lkb()
1628 static void wait_pending_remove(struct dlm_rsb *r) in wait_pending_remove() argument
1630 struct dlm_ls *ls = r->res_ls; in wait_pending_remove()
1634 !rsb_cmp(r, ls->ls_remove_name, ls->ls_remove_len)) { in wait_pending_remove()
1636 r->res_dir_nodeid, r->res_name); in wait_pending_remove()
1654 struct dlm_rsb *r; in shrink_bucket() local
1672 r = rb_entry(n, struct dlm_rsb, res_hashnode); in shrink_bucket()
1680 (r->res_master_nodeid != our_nodeid) && in shrink_bucket()
1681 (dlm_dir_nodeid(r) == our_nodeid)) { in shrink_bucket()
1687 if (!time_after_eq(jiffies, r->res_toss_time + in shrink_bucket()
1693 (r->res_master_nodeid == our_nodeid) && in shrink_bucket()
1694 (dlm_dir_nodeid(r) != our_nodeid)) { in shrink_bucket()
1700 ls->ls_remove_lens[remote_count] = r->res_length; in shrink_bucket()
1701 memcpy(ls->ls_remove_names[remote_count], r->res_name, in shrink_bucket()
1710 if (!kref_put(&r->res_ref, kill_rsb)) { in shrink_bucket()
1711 log_error(ls, "tossed rsb in use %s", r->res_name); in shrink_bucket()
1715 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1716 dlm_free_rsb(r); in shrink_bucket()
1744 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in shrink_bucket()
1751 if (r->res_master_nodeid != our_nodeid) { in shrink_bucket()
1754 r->res_master_nodeid, r->res_dir_nodeid, in shrink_bucket()
1759 if (r->res_dir_nodeid == our_nodeid) { in shrink_bucket()
1763 r->res_dir_nodeid, r->res_master_nodeid, in shrink_bucket()
1768 if (!time_after_eq(jiffies, r->res_toss_time + in shrink_bucket()
1772 r->res_toss_time, jiffies, name); in shrink_bucket()
1776 if (!kref_put(&r->res_ref, kill_rsb)) { in shrink_bucket()
1782 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1791 send_remove(r); in shrink_bucket()
1799 dlm_free_rsb(r); in shrink_bucket()
1859 struct dlm_rsb *r; in dlm_scan_timeout() local
1894 r = lkb->lkb_resource; in dlm_scan_timeout()
1895 hold_rsb(r); in dlm_scan_timeout()
1896 lock_rsb(r); in dlm_scan_timeout()
1908 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in dlm_scan_timeout()
1912 _cancel_lock(r, lkb); in dlm_scan_timeout()
1915 unlock_rsb(r); in dlm_scan_timeout()
1916 unhold_rsb(r); in dlm_scan_timeout()
1948 static void set_lvb_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_lock() argument
1950 int b, len = r->res_ls->ls_lvblen; in set_lvb_lock()
1965 if (!r->res_lvbptr) in set_lvb_lock()
1968 memcpy(lkb->lkb_lvbptr, r->res_lvbptr, len); in set_lvb_lock()
1969 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1973 rsb_set_flag(r, RSB_VALNOTVALID); in set_lvb_lock()
1983 if (!r->res_lvbptr) in set_lvb_lock()
1984 r->res_lvbptr = dlm_allocate_lvb(r->res_ls); in set_lvb_lock()
1986 if (!r->res_lvbptr) in set_lvb_lock()
1989 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, len); in set_lvb_lock()
1990 r->res_lvbseq++; in set_lvb_lock()
1991 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1992 rsb_clear_flag(r, RSB_VALNOTVALID); in set_lvb_lock()
1995 if (rsb_flag(r, RSB_VALNOTVALID)) in set_lvb_lock()
1999 static void set_lvb_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_unlock() argument
2005 rsb_set_flag(r, RSB_VALNOTVALID); in set_lvb_unlock()
2015 if (!r->res_lvbptr) in set_lvb_unlock()
2016 r->res_lvbptr = dlm_allocate_lvb(r->res_ls); in set_lvb_unlock()
2018 if (!r->res_lvbptr) in set_lvb_unlock()
2021 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in set_lvb_unlock()
2022 r->res_lvbseq++; in set_lvb_unlock()
2023 rsb_clear_flag(r, RSB_VALNOTVALID); in set_lvb_unlock()
2028 static void set_lvb_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in set_lvb_lock_pc() argument
2042 if (len > r->res_ls->ls_lvblen) in set_lvb_lock_pc()
2043 len = r->res_ls->ls_lvblen; in set_lvb_lock_pc()
2059 static void _remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _remove_lock() argument
2061 del_lkb(r, lkb); in _remove_lock()
2068 static void remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock() argument
2070 set_lvb_unlock(r, lkb); in remove_lock()
2071 _remove_lock(r, lkb); in remove_lock()
2074 static void remove_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock_pc() argument
2076 _remove_lock(r, lkb); in remove_lock_pc()
2083 static int revert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock() argument
2093 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in revert_lock()
2097 del_lkb(r, lkb); in revert_lock()
2110 static int revert_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock_pc() argument
2112 return revert_lock(r, lkb); in revert_lock_pc()
2115 static void _grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _grant_lock() argument
2120 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2122 add_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2129 static void grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock() argument
2131 set_lvb_lock(r, lkb); in grant_lock()
2132 _grant_lock(r, lkb); in grant_lock()
2135 static void grant_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in grant_lock_pc() argument
2138 set_lvb_lock_pc(r, lkb, ms); in grant_lock_pc()
2139 _grant_lock(r, lkb); in grant_lock_pc()
2146 static void grant_lock_pending(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock_pending() argument
2148 grant_lock(r, lkb); in grant_lock_pending()
2150 send_grant(r, lkb); in grant_lock_pending()
2152 queue_cast(r, lkb, 0); in grant_lock_pending()
2259 static int conversion_deadlock_detect(struct dlm_rsb *r, struct dlm_lkb *lkb2) in conversion_deadlock_detect() argument
2264 list_for_each_entry(lkb1, &r->res_convertqueue, lkb_statequeue) { in conversion_deadlock_detect()
2298 static int _can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in _can_be_granted() argument
2330 if (queue_conflict(&r->res_grantqueue, lkb)) in _can_be_granted()
2339 if (queue_conflict(&r->res_convertqueue, lkb)) in _can_be_granted()
2391 if (list_empty(&r->res_convertqueue)) in _can_be_granted()
2411 if (!now && conv && first_in_list(lkb, &r->res_convertqueue)) in _can_be_granted()
2425 if (now && !conv && list_empty(&r->res_convertqueue) && in _can_be_granted()
2426 list_empty(&r->res_waitqueue)) in _can_be_granted()
2437 if (!now && !conv && list_empty(&r->res_convertqueue) && in _can_be_granted()
2438 first_in_list(lkb, &r->res_waitqueue)) in _can_be_granted()
2444 static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in can_be_granted() argument
2454 rv = _can_be_granted(r, lkb, now, recover); in can_be_granted()
2465 conversion_deadlock_detect(r, lkb)) { in can_be_granted()
2475 dlm_dump_rsb(r); in can_be_granted()
2495 rv = _can_be_granted(r, lkb, now, 0); in can_be_granted()
2515 static int grant_pending_convert(struct dlm_rsb *r, int high, int *cw, in grant_pending_convert() argument
2519 int recover = rsb_flag(r, RSB_RECOVER_GRANT); in grant_pending_convert()
2529 list_for_each_entry_safe(lkb, s, &r->res_convertqueue, lkb_statequeue) { in grant_pending_convert()
2533 if (can_be_granted(r, lkb, 0, recover, &deadlk)) { in grant_pending_convert()
2534 grant_lock_pending(r, lkb); in grant_pending_convert()
2543 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in grant_pending_convert()
2550 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in grant_pending_convert()
2551 dlm_dump_rsb(r); in grant_pending_convert()
2571 static int grant_pending_wait(struct dlm_rsb *r, int high, int *cw, in grant_pending_wait() argument
2576 list_for_each_entry_safe(lkb, s, &r->res_waitqueue, lkb_statequeue) { in grant_pending_wait()
2577 if (can_be_granted(r, lkb, 0, 0, NULL)) { in grant_pending_wait()
2578 grant_lock_pending(r, lkb); in grant_pending_wait()
2610 static void grant_pending_locks(struct dlm_rsb *r, unsigned int *count) in grant_pending_locks() argument
2616 if (!is_master(r)) { in grant_pending_locks()
2617 log_print("grant_pending_locks r nodeid %d", r->res_nodeid); in grant_pending_locks()
2618 dlm_dump_rsb(r); in grant_pending_locks()
2622 high = grant_pending_convert(r, high, &cw, count); in grant_pending_locks()
2623 high = grant_pending_wait(r, high, &cw, count); in grant_pending_locks()
2634 list_for_each_entry_safe(lkb, s, &r->res_grantqueue, lkb_statequeue) { in grant_pending_locks()
2638 queue_bast(r, lkb, DLM_LOCK_CW); in grant_pending_locks()
2640 queue_bast(r, lkb, high); in grant_pending_locks()
2660 static void send_bast_queue(struct dlm_rsb *r, struct list_head *head, in send_bast_queue() argument
2670 queue_bast(r, gr, lkb->lkb_rqmode); in send_bast_queue()
2676 static void send_blocking_asts(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts() argument
2678 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts()
2681 static void send_blocking_asts_all(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts_all() argument
2683 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts_all()
2684 send_bast_queue(r, &r->res_convertqueue, lkb); in send_blocking_asts_all()
2706 static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_master() argument
2710 if (rsb_flag(r, RSB_MASTER_UNCERTAIN)) { in set_master()
2711 rsb_clear_flag(r, RSB_MASTER_UNCERTAIN); in set_master()
2712 r->res_first_lkid = lkb->lkb_id; in set_master()
2713 lkb->lkb_nodeid = r->res_nodeid; in set_master()
2717 if (r->res_first_lkid && r->res_first_lkid != lkb->lkb_id) { in set_master()
2718 list_add_tail(&lkb->lkb_rsb_lookup, &r->res_lookup); in set_master()
2722 if (r->res_master_nodeid == our_nodeid) { in set_master()
2727 if (r->res_master_nodeid) { in set_master()
2728 lkb->lkb_nodeid = r->res_master_nodeid; in set_master()
2732 if (dlm_dir_nodeid(r) == our_nodeid) { in set_master()
2739 log_debug(r->res_ls, "set_master %x self master %d dir %d %s", in set_master()
2740 lkb->lkb_id, r->res_master_nodeid, r->res_dir_nodeid, in set_master()
2741 r->res_name); in set_master()
2742 r->res_master_nodeid = our_nodeid; in set_master()
2743 r->res_nodeid = 0; in set_master()
2748 wait_pending_remove(r); in set_master()
2750 r->res_first_lkid = lkb->lkb_id; in set_master()
2751 send_lookup(r, lkb); in set_master()
2755 static void process_lookup_list(struct dlm_rsb *r) in process_lookup_list() argument
2759 list_for_each_entry_safe(lkb, safe, &r->res_lookup, lkb_rsb_lookup) { in process_lookup_list()
2761 _request_lock(r, lkb); in process_lookup_list()
2768 static void confirm_master(struct dlm_rsb *r, int error) in confirm_master() argument
2772 if (!r->res_first_lkid) in confirm_master()
2778 r->res_first_lkid = 0; in confirm_master()
2779 process_lookup_list(r); in confirm_master()
2789 r->res_first_lkid = 0; in confirm_master()
2791 if (!list_empty(&r->res_lookup)) { in confirm_master()
2792 lkb = list_entry(r->res_lookup.next, struct dlm_lkb, in confirm_master()
2795 r->res_first_lkid = lkb->lkb_id; in confirm_master()
2796 _request_lock(r, lkb); in confirm_master()
2801 log_error(r->res_ls, "confirm_master unknown error %d", error); in confirm_master()
3073 static int do_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_request() argument
3077 if (can_be_granted(r, lkb, 1, 0, NULL)) { in do_request()
3078 grant_lock(r, lkb); in do_request()
3079 queue_cast(r, lkb, 0); in do_request()
3085 add_lkb(r, lkb, DLM_LKSTS_WAITING); in do_request()
3091 queue_cast(r, lkb, -EAGAIN); in do_request()
3096 static void do_request_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_request_effects() argument
3102 send_blocking_asts_all(r, lkb); in do_request_effects()
3105 send_blocking_asts(r, lkb); in do_request_effects()
3110 static int do_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_convert() argument
3117 if (can_be_granted(r, lkb, 1, 0, &deadlk)) { in do_convert()
3118 grant_lock(r, lkb); in do_convert()
3119 queue_cast(r, lkb, 0); in do_convert()
3129 revert_lock(r, lkb); in do_convert()
3130 queue_cast(r, lkb, -EDEADLK); in do_convert()
3142 grant_pending_convert(r, DLM_LOCK_IV, NULL, NULL); in do_convert()
3143 if (_can_be_granted(r, lkb, 1, 0)) { in do_convert()
3144 grant_lock(r, lkb); in do_convert()
3145 queue_cast(r, lkb, 0); in do_convert()
3153 del_lkb(r, lkb); in do_convert()
3154 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in do_convert()
3160 queue_cast(r, lkb, -EAGAIN); in do_convert()
3165 static void do_convert_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_convert_effects() argument
3170 grant_pending_locks(r, NULL); in do_convert_effects()
3175 send_blocking_asts_all(r, lkb); in do_convert_effects()
3178 send_blocking_asts(r, lkb); in do_convert_effects()
3183 static int do_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_unlock() argument
3185 remove_lock(r, lkb); in do_unlock()
3186 queue_cast(r, lkb, -DLM_EUNLOCK); in do_unlock()
3190 static void do_unlock_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_unlock_effects() argument
3193 grant_pending_locks(r, NULL); in do_unlock_effects()
3198 static int do_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_cancel() argument
3202 error = revert_lock(r, lkb); in do_cancel()
3204 queue_cast(r, lkb, -DLM_ECANCEL); in do_cancel()
3210 static void do_cancel_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_cancel_effects() argument
3214 grant_pending_locks(r, NULL); in do_cancel_effects()
3224 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _request_lock() argument
3230 error = set_master(r, lkb); in _request_lock()
3238 if (is_remote(r)) { in _request_lock()
3240 error = send_request(r, lkb); in _request_lock()
3242 error = do_request(r, lkb); in _request_lock()
3245 do_request_effects(r, lkb, error); in _request_lock()
3253 static int _convert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _convert_lock() argument
3257 if (is_remote(r)) { in _convert_lock()
3259 error = send_convert(r, lkb); in _convert_lock()
3261 error = do_convert(r, lkb); in _convert_lock()
3264 do_convert_effects(r, lkb, error); in _convert_lock()
3272 static int _unlock_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _unlock_lock() argument
3276 if (is_remote(r)) { in _unlock_lock()
3278 error = send_unlock(r, lkb); in _unlock_lock()
3280 error = do_unlock(r, lkb); in _unlock_lock()
3283 do_unlock_effects(r, lkb, error); in _unlock_lock()
3291 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _cancel_lock() argument
3295 if (is_remote(r)) { in _cancel_lock()
3297 error = send_cancel(r, lkb); in _cancel_lock()
3299 error = do_cancel(r, lkb); in _cancel_lock()
3302 do_cancel_effects(r, lkb, error); in _cancel_lock()
3316 struct dlm_rsb *r; in request_lock() local
3323 error = find_rsb(ls, name, len, 0, R_REQUEST, &r); in request_lock()
3327 lock_rsb(r); in request_lock()
3329 attach_lkb(r, lkb); in request_lock()
3332 error = _request_lock(r, lkb); in request_lock()
3334 unlock_rsb(r); in request_lock()
3335 put_rsb(r); in request_lock()
3342 struct dlm_rsb *r; in convert_lock() local
3345 r = lkb->lkb_resource; in convert_lock()
3347 hold_rsb(r); in convert_lock()
3348 lock_rsb(r); in convert_lock()
3354 error = _convert_lock(r, lkb); in convert_lock()
3356 unlock_rsb(r); in convert_lock()
3357 put_rsb(r); in convert_lock()
3364 struct dlm_rsb *r; in unlock_lock() local
3367 r = lkb->lkb_resource; in unlock_lock()
3369 hold_rsb(r); in unlock_lock()
3370 lock_rsb(r); in unlock_lock()
3376 error = _unlock_lock(r, lkb); in unlock_lock()
3378 unlock_rsb(r); in unlock_lock()
3379 put_rsb(r); in unlock_lock()
3386 struct dlm_rsb *r; in cancel_lock() local
3389 r = lkb->lkb_resource; in cancel_lock()
3391 hold_rsb(r); in cancel_lock()
3392 lock_rsb(r); in cancel_lock()
3398 error = _cancel_lock(r, lkb); in cancel_lock()
3400 unlock_rsb(r); in cancel_lock()
3401 put_rsb(r); in cancel_lock()
3560 static int create_message(struct dlm_rsb *r, struct dlm_lkb *lkb, in create_message() argument
3571 mb_len += r->res_length; in create_message()
3579 mb_len += r->res_ls->ls_lvblen; in create_message()
3583 return _create_message(r->res_ls, mb_len, to_nodeid, mstype, in create_message()
3597 static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_args() argument
3611 ms->m_hash = r->res_hash; in send_args()
3627 memcpy(ms->m_extra, r->res_name, r->res_length); in send_args()
3636 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in send_args()
3641 static int send_common(struct dlm_rsb *r, struct dlm_lkb *lkb, int mstype) in send_common() argument
3647 to_nodeid = r->res_nodeid; in send_common()
3653 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common()
3657 send_args(r, lkb, ms); in send_common()
3669 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_request() argument
3671 return send_common(r, lkb, DLM_MSG_REQUEST); in send_request()
3674 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_convert() argument
3678 error = send_common(r, lkb, DLM_MSG_CONVERT); in send_convert()
3683 r->res_ls->ls_stub_ms.m_flags = DLM_IFL_STUB_MS; in send_convert()
3684 r->res_ls->ls_stub_ms.m_type = DLM_MSG_CONVERT_REPLY; in send_convert()
3685 r->res_ls->ls_stub_ms.m_result = 0; in send_convert()
3686 __receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms); in send_convert()
3696 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_unlock() argument
3698 return send_common(r, lkb, DLM_MSG_UNLOCK); in send_unlock()
3701 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_cancel() argument
3703 return send_common(r, lkb, DLM_MSG_CANCEL); in send_cancel()
3706 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_grant() argument
3714 error = create_message(r, lkb, to_nodeid, DLM_MSG_GRANT, &ms, &mh); in send_grant()
3718 send_args(r, lkb, ms); in send_grant()
3727 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode) in send_bast() argument
3735 error = create_message(r, NULL, to_nodeid, DLM_MSG_BAST, &ms, &mh); in send_bast()
3739 send_args(r, lkb, ms); in send_bast()
3748 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_lookup() argument
3754 to_nodeid = dlm_dir_nodeid(r); in send_lookup()
3760 error = create_message(r, NULL, to_nodeid, DLM_MSG_LOOKUP, &ms, &mh); in send_lookup()
3764 send_args(r, lkb, ms); in send_lookup()
3776 static int send_remove(struct dlm_rsb *r) in send_remove() argument
3782 to_nodeid = dlm_dir_nodeid(r); in send_remove()
3784 error = create_message(r, NULL, to_nodeid, DLM_MSG_REMOVE, &ms, &mh); in send_remove()
3788 memcpy(ms->m_extra, r->res_name, r->res_length); in send_remove()
3789 ms->m_hash = r->res_hash; in send_remove()
3796 static int send_common_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_common_reply() argument
3805 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common_reply()
3809 send_args(r, lkb, ms); in send_common_reply()
3818 static int send_request_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_request_reply() argument
3820 return send_common_reply(r, lkb, DLM_MSG_REQUEST_REPLY, rv); in send_request_reply()
3823 static int send_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_convert_reply() argument
3825 return send_common_reply(r, lkb, DLM_MSG_CONVERT_REPLY, rv); in send_convert_reply()
3828 static int send_unlock_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_unlock_reply() argument
3830 return send_common_reply(r, lkb, DLM_MSG_UNLOCK_REPLY, rv); in send_unlock_reply()
3833 static int send_cancel_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_cancel_reply() argument
3835 return send_common_reply(r, lkb, DLM_MSG_CANCEL_REPLY, rv); in send_cancel_reply()
3841 struct dlm_rsb *r = &ls->ls_stub_rsb; in send_lookup_reply() local
3846 error = create_message(r, NULL, nodeid, DLM_MSG_LOOKUP_REPLY, &ms, &mh); in send_lookup_reply()
4018 struct dlm_rsb *r; in send_repeat_remove() local
4033 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in send_repeat_remove()
4040 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in send_repeat_remove()
4074 struct dlm_rsb *r; in receive_request() local
4101 R_RECEIVE_REQUEST, &r); in receive_request()
4107 lock_rsb(r); in receive_request()
4109 if (r->res_master_nodeid != dlm_our_nodeid()) { in receive_request()
4110 error = validate_master_nodeid(ls, r, from_nodeid); in receive_request()
4112 unlock_rsb(r); in receive_request()
4113 put_rsb(r); in receive_request()
4119 attach_lkb(r, lkb); in receive_request()
4120 error = do_request(r, lkb); in receive_request()
4121 send_request_reply(r, lkb, error); in receive_request()
4122 do_request_effects(r, lkb, error); in receive_request()
4124 unlock_rsb(r); in receive_request()
4125 put_rsb(r); in receive_request()
4167 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
4236 r = lkb->lkb_resource; in receive_unlock()
4238 hold_rsb(r); in receive_unlock()
4239 lock_rsb(r); in receive_unlock()
4249 send_unlock_reply(r, lkb, error); in receive_unlock()
4253 error = do_unlock(r, lkb); in receive_unlock()
4254 send_unlock_reply(r, lkb, error); in receive_unlock()
4255 do_unlock_effects(r, lkb, error); in receive_unlock()
4257 unlock_rsb(r); in receive_unlock()
4258 put_rsb(r); in receive_unlock()
4271 struct dlm_rsb *r; in receive_cancel() local
4280 r = lkb->lkb_resource; in receive_cancel()
4282 hold_rsb(r); in receive_cancel()
4283 lock_rsb(r); in receive_cancel()
4289 error = do_cancel(r, lkb); in receive_cancel()
4290 send_cancel_reply(r, lkb, error); in receive_cancel()
4291 do_cancel_effects(r, lkb, error); in receive_cancel()
4293 unlock_rsb(r); in receive_cancel()
4294 put_rsb(r); in receive_cancel()
4307 struct dlm_rsb *r; in receive_grant() local
4314 r = lkb->lkb_resource; in receive_grant()
4316 hold_rsb(r); in receive_grant()
4317 lock_rsb(r); in receive_grant()
4326 grant_lock_pc(r, lkb, ms); in receive_grant()
4327 queue_cast(r, lkb, 0); in receive_grant()
4329 unlock_rsb(r); in receive_grant()
4330 put_rsb(r); in receive_grant()
4338 struct dlm_rsb *r; in receive_bast() local
4345 r = lkb->lkb_resource; in receive_bast()
4347 hold_rsb(r); in receive_bast()
4348 lock_rsb(r); in receive_bast()
4354 queue_bast(r, lkb, ms->m_bastmode); in receive_bast()
4357 unlock_rsb(r); in receive_bast()
4358 put_rsb(r); in receive_bast()
4386 struct dlm_rsb *r; in receive_remove() local
4424 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in receive_remove()
4427 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in receive_remove()
4435 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4438 from_nodeid, r->res_master_nodeid); in receive_remove()
4439 dlm_print_rsb(r); in receive_remove()
4445 from_nodeid, r->res_master_nodeid, r->res_first_lkid, in receive_remove()
4451 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4453 from_nodeid, r->res_master_nodeid); in receive_remove()
4454 dlm_print_rsb(r); in receive_remove()
4459 if (kref_put(&r->res_ref, kill_rsb)) { in receive_remove()
4460 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in receive_remove()
4462 dlm_free_rsb(r); in receive_remove()
4466 dlm_print_rsb(r); in receive_remove()
4479 struct dlm_rsb *r; in receive_request_reply() local
4487 r = lkb->lkb_resource; in receive_request_reply()
4488 hold_rsb(r); in receive_request_reply()
4489 lock_rsb(r); in receive_request_reply()
4500 dlm_dump_rsb(r); in receive_request_reply()
4507 r->res_master_nodeid = from_nodeid; in receive_request_reply()
4508 r->res_nodeid = from_nodeid; in receive_request_reply()
4518 queue_cast(r, lkb, -EAGAIN); in receive_request_reply()
4519 confirm_master(r, -EAGAIN); in receive_request_reply()
4531 add_lkb(r, lkb, DLM_LKSTS_WAITING); in receive_request_reply()
4534 grant_lock_pc(r, lkb, ms); in receive_request_reply()
4535 queue_cast(r, lkb, 0); in receive_request_reply()
4537 confirm_master(r, result); in receive_request_reply()
4545 from_nodeid, result, r->res_master_nodeid, in receive_request_reply()
4546 r->res_dir_nodeid, r->res_first_lkid, r->res_name); in receive_request_reply()
4548 if (r->res_dir_nodeid != dlm_our_nodeid() && in receive_request_reply()
4549 r->res_master_nodeid != dlm_our_nodeid()) { in receive_request_reply()
4551 r->res_master_nodeid = 0; in receive_request_reply()
4552 r->res_nodeid = -1; in receive_request_reply()
4558 queue_cast_overlap(r, lkb); in receive_request_reply()
4559 confirm_master(r, result); in receive_request_reply()
4562 _request_lock(r, lkb); in receive_request_reply()
4564 if (r->res_master_nodeid == dlm_our_nodeid()) in receive_request_reply()
4565 confirm_master(r, 0); in receive_request_reply()
4579 send_unlock(r, lkb); in receive_request_reply()
4584 send_cancel(r, lkb); in receive_request_reply()
4590 unlock_rsb(r); in receive_request_reply()
4591 put_rsb(r); in receive_request_reply()
4596 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in __receive_convert_reply() argument
4603 queue_cast(r, lkb, -EAGAIN); in __receive_convert_reply()
4608 revert_lock_pc(r, lkb); in __receive_convert_reply()
4609 queue_cast(r, lkb, -EDEADLK); in __receive_convert_reply()
4617 del_lkb(r, lkb); in __receive_convert_reply()
4618 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in __receive_convert_reply()
4627 grant_lock_pc(r, lkb, ms); in __receive_convert_reply()
4628 queue_cast(r, lkb, 0); in __receive_convert_reply()
4632 log_error(r->res_ls, "receive_convert_reply %x remote %d %x %d", in __receive_convert_reply()
4635 dlm_print_rsb(r); in __receive_convert_reply()
4642 struct dlm_rsb *r = lkb->lkb_resource; in _receive_convert_reply() local
4645 hold_rsb(r); in _receive_convert_reply()
4646 lock_rsb(r); in _receive_convert_reply()
4657 __receive_convert_reply(r, lkb, ms); in _receive_convert_reply()
4659 unlock_rsb(r); in _receive_convert_reply()
4660 put_rsb(r); in _receive_convert_reply()
4679 struct dlm_rsb *r = lkb->lkb_resource; in _receive_unlock_reply() local
4682 hold_rsb(r); in _receive_unlock_reply()
4683 lock_rsb(r); in _receive_unlock_reply()
4699 remove_lock_pc(r, lkb); in _receive_unlock_reply()
4700 queue_cast(r, lkb, -DLM_EUNLOCK); in _receive_unlock_reply()
4705 log_error(r->res_ls, "receive_unlock_reply %x error %d", in _receive_unlock_reply()
4709 unlock_rsb(r); in _receive_unlock_reply()
4710 put_rsb(r); in _receive_unlock_reply()
4729 struct dlm_rsb *r = lkb->lkb_resource; in _receive_cancel_reply() local
4732 hold_rsb(r); in _receive_cancel_reply()
4733 lock_rsb(r); in _receive_cancel_reply()
4749 revert_lock_pc(r, lkb); in _receive_cancel_reply()
4750 queue_cast(r, lkb, -DLM_ECANCEL); in _receive_cancel_reply()
4755 log_error(r->res_ls, "receive_cancel_reply %x error %d", in _receive_cancel_reply()
4759 unlock_rsb(r); in _receive_cancel_reply()
4760 put_rsb(r); in _receive_cancel_reply()
4780 struct dlm_rsb *r; in receive_lookup_reply() local
4793 r = lkb->lkb_resource; in receive_lookup_reply()
4794 hold_rsb(r); in receive_lookup_reply()
4795 lock_rsb(r); in receive_lookup_reply()
4809 if (r->res_master_nodeid && (r->res_master_nodeid != ret_nodeid)) { in receive_lookup_reply()
4814 r->res_master_nodeid, r->res_dir_nodeid, in receive_lookup_reply()
4815 dlm_our_nodeid(), r->res_first_lkid, r->res_name); in receive_lookup_reply()
4819 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4820 r->res_nodeid = 0; in receive_lookup_reply()
4822 r->res_first_lkid = 0; in receive_lookup_reply()
4827 r->res_master_nodeid = 0; in receive_lookup_reply()
4828 r->res_nodeid = -1; in receive_lookup_reply()
4832 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4833 r->res_nodeid = ret_nodeid; in receive_lookup_reply()
4839 queue_cast_overlap(r, lkb); in receive_lookup_reply()
4844 _request_lock(r, lkb); in receive_lookup_reply()
4848 process_lookup_list(r); in receive_lookup_reply()
4850 unlock_rsb(r); in receive_lookup_reply()
4851 put_rsb(r); in receive_lookup_reply()
5268 struct dlm_rsb *r; in dlm_recover_waiters_post() local
5282 r = lkb->lkb_resource; in dlm_recover_waiters_post()
5283 hold_rsb(r); in dlm_recover_waiters_post()
5284 lock_rsb(r); in dlm_recover_waiters_post()
5294 r->res_nodeid, lkb->lkb_nodeid, lkb->lkb_wait_nodeid, in dlm_recover_waiters_post()
5295 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5316 queue_cast(r, lkb, ou ? -DLM_EUNLOCK : in dlm_recover_waiters_post()
5322 queue_cast(r, lkb, -DLM_ECANCEL); in dlm_recover_waiters_post()
5325 _unlock_lock(r, lkb); in dlm_recover_waiters_post()
5335 _request_lock(r, lkb); in dlm_recover_waiters_post()
5336 if (is_master(r)) in dlm_recover_waiters_post()
5337 confirm_master(r, 0); in dlm_recover_waiters_post()
5340 _convert_lock(r, lkb); in dlm_recover_waiters_post()
5350 lkb->lkb_id, mstype, r->res_nodeid, in dlm_recover_waiters_post()
5351 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5353 unlock_rsb(r); in dlm_recover_waiters_post()
5354 put_rsb(r); in dlm_recover_waiters_post()
5361 static void purge_mstcpy_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_mstcpy_list() argument
5376 del_lkb(r, lkb); in purge_mstcpy_list()
5384 void dlm_purge_mstcpy_locks(struct dlm_rsb *r) in dlm_purge_mstcpy_locks() argument
5386 struct dlm_ls *ls = r->res_ls; in dlm_purge_mstcpy_locks()
5388 purge_mstcpy_list(ls, r, &r->res_grantqueue); in dlm_purge_mstcpy_locks()
5389 purge_mstcpy_list(ls, r, &r->res_convertqueue); in dlm_purge_mstcpy_locks()
5390 purge_mstcpy_list(ls, r, &r->res_waitqueue); in dlm_purge_mstcpy_locks()
5393 static void purge_dead_list(struct dlm_ls *ls, struct dlm_rsb *r, in purge_dead_list() argument
5410 rsb_set_flag(r, RSB_RECOVER_LVB_INVAL); in purge_dead_list()
5413 del_lkb(r, lkb); in purge_dead_list()
5419 rsb_set_flag(r, RSB_RECOVER_GRANT); in purge_dead_list()
5430 struct dlm_rsb *r; in dlm_recover_purge() local
5448 list_for_each_entry(r, &ls->ls_root_list, res_root_list) { in dlm_recover_purge()
5449 hold_rsb(r); in dlm_recover_purge()
5450 lock_rsb(r); in dlm_recover_purge()
5451 if (is_master(r)) { in dlm_recover_purge()
5452 purge_dead_list(ls, r, &r->res_grantqueue, in dlm_recover_purge()
5454 purge_dead_list(ls, r, &r->res_convertqueue, in dlm_recover_purge()
5456 purge_dead_list(ls, r, &r->res_waitqueue, in dlm_recover_purge()
5459 unlock_rsb(r); in dlm_recover_purge()
5460 unhold_rsb(r); in dlm_recover_purge()
5473 struct dlm_rsb *r; in find_grant_rsb() local
5477 r = rb_entry(n, struct dlm_rsb, res_hashnode); in find_grant_rsb()
5479 if (!rsb_flag(r, RSB_RECOVER_GRANT)) in find_grant_rsb()
5481 if (!is_master(r)) { in find_grant_rsb()
5482 rsb_clear_flag(r, RSB_RECOVER_GRANT); in find_grant_rsb()
5485 hold_rsb(r); in find_grant_rsb()
5487 return r; in find_grant_rsb()
5512 struct dlm_rsb *r; in dlm_recover_grant() local
5519 r = find_grant_rsb(ls, bucket); in dlm_recover_grant()
5520 if (!r) { in dlm_recover_grant()
5528 lock_rsb(r); in dlm_recover_grant()
5530 grant_pending_locks(r, &count); in dlm_recover_grant()
5531 rsb_clear_flag(r, RSB_RECOVER_GRANT); in dlm_recover_grant()
5533 confirm_master(r, 0); in dlm_recover_grant()
5534 unlock_rsb(r); in dlm_recover_grant()
5535 put_rsb(r); in dlm_recover_grant()
5556 static struct dlm_lkb *search_remid(struct dlm_rsb *r, int nodeid, in search_remid() argument
5561 lkb = search_remid_list(&r->res_grantqueue, nodeid, remid); in search_remid()
5564 lkb = search_remid_list(&r->res_convertqueue, nodeid, remid); in search_remid()
5567 lkb = search_remid_list(&r->res_waitqueue, nodeid, remid); in search_remid()
5575 struct dlm_rsb *r, struct dlm_rcom *rc) in receive_rcom_lock_args() argument
5612 rsb_set_flag(r, RSB_RECOVER_CONVERT); in receive_rcom_lock_args()
5628 struct dlm_rsb *r; in dlm_recover_master_copy() local
5650 from_nodeid, R_RECEIVE_RECOVER, &r); in dlm_recover_master_copy()
5654 lock_rsb(r); in dlm_recover_master_copy()
5656 if (dlm_no_directory(ls) && (dlm_dir_nodeid(r) != dlm_our_nodeid())) { in dlm_recover_master_copy()
5663 lkb = search_remid(r, from_nodeid, remid); in dlm_recover_master_copy()
5673 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5679 attach_lkb(r, lkb); in dlm_recover_master_copy()
5680 add_lkb(r, lkb, rl->rl_status); in dlm_recover_master_copy()
5684 if (!list_empty(&r->res_waitqueue) || !list_empty(&r->res_convertqueue)) in dlm_recover_master_copy()
5685 rsb_set_flag(r, RSB_RECOVER_GRANT); in dlm_recover_master_copy()
5695 unlock_rsb(r); in dlm_recover_master_copy()
5696 put_rsb(r); in dlm_recover_master_copy()
5709 struct dlm_rsb *r; in dlm_recover_process_copy() local
5725 r = lkb->lkb_resource; in dlm_recover_process_copy()
5726 hold_rsb(r); in dlm_recover_process_copy()
5727 lock_rsb(r); in dlm_recover_process_copy()
5732 dlm_dump_rsb(r); in dlm_recover_process_copy()
5733 unlock_rsb(r); in dlm_recover_process_copy()
5734 put_rsb(r); in dlm_recover_process_copy()
5748 dlm_send_rcom_lock(r, lkb); in dlm_recover_process_copy()
5761 dlm_recovered_lock(r); in dlm_recover_process_copy()
5763 unlock_rsb(r); in dlm_recover_process_copy()
5764 put_rsb(r); in dlm_recover_process_copy()
6053 struct dlm_rsb *r; in dlm_user_deadlock() local
6070 r = lkb->lkb_resource; in dlm_user_deadlock()
6071 hold_rsb(r); in dlm_user_deadlock()
6072 lock_rsb(r); in dlm_user_deadlock()
6079 error = _cancel_lock(r, lkb); in dlm_user_deadlock()
6081 unlock_rsb(r); in dlm_user_deadlock()
6082 put_rsb(r); in dlm_user_deadlock()