• Home
  • Raw
  • Download

Lines Matching +full:oc +full:- +full:delay +full:- +full:us

1 // SPDX-License-Identifier: GPL-2.0-only
5 ** Copyright (C) 2005-2010 Red Hat, Inc. All rights reserved.
52 L: send_xxxx() -> R: receive_xxxx()
54 L: receive_xxxx_reply() <- R: send_xxxx_reply()
94 * Lock compatibilty matrix - thanks Steve
119 * -1 = nothing happens to the LVB
124 { -1, 1, 1, 1, 1, 1, 1, -1 }, /* UN */
125 { -1, 1, 1, 1, 1, 1, 1, 0 }, /* NL */
126 { -1, -1, 1, 1, 1, 1, 1, 0 }, /* CR */
127 { -1, -1, -1, 1, 1, 1, 1, 0 }, /* CW */
128 { -1, -1, -1, -1, 1, 1, 1, 0 }, /* PR */
129 { -1, 0, 0, 0, 0, 0, 1, 0 }, /* PW */
130 { -1, 0, 0, 0, 0, 0, 0, 0 }, /* EX */
131 { -1, 0, 0, 0, 0, 0, 0, 0 } /* PD */
135 __dlm_compat_matrix[(gr)->lkb_grmode + 1][(rq)->lkb_rqmode + 1]
164 lkb->lkb_nodeid, lkb->lkb_id, lkb->lkb_remid, lkb->lkb_exflags, in dlm_print_lkb()
165 lkb->lkb_flags, lkb->lkb_status, lkb->lkb_rqmode, in dlm_print_lkb()
166 lkb->lkb_grmode, lkb->lkb_wait_type, lkb->lkb_wait_nodeid, in dlm_print_lkb()
167 (unsigned long long)lkb->lkb_recover_seq); in dlm_print_lkb()
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()
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()
205 down_read(&ls->ls_in_recovery); in dlm_lock_recovery()
210 up_read(&ls->ls_in_recovery); in dlm_unlock_recovery()
215 return down_read_trylock(&ls->ls_in_recovery); in dlm_lock_recovery_try()
220 return !(lkb->lkb_exflags & DLM_LKF_NOQUEUE); in can_be_queued()
225 return (lkb->lkb_exflags & DLM_LKF_NOQUEUEBAST); in force_blocking_asts()
230 return (lkb->lkb_sbflags & DLM_SBF_DEMOTED); in is_demoted()
235 return (lkb->lkb_sbflags & DLM_SBF_ALTMODE); in is_altmode()
240 return (lkb->lkb_status == DLM_LKSTS_GRANTED); in is_granted()
245 DLM_ASSERT(r->res_nodeid >= 0, dlm_print_rsb(r);); in is_remote()
246 return !!r->res_nodeid; in is_remote()
251 return (lkb->lkb_nodeid && !(lkb->lkb_flags & DLM_IFL_MSTCPY)); in is_process_copy()
256 return (lkb->lkb_flags & DLM_IFL_MSTCPY) ? 1 : 0; in is_master_copy()
261 if ((lkb->lkb_grmode==DLM_LOCK_PR && lkb->lkb_rqmode==DLM_LOCK_CW) || in middle_conversion()
262 (lkb->lkb_rqmode==DLM_LOCK_PR && lkb->lkb_grmode==DLM_LOCK_CW)) in middle_conversion()
269 return (!middle_conversion(lkb) && lkb->lkb_rqmode < lkb->lkb_grmode); in down_conversion()
274 return lkb->lkb_flags & DLM_IFL_OVERLAP_UNLOCK; in is_overlap_unlock()
279 return lkb->lkb_flags & DLM_IFL_OVERLAP_CANCEL; in is_overlap_cancel()
284 return (lkb->lkb_flags & (DLM_IFL_OVERLAP_UNLOCK | in is_overlap()
295 DLM_ASSERT(lkb->lkb_lksb, dlm_print_lkb(lkb);); in queue_cast()
297 /* if the operation was a cancel, then return -DLM_ECANCEL, if a in queue_cast()
298 timeout caused the cancel then return -ETIMEDOUT */ in queue_cast()
299 if (rv == -DLM_ECANCEL && (lkb->lkb_flags & DLM_IFL_TIMEOUT_CANCEL)) { in queue_cast()
300 lkb->lkb_flags &= ~DLM_IFL_TIMEOUT_CANCEL; in queue_cast()
301 rv = -ETIMEDOUT; in queue_cast()
304 if (rv == -DLM_ECANCEL && (lkb->lkb_flags & DLM_IFL_DEADLOCK_CANCEL)) { in queue_cast()
305 lkb->lkb_flags &= ~DLM_IFL_DEADLOCK_CANCEL; in queue_cast()
306 rv = -EDEADLK; in queue_cast()
309 dlm_add_cb(lkb, DLM_CB_CAST, lkb->lkb_grmode, rv, lkb->lkb_sbflags); in queue_cast()
315 is_overlap_unlock(lkb) ? -DLM_EUNLOCK : -DLM_ECANCEL); in queue_cast_overlap()
336 kref_get(&r->res_ref); in hold_rsb()
349 struct dlm_ls *ls = r->res_ls; in put_rsb()
350 uint32_t bucket = r->res_bucket; in put_rsb()
352 spin_lock(&ls->ls_rsbtbl[bucket].lock); in put_rsb()
353 kref_put(&r->res_ref, toss_rsb); in put_rsb()
354 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in put_rsb()
367 spin_lock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
368 if (ls->ls_new_rsb_count > dlm_config.ci_new_rsb_count / 2) { in pre_rsb_struct()
369 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
372 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
377 spin_lock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
379 list_add(&r1->res_hashchain, &ls->ls_new_rsb); in pre_rsb_struct()
380 ls->ls_new_rsb_count++; in pre_rsb_struct()
383 list_add(&r2->res_hashchain, &ls->ls_new_rsb); in pre_rsb_struct()
384 ls->ls_new_rsb_count++; in pre_rsb_struct()
386 count = ls->ls_new_rsb_count; in pre_rsb_struct()
387 spin_unlock(&ls->ls_new_rsb_spin); in pre_rsb_struct()
390 return -ENOMEM; in pre_rsb_struct()
394 /* If ls->ls_new_rsb is empty, return -EAGAIN, so the caller can
404 spin_lock(&ls->ls_new_rsb_spin); in get_rsb_struct()
405 if (list_empty(&ls->ls_new_rsb)) { in get_rsb_struct()
406 count = ls->ls_new_rsb_count; in get_rsb_struct()
407 spin_unlock(&ls->ls_new_rsb_spin); in get_rsb_struct()
410 return -EAGAIN; in get_rsb_struct()
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()
417 ls->ls_new_rsb_count--; in get_rsb_struct()
418 spin_unlock(&ls->ls_new_rsb_spin); 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()
442 return memcmp(r->res_name, maxname, DLM_RESNAME_MAXLEN); in rsb_cmp()
448 struct rb_node *node = tree->rb_node; in dlm_search_rsb_tree()
456 node = node->rb_left; in dlm_search_rsb_tree()
458 node = node->rb_right; in dlm_search_rsb_tree()
463 return -EBADR; in dlm_search_rsb_tree()
472 struct rb_node **newn = &tree->rb_node; in rsb_insert()
481 rc = rsb_cmp(cur, rsb->res_name, rsb->res_length); in rsb_insert()
483 newn = &parent->rb_left; in rsb_insert()
485 newn = &parent->rb_right; in rsb_insert()
490 return -EEXIST; in rsb_insert()
494 rb_link_node(&rsb->res_hashnode, parent, newn); in rsb_insert()
495 rb_insert_color(&rsb->res_hashnode, tree); in rsb_insert()
506 * to excessive master lookups and removals if we don't delay the release.
516 * - previously used locally but not any more (were on keep list, then
518 * - created and put on toss list as a directory record for a lookup
567 * from_nodeid has sent us a lock in dlm_recover_locks, believing in find_rsb_dir()
573 * If someone sends us a request, we are the dir node, and we do in find_rsb_dir()
575 * someone sends us a request after we have removed/freed an rsb in find_rsb_dir()
592 spin_lock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
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()
621 has sent us a request */ 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()
625 error = -ENOTBLK; 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()
635 r->res_master_nodeid = our_nodeid; in find_rsb_dir()
636 r->res_nodeid = 0; 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()
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()
658 if (error == -EBADR && !create) in find_rsb_dir()
662 if (error == -EAGAIN) { in find_rsb_dir()
663 spin_unlock(&ls->ls_rsbtbl[b].lock); 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()
689 error = -ENOTBLK; 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()
712 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_dir()
718 /* During recovery, other nodes can send us new MSTCPY locks (from
737 spin_lock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
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()
763 /* our rsb is not master, and another node has sent us a in find_rsb_nodir()
766 from_nodeid, r->res_master_nodeid, dir_nodeid); in find_rsb_nodir()
768 error = -ENOTBLK; 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()
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()
794 if (error == -EAGAIN) { in find_rsb_nodir()
795 spin_unlock(&ls->ls_rsbtbl[b].lock); 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()
810 spin_unlock(&ls->ls_rsbtbl[b].lock); in find_rsb_nodir()
823 return -EINVAL; in find_rsb()
826 b = hash & (ls->ls_rsbtbl_size - 1); in find_rsb()
846 from_nodeid, r->res_master_nodeid, in validate_master_nodeid()
847 r->res_dir_nodeid); in validate_master_nodeid()
849 return -ENOTBLK; in validate_master_nodeid()
852 if (from_nodeid != r->res_dir_nodeid) { in validate_master_nodeid()
854 has sent us a request. this is much more common when our in validate_master_nodeid()
855 master_nodeid is zero, so limit debug to non-zero. */ 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()
863 return -ENOTBLK; in validate_master_nodeid()
865 /* our rsb is not master, but the dir nodeid has sent us a in validate_master_nodeid()
866 request; this could happen with master 0 / res_nodeid -1 */ 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()
921 return -EINVAL; in dlm_master_lookup()
926 return -EINVAL; in dlm_master_lookup()
930 b = hash & (ls->ls_rsbtbl_size - 1); in dlm_master_lookup()
936 ls->ls_num_nodes); in dlm_master_lookup()
937 *r_nodeid = -1; in dlm_master_lookup()
938 return -EINVAL; in dlm_master_lookup()
946 spin_lock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
947 error = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in dlm_master_lookup()
953 spin_unlock(&ls->ls_rsbtbl[b].lock); 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()
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()
1007 r->res_master_nodeid = from_nodeid; in dlm_master_lookup()
1008 r->res_nodeid = from_nodeid; 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()
1041 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1051 if (error == -EAGAIN) { in dlm_master_lookup()
1052 spin_unlock(&ls->ls_rsbtbl[b].lock); 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()
1070 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1079 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_master_lookup()
1089 for (i = 0; i < ls->ls_rsbtbl_size; i++) { in dlm_dump_rsb_hash()
1090 spin_lock(&ls->ls_rsbtbl[i].lock); in dlm_dump_rsb_hash()
1091 for (n = rb_first(&ls->ls_rsbtbl[i].keep); n; n = rb_next(n)) { in dlm_dump_rsb_hash()
1093 if (r->res_hash == hash) in dlm_dump_rsb_hash()
1096 spin_unlock(&ls->ls_rsbtbl[i].lock); in dlm_dump_rsb_hash()
1107 b = hash & (ls->ls_rsbtbl_size - 1); in dlm_dump_rsb_name()
1109 spin_lock(&ls->ls_rsbtbl[b].lock); in dlm_dump_rsb_name()
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()
1120 spin_unlock(&ls->ls_rsbtbl[b].lock); in dlm_dump_rsb_name()
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()
1145 rv = kref_put(&r->res_ref, toss_rsb); in unhold_rsb()
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()
1170 lkb->lkb_resource = r; in attach_lkb()
1175 if (lkb->lkb_resource) { in detach_lkb()
1176 put_rsb(lkb->lkb_resource); in detach_lkb()
1177 lkb->lkb_resource = NULL; in detach_lkb()
1188 return -ENOMEM; in create_lkb()
1190 lkb->lkb_nodeid = -1; in create_lkb()
1191 lkb->lkb_grmode = DLM_LOCK_IV; in create_lkb()
1192 kref_init(&lkb->lkb_ref); in create_lkb()
1193 INIT_LIST_HEAD(&lkb->lkb_ownqueue); in create_lkb()
1194 INIT_LIST_HEAD(&lkb->lkb_rsb_lookup); in create_lkb()
1195 INIT_LIST_HEAD(&lkb->lkb_time_list); in create_lkb()
1196 INIT_LIST_HEAD(&lkb->lkb_cb_list); in create_lkb()
1197 mutex_init(&lkb->lkb_cb_mutex); in create_lkb()
1198 INIT_WORK(&lkb->lkb_cb_work, dlm_callback_work); in create_lkb()
1201 spin_lock(&ls->ls_lkbidr_spin); in create_lkb()
1202 rv = idr_alloc(&ls->ls_lkbidr, lkb, 1, 0, GFP_NOWAIT); in create_lkb()
1204 lkb->lkb_id = rv; in create_lkb()
1205 spin_unlock(&ls->ls_lkbidr_spin); in create_lkb()
1222 spin_lock(&ls->ls_lkbidr_spin); in find_lkb()
1223 lkb = idr_find(&ls->ls_lkbidr, lkid); in find_lkb()
1225 kref_get(&lkb->lkb_ref); in find_lkb()
1226 spin_unlock(&ls->ls_lkbidr_spin); in find_lkb()
1229 return lkb ? 0 : -ENOENT; in find_lkb()
1239 DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb);); in kill_lkb()
1247 uint32_t lkid = lkb->lkb_id; in __put_lkb()
1249 spin_lock(&ls->ls_lkbidr_spin); in __put_lkb()
1250 if (kref_put(&lkb->lkb_ref, kill_lkb)) { in __put_lkb()
1251 idr_remove(&ls->ls_lkbidr, lkid); in __put_lkb()
1252 spin_unlock(&ls->ls_lkbidr_spin); in __put_lkb()
1257 if (lkb->lkb_lvbptr && is_master_copy(lkb)) in __put_lkb()
1258 dlm_free_lvb(lkb->lkb_lvbptr); in __put_lkb()
1262 spin_unlock(&ls->ls_lkbidr_spin); in __put_lkb()
1271 DLM_ASSERT(lkb->lkb_resource, dlm_print_lkb(lkb);); in dlm_put_lkb()
1272 DLM_ASSERT(lkb->lkb_resource->res_ls, dlm_print_lkb(lkb);); in dlm_put_lkb()
1274 ls = lkb->lkb_resource->res_ls; in dlm_put_lkb()
1283 kref_get(&lkb->lkb_ref); in hold_lkb()
1294 rv = kref_put(&lkb->lkb_ref, kill_lkb); in unhold_lkb()
1304 if (lkb->lkb_rqmode < mode) in lkb_add_ordered()
1307 __list_add(new, lkb->lkb_statequeue.prev, &lkb->lkb_statequeue); in lkb_add_ordered()
1314 kref_get(&lkb->lkb_ref); in add_lkb()
1316 DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb);); in add_lkb()
1318 lkb->lkb_timestamp = ktime_get(); in add_lkb()
1320 lkb->lkb_status = status; in add_lkb()
1324 if (lkb->lkb_exflags & DLM_LKF_HEADQUE) in add_lkb()
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()
1332 lkb->lkb_grmode); in add_lkb()
1335 if (lkb->lkb_exflags & DLM_LKF_HEADQUE) in add_lkb()
1336 list_add(&lkb->lkb_statequeue, &r->res_convertqueue); in add_lkb()
1338 list_add_tail(&lkb->lkb_statequeue, in add_lkb()
1339 &r->res_convertqueue); in add_lkb()
1348 lkb->lkb_status = 0; in del_lkb()
1349 list_del(&lkb->lkb_statequeue); in del_lkb()
1375 return -1; in msg_reply_type()
1396 s64 us; in dlm_scan_waiters() local
1406 mutex_lock(&ls->ls_waiters_mutex); in dlm_scan_waiters()
1408 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in dlm_scan_waiters()
1409 if (!lkb->lkb_wait_time) in dlm_scan_waiters()
1414 us = ktime_to_us(ktime_sub(ktime_get(), lkb->lkb_wait_time)); in dlm_scan_waiters()
1416 if (us < dlm_config.ci_waitwarn_us) in dlm_scan_waiters()
1419 lkb->lkb_wait_time = 0; in dlm_scan_waiters()
1422 if (us > debug_maxus) in dlm_scan_waiters()
1423 debug_maxus = us; in dlm_scan_waiters()
1426 num_nodes = ls->ls_num_nodes; in dlm_scan_waiters()
1431 if (nodeid_warned(lkb->lkb_wait_nodeid, num_nodes, warned)) in dlm_scan_waiters()
1434 log_error(ls, "waitwarn %x %lld %d us check connection to " in dlm_scan_waiters()
1435 "node %d", lkb->lkb_id, (long long)us, in dlm_scan_waiters()
1436 dlm_config.ci_waitwarn_us, lkb->lkb_wait_nodeid); in dlm_scan_waiters()
1438 mutex_unlock(&ls->ls_waiters_mutex); in dlm_scan_waiters()
1442 log_debug(ls, "scan_waiters %u warn %u over %d us max %lld us", in dlm_scan_waiters()
1452 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_to_waiters()
1455 mutex_lock(&ls->ls_waiters_mutex); in add_to_waiters()
1459 error = -EINVAL; in add_to_waiters()
1463 if (lkb->lkb_wait_type || is_overlap_cancel(lkb)) { in add_to_waiters()
1466 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK; in add_to_waiters()
1469 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL; in add_to_waiters()
1472 error = -EBUSY; in add_to_waiters()
1475 lkb->lkb_wait_count++; in add_to_waiters()
1479 lkb->lkb_id, lkb->lkb_wait_type, mstype, in add_to_waiters()
1480 lkb->lkb_wait_count, lkb->lkb_flags); in add_to_waiters()
1484 DLM_ASSERT(!lkb->lkb_wait_count, in add_to_waiters()
1486 printk("wait_count %d\n", lkb->lkb_wait_count);); in add_to_waiters()
1488 lkb->lkb_wait_count++; in add_to_waiters()
1489 lkb->lkb_wait_type = mstype; in add_to_waiters()
1490 lkb->lkb_wait_time = ktime_get(); in add_to_waiters()
1491 lkb->lkb_wait_nodeid = to_nodeid; /* for debugging */ in add_to_waiters()
1493 list_add(&lkb->lkb_wait_reply, &ls->ls_waiters); in add_to_waiters()
1497 lkb->lkb_id, error, lkb->lkb_flags, mstype, in add_to_waiters()
1498 lkb->lkb_wait_type, lkb->lkb_resource->res_name); in add_to_waiters()
1499 mutex_unlock(&ls->ls_waiters_mutex); in add_to_waiters()
1511 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in _remove_from_waiters()
1515 log_debug(ls, "remwait %x unlock_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1516 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in _remove_from_waiters()
1522 log_debug(ls, "remwait %x cancel_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1523 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in _remove_from_waiters()
1532 (lkb->lkb_wait_type != DLM_MSG_CANCEL)) { in _remove_from_waiters()
1534 lkb->lkb_id, lkb->lkb_wait_type); in _remove_from_waiters()
1535 return -1; in _remove_from_waiters()
1544 lingering state of the cancel and fail with -EBUSY. */ in _remove_from_waiters()
1547 (lkb->lkb_wait_type == DLM_MSG_CONVERT) && in _remove_from_waiters()
1548 is_overlap_cancel(lkb) && ms && !ms->m_result) { in _remove_from_waiters()
1550 lkb->lkb_id); in _remove_from_waiters()
1551 lkb->lkb_wait_type = 0; in _remove_from_waiters()
1552 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in _remove_from_waiters()
1553 lkb->lkb_wait_count--; in _remove_from_waiters()
1559 msg due to lookup->request optimization, verify others? */ in _remove_from_waiters()
1561 if (lkb->lkb_wait_type) { in _remove_from_waiters()
1562 lkb->lkb_wait_type = 0; in _remove_from_waiters()
1567 lkb->lkb_id, ms ? ms->m_header.h_nodeid : 0, lkb->lkb_remid, in _remove_from_waiters()
1568 mstype, lkb->lkb_flags); in _remove_from_waiters()
1569 return -1; in _remove_from_waiters()
1572 /* the force-unlock/cancel has completed and we haven't recvd a reply in _remove_from_waiters()
1577 if (overlap_done && lkb->lkb_wait_type) { in _remove_from_waiters()
1579 lkb->lkb_id, mstype, lkb->lkb_wait_type); in _remove_from_waiters()
1580 lkb->lkb_wait_count--; in _remove_from_waiters()
1582 lkb->lkb_wait_type = 0; in _remove_from_waiters()
1585 DLM_ASSERT(lkb->lkb_wait_count, dlm_print_lkb(lkb);); in _remove_from_waiters()
1587 lkb->lkb_flags &= ~DLM_IFL_RESEND; in _remove_from_waiters()
1588 lkb->lkb_wait_count--; in _remove_from_waiters()
1589 if (!lkb->lkb_wait_count) in _remove_from_waiters()
1590 list_del_init(&lkb->lkb_wait_reply); in _remove_from_waiters()
1597 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters()
1600 mutex_lock(&ls->ls_waiters_mutex); in remove_from_waiters()
1602 mutex_unlock(&ls->ls_waiters_mutex); in remove_from_waiters()
1611 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters_ms()
1614 if (ms->m_flags != DLM_IFL_STUB_MS) in remove_from_waiters_ms()
1615 mutex_lock(&ls->ls_waiters_mutex); in remove_from_waiters_ms()
1616 error = _remove_from_waiters(lkb, ms->m_type, ms); in remove_from_waiters_ms()
1617 if (ms->m_flags != DLM_IFL_STUB_MS) in remove_from_waiters_ms()
1618 mutex_unlock(&ls->ls_waiters_mutex); in remove_from_waiters_ms()
1624 It should be rare to need a delay here, but if not, then it may
1625 be worthwhile to add a proper wait mechanism rather than a delay. */
1629 struct dlm_ls *ls = r->res_ls; in wait_pending_remove()
1631 spin_lock(&ls->ls_remove_spin); in wait_pending_remove()
1632 if (ls->ls_remove_len && in wait_pending_remove()
1633 !rsb_cmp(r, ls->ls_remove_name, ls->ls_remove_len)) { in wait_pending_remove()
1634 log_debug(ls, "delay lookup for remove dir %d %s", in wait_pending_remove()
1635 r->res_dir_nodeid, r->res_name); in wait_pending_remove()
1636 spin_unlock(&ls->ls_remove_spin); in wait_pending_remove()
1640 spin_unlock(&ls->ls_remove_spin); in wait_pending_remove()
1660 memset(&ls->ls_remove_lens, 0, sizeof(int) * DLM_REMOVE_NAMES_MAX); in shrink_bucket()
1662 spin_lock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1664 if (!(ls->ls_rsbtbl[b].flags & DLM_RTF_SHRINK)) { in shrink_bucket()
1665 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1669 for (n = rb_first(&ls->ls_rsbtbl[b].toss); n; n = next) { in shrink_bucket()
1675 for the master node to send us a dir remove for in shrink_bucket()
1679 (r->res_master_nodeid != our_nodeid) && in shrink_bucket()
1686 if (!time_after_eq(jiffies, r->res_toss_time + in shrink_bucket()
1692 (r->res_master_nodeid == our_nodeid) && in shrink_bucket()
1699 ls->ls_remove_lens[remote_count] = r->res_length; in shrink_bucket()
1700 memcpy(ls->ls_remove_names[remote_count], r->res_name, in shrink_bucket()
1709 if (!kref_put(&r->res_ref, kill_rsb)) { in shrink_bucket()
1710 log_error(ls, "tossed rsb in use %s", r->res_name); in shrink_bucket()
1714 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1719 ls->ls_rsbtbl[b].flags |= DLM_RTF_SHRINK; in shrink_bucket()
1721 ls->ls_rsbtbl[b].flags &= ~DLM_RTF_SHRINK; in shrink_bucket()
1722 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1729 * important to keep us (the master node) from being out of sync in shrink_bucket()
1739 name = ls->ls_remove_names[i]; in shrink_bucket()
1740 len = ls->ls_remove_lens[i]; in shrink_bucket()
1742 spin_lock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1743 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in shrink_bucket()
1745 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1750 if (r->res_master_nodeid != our_nodeid) { in shrink_bucket()
1751 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1753 r->res_master_nodeid, r->res_dir_nodeid, in shrink_bucket()
1758 if (r->res_dir_nodeid == our_nodeid) { in shrink_bucket()
1760 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1762 r->res_dir_nodeid, r->res_master_nodeid, in shrink_bucket()
1767 if (!time_after_eq(jiffies, r->res_toss_time + in shrink_bucket()
1769 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1771 r->res_toss_time, jiffies, name); in shrink_bucket()
1775 if (!kref_put(&r->res_ref, kill_rsb)) { in shrink_bucket()
1776 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1781 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in shrink_bucket()
1784 spin_lock(&ls->ls_remove_spin); in shrink_bucket()
1785 ls->ls_remove_len = len; in shrink_bucket()
1786 memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN); in shrink_bucket()
1787 spin_unlock(&ls->ls_remove_spin); in shrink_bucket()
1788 spin_unlock(&ls->ls_rsbtbl[b].lock); in shrink_bucket()
1793 spin_lock(&ls->ls_remove_spin); in shrink_bucket()
1794 ls->ls_remove_len = 0; in shrink_bucket()
1795 memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN); in shrink_bucket()
1796 spin_unlock(&ls->ls_remove_spin); in shrink_bucket()
1806 for (i = 0; i < ls->ls_rsbtbl_size; i++) { in dlm_scan_rsbs()
1816 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_timeout()
1821 if (test_bit(LSFL_TIMEWARN, &ls->ls_flags) && in add_timeout()
1822 !(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) { in add_timeout()
1823 lkb->lkb_flags |= DLM_IFL_WATCH_TIMEWARN; in add_timeout()
1826 if (lkb->lkb_exflags & DLM_LKF_TIMEOUT) in add_timeout()
1831 DLM_ASSERT(list_empty(&lkb->lkb_time_list), dlm_print_lkb(lkb);); in add_timeout()
1832 mutex_lock(&ls->ls_timeout_mutex); in add_timeout()
1834 list_add_tail(&lkb->lkb_time_list, &ls->ls_timeout); in add_timeout()
1835 mutex_unlock(&ls->ls_timeout_mutex); in add_timeout()
1840 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in del_timeout()
1842 mutex_lock(&ls->ls_timeout_mutex); in del_timeout()
1843 if (!list_empty(&lkb->lkb_time_list)) { in del_timeout()
1844 list_del_init(&lkb->lkb_time_list); in del_timeout()
1847 mutex_unlock(&ls->ls_timeout_mutex); in del_timeout()
1853 to specify some special timeout-related bits in the lkb that are just to
1869 mutex_lock(&ls->ls_timeout_mutex); in dlm_scan_timeout()
1870 list_for_each_entry(iter, &ls->ls_timeout, lkb_time_list) { in dlm_scan_timeout()
1873 iter->lkb_timestamp)); in dlm_scan_timeout()
1875 if ((iter->lkb_exflags & DLM_LKF_TIMEOUT) && in dlm_scan_timeout()
1876 wait_us >= (iter->lkb_timeout_cs * 10000)) in dlm_scan_timeout()
1879 if ((iter->lkb_flags & DLM_IFL_WATCH_TIMEWARN) && in dlm_scan_timeout()
1889 mutex_unlock(&ls->ls_timeout_mutex); in dlm_scan_timeout()
1894 r = lkb->lkb_resource; in dlm_scan_timeout()
1900 lkb->lkb_flags &= ~DLM_IFL_WATCH_TIMEWARN; in dlm_scan_timeout()
1901 if (!(lkb->lkb_exflags & DLM_LKF_TIMEOUT)) in dlm_scan_timeout()
1908 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in dlm_scan_timeout()
1909 lkb->lkb_flags &= ~DLM_IFL_WATCH_TIMEWARN; in dlm_scan_timeout()
1910 lkb->lkb_flags |= DLM_IFL_TIMEOUT_CANCEL; in dlm_scan_timeout()
1927 u64 adj_us = jiffies_to_usecs(jiffies - ls->ls_recover_begin); in dlm_adjust_timeouts()
1929 ls->ls_recover_begin = 0; in dlm_adjust_timeouts()
1930 mutex_lock(&ls->ls_timeout_mutex); in dlm_adjust_timeouts()
1931 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) in dlm_adjust_timeouts()
1932 lkb->lkb_timestamp = ktime_add_us(lkb->lkb_timestamp, adj_us); in dlm_adjust_timeouts()
1933 mutex_unlock(&ls->ls_timeout_mutex); in dlm_adjust_timeouts()
1938 mutex_lock(&ls->ls_waiters_mutex); in dlm_adjust_timeouts()
1939 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in dlm_adjust_timeouts()
1940 if (ktime_to_us(lkb->lkb_wait_time)) in dlm_adjust_timeouts()
1941 lkb->lkb_wait_time = ktime_get(); in dlm_adjust_timeouts()
1943 mutex_unlock(&ls->ls_waiters_mutex); in dlm_adjust_timeouts()
1950 int b, len = r->res_ls->ls_lvblen; in set_lvb_lock()
1954 b=-1 do nothing */ in set_lvb_lock()
1956 b = dlm_lvb_operations[lkb->lkb_grmode + 1][lkb->lkb_rqmode + 1]; in set_lvb_lock()
1959 if (!lkb->lkb_lvbptr) in set_lvb_lock()
1962 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) 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()
1972 if (lkb->lkb_exflags & DLM_LKF_IVVALBLK) { in set_lvb_lock()
1977 if (!lkb->lkb_lvbptr) in set_lvb_lock()
1980 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) 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()
1996 lkb->lkb_sbflags |= DLM_SBF_VALNOTVALID; in set_lvb_lock()
2001 if (lkb->lkb_grmode < DLM_LOCK_PW) in set_lvb_unlock()
2004 if (lkb->lkb_exflags & DLM_LKF_IVVALBLK) { in set_lvb_unlock()
2009 if (!lkb->lkb_lvbptr) in set_lvb_unlock()
2012 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) 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()
2033 if (!lkb->lkb_lvbptr) in set_lvb_lock_pc()
2036 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) in set_lvb_lock_pc()
2039 b = dlm_lvb_operations[lkb->lkb_grmode + 1][lkb->lkb_rqmode + 1]; in set_lvb_lock_pc()
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()
2044 memcpy(lkb->lkb_lvbptr, ms->m_extra, len); in set_lvb_lock_pc()
2045 lkb->lkb_lvbseq = ms->m_lvbseq; in set_lvb_lock_pc()
2050 remove_lock -- used for unlock, removes lkb from granted
2051 revert_lock -- used for cancel, moves lkb from convert to granted
2052 grant_lock -- used for request and convert, adds lkb to granted or
2062 lkb->lkb_grmode = DLM_LOCK_IV; in _remove_lock()
2081 -1 removed lock */
2087 lkb->lkb_rqmode = DLM_LOCK_IV; in revert_lock()
2089 switch (lkb->lkb_status) { in revert_lock()
2098 lkb->lkb_grmode = DLM_LOCK_IV; in revert_lock()
2102 rv = -1; in revert_lock()
2105 log_print("invalid status for revert %d", lkb->lkb_status); in revert_lock()
2117 if (lkb->lkb_grmode != lkb->lkb_rqmode) { in _grant_lock()
2118 lkb->lkb_grmode = lkb->lkb_rqmode; in _grant_lock()
2119 if (lkb->lkb_status) in _grant_lock()
2125 lkb->lkb_rqmode = DLM_LOCK_IV; in _grant_lock()
2126 lkb->lkb_highbast = 0; in _grant_lock()
2165 if (lkb->lkb_rqmode == DLM_LOCK_IV || lkb->lkb_grmode == DLM_LOCK_IV) { in munge_demoted()
2167 lkb->lkb_id, lkb->lkb_grmode, lkb->lkb_rqmode); in munge_demoted()
2171 lkb->lkb_grmode = DLM_LOCK_NL; in munge_demoted()
2176 if (ms->m_type != DLM_MSG_REQUEST_REPLY && in munge_altmode()
2177 ms->m_type != DLM_MSG_GRANT) { in munge_altmode()
2179 lkb->lkb_id, ms->m_type); in munge_altmode()
2183 if (lkb->lkb_exflags & DLM_LKF_ALTPR) in munge_altmode()
2184 lkb->lkb_rqmode = DLM_LOCK_PR; in munge_altmode()
2185 else if (lkb->lkb_exflags & DLM_LKF_ALTCW) in munge_altmode()
2186 lkb->lkb_rqmode = DLM_LOCK_CW; in munge_altmode()
2188 log_print("munge_altmode invalid exflags %x", lkb->lkb_exflags); in munge_altmode()
2195 struct dlm_lkb *first = list_entry(head->next, struct dlm_lkb, in first_in_list()
2197 if (lkb->lkb_id == first->lkb_id) in first_in_list()
2228 * Convert Queue: NL->EX (first lock)
2229 * PR->EX (second lock)
2233 * list. We either cancel lkb's conversion (PR->EX) and return EDEADLK, or we
2237 * Originally, this function detected conv-deadlk in a more limited scope:
2238 * - if !modes_compat(lkb1, lkb2) && !modes_compat(lkb2, lkb1), or
2239 * - if lkb1 was the first entry in the queue (not just earlier), and was
2244 * That second condition meant we'd only say there was conv-deadlk if
2255 * be zero, i.e. there will never be conv-deadlk between two locks that are
2264 list_for_each_entry(lkb1, &r->res_convertqueue, lkb_statequeue) { in conversion_deadlock_detect()
2301 int8_t conv = (lkb->lkb_grmode != DLM_LOCK_IV); in _can_be_granted()
2304 * 6-10: Version 5.4 introduced an option to address the phenomenon of in _can_be_granted()
2307 * 6-11: If the optional EXPEDITE flag is used with the new NL mode in _can_be_granted()
2315 * conversion or used with a non-NL requested mode. We also know an in _can_be_granted()
2318 * !conv && lkb->rqmode == DLM_LOCK_NL && (flags & EXPEDITE)) can in _can_be_granted()
2322 if (lkb->lkb_exflags & DLM_LKF_EXPEDITE) in _can_be_granted()
2330 if (queue_conflict(&r->res_grantqueue, lkb)) in _can_be_granted()
2334 * 6-3: By default, a conversion request is immediately granted if the in _can_be_granted()
2339 if (queue_conflict(&r->res_convertqueue, lkb)) in _can_be_granted()
2350 * (e.g. old, failed master held granted EX, with PR->EX, NL->EX. in _can_be_granted()
2352 * NL->EX, PR->EX, an in-place conversion deadlock.) So, after in _can_be_granted()
2360 * 6-5: But the default algorithm for deciding whether to grant or in _can_be_granted()
2365 * 6-7: This issue is dealt with by using the optional QUECVT flag with in _can_be_granted()
2382 if (now && conv && !(lkb->lkb_exflags & DLM_LKF_QUECVT)) in _can_be_granted()
2390 if (now && conv && (lkb->lkb_exflags & DLM_LKF_QUECVT)) { in _can_be_granted()
2391 if (list_empty(&r->res_convertqueue)) in _can_be_granted()
2402 if (lkb->lkb_exflags & DLM_LKF_NOORDER) in _can_be_granted()
2406 * 6-3: Once in that queue [CONVERTING], a conversion request cannot be in _can_be_granted()
2411 if (!now && conv && first_in_list(lkb, &r->res_convertqueue)) in _can_be_granted()
2415 * 6-4: By default, a new request is immediately granted only if all in _can_be_granted()
2418 * - The queue of ungranted conversion requests for the resource is in _can_be_granted()
2420 * - The queue of ungranted new requests for the resource is empty. in _can_be_granted()
2421 * - The mode of the new request is compatible with the most 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()
2430 * 6-4: Once a lock request is in the queue of ungranted new requests, 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()
2448 int8_t alt = 0, rqmode = lkb->lkb_rqmode; in can_be_granted()
2449 int8_t is_convert = (lkb->lkb_grmode != DLM_LOCK_IV); in can_be_granted()
2459 * The CONVDEADLK flag is non-standard and tells the dlm to resolve in can_be_granted()
2466 if (lkb->lkb_exflags & DLM_LKF_CONVDEADLK) { in can_be_granted()
2467 lkb->lkb_grmode = DLM_LOCK_NL; in can_be_granted()
2468 lkb->lkb_sbflags |= DLM_SBF_DEMOTED; in can_be_granted()
2470 *err = -EDEADLK; in can_be_granted()
2473 lkb->lkb_id, now); in can_be_granted()
2480 * The ALTPR and ALTCW flags are non-standard and tell the dlm to try in can_be_granted()
2486 if (rqmode != DLM_LOCK_PR && (lkb->lkb_exflags & DLM_LKF_ALTPR)) in can_be_granted()
2488 else if (rqmode != DLM_LOCK_CW && (lkb->lkb_exflags & DLM_LKF_ALTCW)) in can_be_granted()
2492 lkb->lkb_rqmode = alt; in can_be_granted()
2495 lkb->lkb_sbflags |= DLM_SBF_ALTMODE; in can_be_granted()
2497 lkb->lkb_rqmode = rqmode; in can_be_granted()
2520 list_for_each_entry_safe(lkb, s, &r->res_convertqueue, lkb_statequeue) { in grant_pending_convert()
2534 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in grant_pending_convert()
2545 if (lkb->lkb_exflags & DLM_LKF_NODLCKWT) { in grant_pending_convert()
2546 if (lkb->lkb_highbast < lkb->lkb_rqmode) { in grant_pending_convert()
2547 queue_bast(r, lkb, lkb->lkb_rqmode); in grant_pending_convert()
2548 lkb->lkb_highbast = lkb->lkb_rqmode; in grant_pending_convert()
2552 lkb->lkb_id, lkb->lkb_nodeid, in grant_pending_convert()
2553 r->res_name); in grant_pending_convert()
2559 hi = max_t(int, lkb->lkb_rqmode, hi); in grant_pending_convert()
2561 if (cw && lkb->lkb_rqmode == DLM_LOCK_CW) in grant_pending_convert()
2580 list_for_each_entry_safe(lkb, s, &r->res_waitqueue, lkb_statequeue) { in grant_pending_wait()
2586 high = max_t(int, lkb->lkb_rqmode, high); in grant_pending_wait()
2587 if (lkb->lkb_rqmode == DLM_LOCK_CW) in grant_pending_wait()
2602 if (gr->lkb_grmode == DLM_LOCK_PR && cw) { in lock_requires_bast()
2603 if (gr->lkb_highbast < DLM_LOCK_EX) in lock_requires_bast()
2608 if (gr->lkb_highbast < high && in lock_requires_bast()
2609 !__dlm_compat_matrix[gr->lkb_grmode+1][high+1]) in lock_requires_bast()
2621 log_print("grant_pending_locks r nodeid %d", r->res_nodeid); in grant_pending_locks()
2638 list_for_each_entry_safe(lkb, s, &r->res_grantqueue, lkb_statequeue) { in grant_pending_locks()
2639 if (lkb->lkb_bastfn && lock_requires_bast(lkb, high, cw)) { in grant_pending_locks()
2641 lkb->lkb_grmode == DLM_LOCK_PR) in grant_pending_locks()
2645 lkb->lkb_highbast = high; in grant_pending_locks()
2652 if ((gr->lkb_grmode == DLM_LOCK_PR && rq->lkb_rqmode == DLM_LOCK_CW) || in modes_require_bast()
2653 (gr->lkb_grmode == DLM_LOCK_CW && rq->lkb_rqmode == DLM_LOCK_PR)) { in modes_require_bast()
2654 if (gr->lkb_highbast < DLM_LOCK_EX) in modes_require_bast()
2659 if (gr->lkb_highbast < rq->lkb_rqmode && !modes_compat(gr, rq)) in modes_require_bast()
2673 if (gr->lkb_bastfn && modes_require_bast(gr, lkb)) { in send_bast_queue()
2674 queue_bast(r, gr, lkb->lkb_rqmode); in send_bast_queue()
2675 gr->lkb_highbast = lkb->lkb_rqmode; in send_bast_queue()
2682 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts()
2687 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts_all()
2688 send_bast_queue(r, &r->res_convertqueue, lkb); in send_blocking_asts_all()
2691 /* set_master(r, lkb) -- set the master nodeid of a resource
2716 r->res_first_lkid = lkb->lkb_id; in set_master()
2717 lkb->lkb_nodeid = r->res_nodeid; in set_master()
2721 if (r->res_first_lkid && r->res_first_lkid != lkb->lkb_id) { in set_master()
2722 list_add_tail(&lkb->lkb_rsb_lookup, &r->res_lookup); in set_master()
2726 if (r->res_master_nodeid == our_nodeid) { in set_master()
2727 lkb->lkb_nodeid = 0; in set_master()
2731 if (r->res_master_nodeid) { in set_master()
2732 lkb->lkb_nodeid = r->res_master_nodeid; in set_master()
2743 log_debug(r->res_ls, "set_master %x self master %d dir %d %s", in set_master()
2744 lkb->lkb_id, r->res_master_nodeid, r->res_dir_nodeid, in set_master()
2745 r->res_name); in set_master()
2746 r->res_master_nodeid = our_nodeid; in set_master()
2747 r->res_nodeid = 0; in set_master()
2748 lkb->lkb_nodeid = 0; in set_master()
2754 r->res_first_lkid = lkb->lkb_id; in set_master()
2763 list_for_each_entry_safe(lkb, safe, &r->res_lookup, lkb_rsb_lookup) { in process_lookup_list()
2764 list_del_init(&lkb->lkb_rsb_lookup); in process_lookup_list()
2770 /* confirm_master -- confirm (or deny) an rsb's master nodeid */
2776 if (!r->res_first_lkid) in confirm_master()
2781 case -EINPROGRESS: in confirm_master()
2782 r->res_first_lkid = 0; in confirm_master()
2786 case -EAGAIN: in confirm_master()
2787 case -EBADR: in confirm_master()
2788 case -ENOTBLK: in confirm_master()
2793 r->res_first_lkid = 0; in confirm_master()
2795 if (!list_empty(&r->res_lookup)) { in confirm_master()
2796 lkb = list_entry(r->res_lookup.next, struct dlm_lkb, in confirm_master()
2798 list_del_init(&lkb->lkb_rsb_lookup); in confirm_master()
2799 r->res_first_lkid = lkb->lkb_id; in confirm_master()
2805 log_error(r->res_ls, "confirm_master unknown error %d", error); in confirm_master()
2816 int rv = -EINVAL; in set_lock_args()
2853 if (flags & DLM_LKF_VALBLK && !lksb->sb_lvbptr) in set_lock_args()
2856 if (flags & DLM_LKF_CONVERT && !lksb->sb_lkid) in set_lock_args()
2863 args->flags = flags; in set_lock_args()
2864 args->astfn = ast; in set_lock_args()
2865 args->astparam = astparam; in set_lock_args()
2866 args->bastfn = bast; in set_lock_args()
2867 args->timeout = timeout_cs; in set_lock_args()
2868 args->mode = mode; in set_lock_args()
2869 args->lksb = lksb; in set_lock_args()
2879 return -EINVAL; in set_unlock_args()
2882 return -EINVAL; in set_unlock_args()
2884 args->flags = flags; in set_unlock_args()
2885 args->astparam = astarg; in set_unlock_args()
2892 int rv = -EBUSY; in validate_lock_args()
2894 if (args->flags & DLM_LKF_CONVERT) { in validate_lock_args()
2895 if (lkb->lkb_status != DLM_LKSTS_GRANTED) in validate_lock_args()
2898 if (lkb->lkb_wait_type) in validate_lock_args()
2904 rv = -EINVAL; in validate_lock_args()
2905 if (lkb->lkb_flags & DLM_IFL_MSTCPY) in validate_lock_args()
2908 if (args->flags & DLM_LKF_QUECVT && in validate_lock_args()
2909 !__quecvt_compat_matrix[lkb->lkb_grmode+1][args->mode+1]) in validate_lock_args()
2913 lkb->lkb_exflags = args->flags; in validate_lock_args()
2914 lkb->lkb_sbflags = 0; in validate_lock_args()
2915 lkb->lkb_astfn = args->astfn; in validate_lock_args()
2916 lkb->lkb_astparam = args->astparam; in validate_lock_args()
2917 lkb->lkb_bastfn = args->bastfn; in validate_lock_args()
2918 lkb->lkb_rqmode = args->mode; in validate_lock_args()
2919 lkb->lkb_lksb = args->lksb; in validate_lock_args()
2920 lkb->lkb_lvbptr = args->lksb->sb_lvbptr; in validate_lock_args()
2921 lkb->lkb_ownpid = (int) current->pid; in validate_lock_args()
2922 lkb->lkb_timeout_cs = args->timeout; in validate_lock_args()
2927 rv, lkb->lkb_id, lkb->lkb_flags, args->flags, in validate_lock_args()
2928 lkb->lkb_status, lkb->lkb_wait_type, in validate_lock_args()
2929 lkb->lkb_resource->res_name); in validate_lock_args()
2933 /* when dlm_unlock() sees -EBUSY with CANCEL/FORCEUNLOCK it returns 0
2936 /* note: it's valid for lkb_nodeid/res_nodeid to be -1 when we get here
2942 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in validate_unlock_args()
2943 int rv = -EINVAL; in validate_unlock_args()
2945 if (lkb->lkb_flags & DLM_IFL_MSTCPY) { in validate_unlock_args()
2946 log_error(ls, "unlock on MSTCPY %x", lkb->lkb_id); in validate_unlock_args()
2955 if (lkb->lkb_flags & DLM_IFL_ENDOFLIFE) { in validate_unlock_args()
2956 log_debug(ls, "unlock on ENDOFLIFE %x", lkb->lkb_id); in validate_unlock_args()
2957 rv = -ENOENT; in validate_unlock_args()
2964 if (!list_empty(&lkb->lkb_rsb_lookup)) { in validate_unlock_args()
2965 if (args->flags & (DLM_LKF_CANCEL | DLM_LKF_FORCEUNLOCK)) { in validate_unlock_args()
2966 log_debug(ls, "unlock on rsb_lookup %x", lkb->lkb_id); in validate_unlock_args()
2967 list_del_init(&lkb->lkb_rsb_lookup); in validate_unlock_args()
2968 queue_cast(lkb->lkb_resource, lkb, in validate_unlock_args()
2969 args->flags & DLM_LKF_CANCEL ? in validate_unlock_args()
2970 -DLM_ECANCEL : -DLM_EUNLOCK); in validate_unlock_args()
2973 /* caller changes -EBUSY to 0 for CANCEL and FORCEUNLOCK */ in validate_unlock_args()
2974 rv = -EBUSY; in validate_unlock_args()
2980 if (args->flags & DLM_LKF_CANCEL) { in validate_unlock_args()
2981 if (lkb->lkb_exflags & DLM_LKF_CANCEL) in validate_unlock_args()
2990 if (lkb->lkb_flags & DLM_IFL_RESEND) { in validate_unlock_args()
2991 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL; in validate_unlock_args()
2992 rv = -EBUSY; in validate_unlock_args()
2997 if (lkb->lkb_status == DLM_LKSTS_GRANTED && in validate_unlock_args()
2998 !lkb->lkb_wait_type) { in validate_unlock_args()
2999 rv = -EBUSY; in validate_unlock_args()
3003 switch (lkb->lkb_wait_type) { in validate_unlock_args()
3006 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL; in validate_unlock_args()
3007 rv = -EBUSY; in validate_unlock_args()
3017 /* do we need to allow a force-unlock if there's a normal unlock in validate_unlock_args()
3019 fail such that we'd want to send a force-unlock to be sure? */ in validate_unlock_args()
3021 if (args->flags & DLM_LKF_FORCEUNLOCK) { in validate_unlock_args()
3022 if (lkb->lkb_exflags & DLM_LKF_FORCEUNLOCK) in validate_unlock_args()
3031 if (lkb->lkb_flags & DLM_IFL_RESEND) { in validate_unlock_args()
3032 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK; in validate_unlock_args()
3033 rv = -EBUSY; in validate_unlock_args()
3037 switch (lkb->lkb_wait_type) { in validate_unlock_args()
3040 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK; in validate_unlock_args()
3041 rv = -EBUSY; in validate_unlock_args()
3051 rv = -EBUSY; in validate_unlock_args()
3052 if (lkb->lkb_wait_type || lkb->lkb_wait_count) in validate_unlock_args()
3057 lkb->lkb_exflags |= args->flags; in validate_unlock_args()
3058 lkb->lkb_sbflags = 0; in validate_unlock_args()
3059 lkb->lkb_astparam = args->astparam; in validate_unlock_args()
3064 lkb->lkb_id, lkb->lkb_flags, lkb->lkb_exflags, in validate_unlock_args()
3065 args->flags, lkb->lkb_wait_type, in validate_unlock_args()
3066 lkb->lkb_resource->res_name); in validate_unlock_args()
3088 error = -EINPROGRESS; in do_request()
3094 error = -EAGAIN; in do_request()
3095 queue_cast(r, lkb, -EAGAIN); in do_request()
3104 case -EAGAIN: in do_request_effects()
3108 case -EINPROGRESS: in do_request_effects()
3131 if (deadlk && !(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) { in do_convert()
3134 queue_cast(r, lkb, -EDEADLK); in do_convert()
3135 error = -EDEADLK; in do_convert()
3140 to NL, and left us on the granted queue. This auto-demotion in do_convert()
3156 error = -EINPROGRESS; in do_convert()
3163 error = -EAGAIN; in do_convert()
3164 queue_cast(r, lkb, -EAGAIN); in do_convert()
3177 case -EAGAIN: in do_convert_effects()
3181 case -EINPROGRESS: in do_convert_effects()
3190 queue_cast(r, lkb, -DLM_EUNLOCK); in do_unlock()
3191 return -DLM_EUNLOCK; in do_unlock()
3200 /* returns: 0 did nothing, -DLM_ECANCEL canceled lock */
3208 queue_cast(r, lkb, -DLM_ECANCEL); in do_cancel()
3209 return -DLM_ECANCEL; in do_cancel()
3334 lkb->lkb_lksb->sb_lkid = lkb->lkb_id; in request_lock()
3349 r = lkb->lkb_resource; in convert_lock()
3371 r = lkb->lkb_resource; in unlock_lock()
3393 r = lkb->lkb_resource; in cancel_lock()
3431 return -EINVAL; in dlm_lock()
3436 error = find_lkb(ls, lksb->sb_lkid, &lkb); in dlm_lock()
3453 if (error == -EINPROGRESS) in dlm_lock()
3458 if (error == -EAGAIN || error == -EDEADLK) in dlm_lock()
3479 return -EINVAL; in dlm_unlock()
3496 if (error == -DLM_EUNLOCK || error == -DLM_ECANCEL) in dlm_unlock()
3498 if (error == -EBUSY && (flags & (DLM_LKF_CANCEL | DLM_LKF_FORCEUNLOCK))) in dlm_unlock()
3539 /* get_buffer gives us a message handle (mh) that we need to in _create_message()
3545 return -ENOBUFS; in _create_message()
3551 ms->m_header.h_version = (DLM_HEADER_MAJOR | DLM_HEADER_MINOR); in _create_message()
3552 ms->m_header.h_lockspace = ls->ls_global_id; in _create_message()
3553 ms->m_header.h_nodeid = dlm_our_nodeid(); in _create_message()
3554 ms->m_header.h_length = mb_len; in _create_message()
3555 ms->m_header.h_cmd = DLM_MSG; in _create_message()
3557 ms->m_type = mstype; in _create_message()
3575 mb_len += r->res_length; in create_message()
3582 if (lkb && lkb->lkb_lvbptr) in create_message()
3583 mb_len += r->res_ls->ls_lvblen; in create_message()
3587 return _create_message(r->res_ls, mb_len, to_nodeid, mstype, in create_message()
3604 ms->m_nodeid = lkb->lkb_nodeid; in send_args()
3605 ms->m_pid = lkb->lkb_ownpid; in send_args()
3606 ms->m_lkid = lkb->lkb_id; in send_args()
3607 ms->m_remid = lkb->lkb_remid; in send_args()
3608 ms->m_exflags = lkb->lkb_exflags; in send_args()
3609 ms->m_sbflags = lkb->lkb_sbflags; in send_args()
3610 ms->m_flags = lkb->lkb_flags; in send_args()
3611 ms->m_lvbseq = lkb->lkb_lvbseq; in send_args()
3612 ms->m_status = lkb->lkb_status; in send_args()
3613 ms->m_grmode = lkb->lkb_grmode; in send_args()
3614 ms->m_rqmode = lkb->lkb_rqmode; in send_args()
3615 ms->m_hash = r->res_hash; in send_args()
3620 if (lkb->lkb_bastfn) in send_args()
3621 ms->m_asts |= DLM_CB_BAST; in send_args()
3622 if (lkb->lkb_astfn) in send_args()
3623 ms->m_asts |= DLM_CB_CAST; in send_args()
3628 switch (ms->m_type) { in send_args()
3631 memcpy(ms->m_extra, r->res_name, r->res_length); in send_args()
3638 if (!lkb->lkb_lvbptr) in send_args()
3640 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in send_args()
3651 to_nodeid = r->res_nodeid; in send_common()
3687 r->res_ls->ls_stub_ms.m_flags = DLM_IFL_STUB_MS; in send_convert()
3688 r->res_ls->ls_stub_ms.m_type = DLM_MSG_CONVERT_REPLY; in send_convert()
3689 r->res_ls->ls_stub_ms.m_result = 0; in send_convert()
3690 __receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms); in send_convert()
3716 to_nodeid = lkb->lkb_nodeid; in send_grant()
3724 ms->m_result = 0; in send_grant()
3737 to_nodeid = lkb->lkb_nodeid; in send_bast()
3745 ms->m_bastmode = mode; in send_bast()
3792 memcpy(ms->m_extra, r->res_name, r->res_length); in send_remove()
3793 ms->m_hash = r->res_hash; in send_remove()
3807 to_nodeid = lkb->lkb_nodeid; in send_common_reply()
3815 ms->m_result = rv; in send_common_reply()
3845 struct dlm_rsb *r = &ls->ls_stub_rsb; in send_lookup_reply()
3848 int error, nodeid = ms_in->m_header.h_nodeid; in send_lookup_reply()
3854 ms->m_lkid = ms_in->m_lkid; in send_lookup_reply()
3855 ms->m_result = rv; in send_lookup_reply()
3856 ms->m_nodeid = ret_nodeid; in send_lookup_reply()
3869 lkb->lkb_exflags = ms->m_exflags; in receive_flags()
3870 lkb->lkb_sbflags = ms->m_sbflags; in receive_flags()
3871 lkb->lkb_flags = (lkb->lkb_flags & 0xFFFF0000) | in receive_flags()
3872 (ms->m_flags & 0x0000FFFF); in receive_flags()
3877 if (ms->m_flags == DLM_IFL_STUB_MS) in receive_flags_reply()
3880 lkb->lkb_sbflags = ms->m_sbflags; in receive_flags_reply()
3881 lkb->lkb_flags = (lkb->lkb_flags & 0xFFFF0000) | in receive_flags_reply()
3882 (ms->m_flags & 0x0000FFFF); in receive_flags_reply()
3887 return (ms->m_header.h_length - sizeof(struct dlm_message)); in receive_extralen()
3895 if (lkb->lkb_exflags & DLM_LKF_VALBLK) { in receive_lvb()
3896 if (!lkb->lkb_lvbptr) in receive_lvb()
3897 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_lvb()
3898 if (!lkb->lkb_lvbptr) in receive_lvb()
3899 return -ENOMEM; in receive_lvb()
3901 if (len > ls->ls_lvblen) in receive_lvb()
3902 len = ls->ls_lvblen; in receive_lvb()
3903 memcpy(lkb->lkb_lvbptr, ms->m_extra, len); in receive_lvb()
3921 lkb->lkb_nodeid = ms->m_header.h_nodeid; in receive_request_args()
3922 lkb->lkb_ownpid = ms->m_pid; in receive_request_args()
3923 lkb->lkb_remid = ms->m_lkid; in receive_request_args()
3924 lkb->lkb_grmode = DLM_LOCK_IV; in receive_request_args()
3925 lkb->lkb_rqmode = ms->m_rqmode; in receive_request_args()
3927 lkb->lkb_bastfn = (ms->m_asts & DLM_CB_BAST) ? &fake_bastfn : NULL; in receive_request_args()
3928 lkb->lkb_astfn = (ms->m_asts & DLM_CB_CAST) ? &fake_astfn : NULL; in receive_request_args()
3930 if (lkb->lkb_exflags & DLM_LKF_VALBLK) { in receive_request_args()
3932 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_request_args()
3933 if (!lkb->lkb_lvbptr) in receive_request_args()
3934 return -ENOMEM; in receive_request_args()
3943 if (lkb->lkb_status != DLM_LKSTS_GRANTED) in receive_convert_args()
3944 return -EBUSY; in receive_convert_args()
3947 return -ENOMEM; in receive_convert_args()
3949 lkb->lkb_rqmode = ms->m_rqmode; in receive_convert_args()
3950 lkb->lkb_lvbseq = ms->m_lvbseq; in receive_convert_args()
3959 return -ENOMEM; in receive_unlock_args()
3963 /* We fill in the stub-lkb fields with the info that send_xxxx_reply()
3968 struct dlm_lkb *lkb = &ls->ls_stub_lkb; in setup_stub_lkb()
3969 lkb->lkb_nodeid = ms->m_header.h_nodeid; in setup_stub_lkb()
3970 lkb->lkb_remid = ms->m_lkid; in setup_stub_lkb()
3978 int from = ms->m_header.h_nodeid; in validate_message()
3982 if (ms->m_flags & DLM_IFL_USER && ~lkb->lkb_flags & DLM_IFL_USER) { in validate_message()
3983 log_error(lkb->lkb_resource->res_ls, in validate_message()
3985 error = -EINVAL; in validate_message()
3989 switch (ms->m_type) { in validate_message()
3993 if (!is_master_copy(lkb) || lkb->lkb_nodeid != from) in validate_message()
3994 error = -EINVAL; in validate_message()
4002 if (!is_process_copy(lkb) || lkb->lkb_nodeid != from) in validate_message()
4003 error = -EINVAL; in validate_message()
4008 error = -EINVAL; in validate_message()
4009 else if (lkb->lkb_nodeid != -1 && lkb->lkb_nodeid != from) in validate_message()
4010 error = -EINVAL; in validate_message()
4014 error = -EINVAL; in validate_message()
4019 log_error(lkb->lkb_resource->res_ls, in validate_message()
4021 ms->m_type, from, lkb->lkb_id, lkb->lkb_remid, in validate_message()
4022 lkb->lkb_flags, lkb->lkb_nodeid); in validate_message()
4039 b = hash & (ls->ls_rsbtbl_size - 1); in send_repeat_remove()
4045 spin_lock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4046 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in send_repeat_remove()
4048 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4053 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in send_repeat_remove()
4055 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4060 /* use ls->remove_name2 to avoid conflict with shrink? */ in send_repeat_remove()
4062 spin_lock(&ls->ls_remove_spin); in send_repeat_remove()
4063 ls->ls_remove_len = len; in send_repeat_remove()
4064 memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN); in send_repeat_remove()
4065 spin_unlock(&ls->ls_remove_spin); in send_repeat_remove()
4066 spin_unlock(&ls->ls_rsbtbl[b].lock); in send_repeat_remove()
4073 memcpy(ms->m_extra, name, len); in send_repeat_remove()
4074 ms->m_hash = hash; in send_repeat_remove()
4079 spin_lock(&ls->ls_remove_spin); in send_repeat_remove()
4080 ls->ls_remove_len = 0; in send_repeat_remove()
4081 memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN); in send_repeat_remove()
4082 spin_unlock(&ls->ls_remove_spin); in send_repeat_remove()
4092 from_nodeid = ms->m_header.h_nodeid; in receive_request()
4099 lkb->lkb_flags |= DLM_IFL_MSTCPY; in receive_request()
4107 for this rsb or not, so if the master sends us a request, we should in receive_request()
4110 node sends us a request for the rsb. */ in receive_request()
4114 error = find_rsb(ls, ms->m_extra, namelen, from_nodeid, in receive_request()
4123 if (r->res_master_nodeid != dlm_our_nodeid()) { in receive_request()
4141 if (error == -EINPROGRESS) in receive_request()
4151 ENOTBLK request failures when the lookup reply designating us in receive_request()
4154 /* We could repeatedly return -EBADR here if our send_remove() is in receive_request()
4163 if (error != -ENOTBLK) { in receive_request()
4165 ms->m_lkid, from_nodeid, error); in receive_request()
4168 if (namelen && error == -EBADR) { in receive_request()
4169 send_repeat_remove(ls, ms->m_extra, namelen); in receive_request()
4174 send_request_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_request()
4184 error = find_lkb(ls, ms->m_remid, &lkb); in receive_convert()
4188 if (lkb->lkb_remid != ms->m_lkid) { in receive_convert()
4190 "remote %d %x", lkb->lkb_id, lkb->lkb_remid, in receive_convert()
4191 (unsigned long long)lkb->lkb_recover_seq, in receive_convert()
4192 ms->m_header.h_nodeid, ms->m_lkid); in receive_convert()
4193 error = -ENOENT; in receive_convert()
4198 r = lkb->lkb_resource; in receive_convert()
4229 send_convert_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_convert()
4239 error = find_lkb(ls, ms->m_remid, &lkb); in receive_unlock()
4243 if (lkb->lkb_remid != ms->m_lkid) { in receive_unlock()
4245 lkb->lkb_id, lkb->lkb_remid, in receive_unlock()
4246 ms->m_header.h_nodeid, ms->m_lkid); in receive_unlock()
4247 error = -ENOENT; in receive_unlock()
4252 r = lkb->lkb_resource; in receive_unlock()
4280 send_unlock_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_unlock()
4290 error = find_lkb(ls, ms->m_remid, &lkb); in receive_cancel()
4296 r = lkb->lkb_resource; in receive_cancel()
4316 send_cancel_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error); in receive_cancel()
4326 error = find_lkb(ls, ms->m_remid, &lkb); in receive_grant()
4330 r = lkb->lkb_resource; in receive_grant()
4357 error = find_lkb(ls, ms->m_remid, &lkb); in receive_bast()
4361 r = lkb->lkb_resource; in receive_bast()
4370 queue_bast(r, lkb, ms->m_bastmode); in receive_bast()
4371 lkb->lkb_highbast = ms->m_bastmode; in receive_bast()
4383 from_nodeid = ms->m_header.h_nodeid; in receive_lookup()
4388 error = dlm_master_lookup(ls, from_nodeid, ms->m_extra, len, 0, in receive_lookup()
4406 from_nodeid = ms->m_header.h_nodeid; in receive_remove()
4416 dir_nodeid = dlm_hash2nodeid(ls, ms->m_hash); in receive_remove()
4433 memcpy(name, ms->m_extra, len); in receive_remove()
4436 b = hash & (ls->ls_rsbtbl_size - 1); in receive_remove()
4438 spin_lock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4440 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].toss, name, len, &r); in receive_remove()
4443 rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[b].keep, name, len, &r); in receive_remove()
4448 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4451 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4454 from_nodeid, r->res_master_nodeid); in receive_remove()
4456 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4461 from_nodeid, r->res_master_nodeid, r->res_first_lkid, in receive_remove()
4463 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4467 if (r->res_master_nodeid != from_nodeid) { in receive_remove()
4469 from_nodeid, r->res_master_nodeid); in receive_remove()
4471 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4475 if (kref_put(&r->res_ref, kill_rsb)) { in receive_remove()
4476 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); in receive_remove()
4477 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4483 spin_unlock(&ls->ls_rsbtbl[b].lock); in receive_remove()
4489 do_purge(ls, ms->m_nodeid, ms->m_pid); in receive_purge()
4497 int from_nodeid = ms->m_header.h_nodeid; in receive_request_reply()
4499 error = find_lkb(ls, ms->m_remid, &lkb); in receive_request_reply()
4503 r = lkb->lkb_resource; in receive_request_reply()
4511 mstype = lkb->lkb_wait_type; in receive_request_reply()
4515 lkb->lkb_id, from_nodeid, ms->m_lkid, ms->m_result); in receive_request_reply()
4523 r->res_master_nodeid = from_nodeid; in receive_request_reply()
4524 r->res_nodeid = from_nodeid; in receive_request_reply()
4525 lkb->lkb_nodeid = from_nodeid; in receive_request_reply()
4529 result = ms->m_result; in receive_request_reply()
4532 case -EAGAIN: in receive_request_reply()
4534 queue_cast(r, lkb, -EAGAIN); in receive_request_reply()
4535 confirm_master(r, -EAGAIN); in receive_request_reply()
4539 case -EINPROGRESS: in receive_request_reply()
4543 lkb->lkb_remid = ms->m_lkid; in receive_request_reply()
4556 case -EBADR: in receive_request_reply()
4557 case -ENOTBLK: in receive_request_reply()
4560 "master %d dir %d first %x %s", lkb->lkb_id, in receive_request_reply()
4561 from_nodeid, result, r->res_master_nodeid, in receive_request_reply()
4562 r->res_dir_nodeid, r->res_first_lkid, r->res_name); in receive_request_reply()
4564 if (r->res_dir_nodeid != dlm_our_nodeid() && in receive_request_reply()
4565 r->res_master_nodeid != dlm_our_nodeid()) { in receive_request_reply()
4566 /* cause _request_lock->set_master->send_lookup */ in receive_request_reply()
4567 r->res_master_nodeid = 0; in receive_request_reply()
4568 r->res_nodeid = -1; in receive_request_reply()
4569 lkb->lkb_nodeid = -1; in receive_request_reply()
4580 if (r->res_master_nodeid == dlm_our_nodeid()) in receive_request_reply()
4587 lkb->lkb_id, result); in receive_request_reply()
4590 if (is_overlap_unlock(lkb) && (result == 0 || result == -EINPROGRESS)) { in receive_request_reply()
4592 lkb->lkb_id, result); in receive_request_reply()
4593 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in receive_request_reply()
4594 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in receive_request_reply()
4596 } else if (is_overlap_cancel(lkb) && (result == -EINPROGRESS)) { in receive_request_reply()
4597 log_debug(ls, "receive_request_reply %x cancel", lkb->lkb_id); in receive_request_reply()
4598 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in receive_request_reply()
4599 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in receive_request_reply()
4602 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in receive_request_reply()
4603 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in receive_request_reply()
4616 switch (ms->m_result) { in __receive_convert_reply()
4617 case -EAGAIN: in __receive_convert_reply()
4619 queue_cast(r, lkb, -EAGAIN); in __receive_convert_reply()
4622 case -EDEADLK: in __receive_convert_reply()
4625 queue_cast(r, lkb, -EDEADLK); in __receive_convert_reply()
4628 case -EINPROGRESS: in __receive_convert_reply()
4648 log_error(r->res_ls, "receive_convert_reply %x remote %d %x %d", in __receive_convert_reply()
4649 lkb->lkb_id, ms->m_header.h_nodeid, ms->m_lkid, in __receive_convert_reply()
4650 ms->m_result); in __receive_convert_reply()
4658 struct dlm_rsb *r = lkb->lkb_resource; in _receive_convert_reply()
4684 error = find_lkb(ls, ms->m_remid, &lkb); in receive_convert_reply()
4695 struct dlm_rsb *r = lkb->lkb_resource; in _receive_unlock_reply()
4712 switch (ms->m_result) { in _receive_unlock_reply()
4713 case -DLM_EUNLOCK: in _receive_unlock_reply()
4716 queue_cast(r, lkb, -DLM_EUNLOCK); in _receive_unlock_reply()
4718 case -ENOENT: in _receive_unlock_reply()
4721 log_error(r->res_ls, "receive_unlock_reply %x error %d", in _receive_unlock_reply()
4722 lkb->lkb_id, ms->m_result); in _receive_unlock_reply()
4734 error = find_lkb(ls, ms->m_remid, &lkb); in receive_unlock_reply()
4745 struct dlm_rsb *r = lkb->lkb_resource; in _receive_cancel_reply()
4762 switch (ms->m_result) { in _receive_cancel_reply()
4763 case -DLM_ECANCEL: in _receive_cancel_reply()
4766 queue_cast(r, lkb, -DLM_ECANCEL); in _receive_cancel_reply()
4771 log_error(r->res_ls, "receive_cancel_reply %x error %d", in _receive_cancel_reply()
4772 lkb->lkb_id, ms->m_result); in _receive_cancel_reply()
4784 error = find_lkb(ls, ms->m_remid, &lkb); in receive_cancel_reply()
4800 error = find_lkb(ls, ms->m_lkid, &lkb); in receive_lookup_reply()
4802 log_error(ls, "receive_lookup_reply no lkid %x", ms->m_lkid); in receive_lookup_reply()
4806 /* ms->m_result is the value returned by dlm_master_lookup on dir node in receive_lookup_reply()
4807 FIXME: will a non-zero error ever be returned? */ in receive_lookup_reply()
4809 r = lkb->lkb_resource; in receive_lookup_reply()
4817 ret_nodeid = ms->m_nodeid; in receive_lookup_reply()
4825 if (r->res_master_nodeid && (r->res_master_nodeid != ret_nodeid)) { in receive_lookup_reply()
4829 lkb->lkb_id, ms->m_header.h_nodeid, ret_nodeid, in receive_lookup_reply()
4830 r->res_master_nodeid, r->res_dir_nodeid, in receive_lookup_reply()
4831 dlm_our_nodeid(), r->res_first_lkid, r->res_name); in receive_lookup_reply()
4835 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4836 r->res_nodeid = 0; in receive_lookup_reply()
4838 r->res_first_lkid = 0; in receive_lookup_reply()
4839 } else if (ret_nodeid == -1) { in receive_lookup_reply()
4842 lkb->lkb_id, ms->m_header.h_nodeid); in receive_lookup_reply()
4843 r->res_master_nodeid = 0; in receive_lookup_reply()
4844 r->res_nodeid = -1; in receive_lookup_reply()
4845 lkb->lkb_nodeid = -1; in receive_lookup_reply()
4848 r->res_master_nodeid = ret_nodeid; in receive_lookup_reply()
4849 r->res_nodeid = ret_nodeid; in receive_lookup_reply()
4854 lkb->lkb_id, lkb->lkb_flags); in receive_lookup_reply()
4876 if (!dlm_is_member(ls, ms->m_header.h_nodeid)) { in _receive_message()
4877 log_limit(ls, "receive %d from non-member %d %x %x %d", in _receive_message()
4878 ms->m_type, ms->m_header.h_nodeid, ms->m_lkid, in _receive_message()
4879 ms->m_remid, ms->m_result); in _receive_message()
4883 switch (ms->m_type) { in _receive_message()
4957 log_error(ls, "unknown message type %d", ms->m_type); in _receive_message()
4971 if (error == -ENOENT && noent) { in _receive_message()
4973 ms->m_type, ms->m_remid, ms->m_header.h_nodeid, in _receive_message()
4974 ms->m_lkid, saved_seq); in _receive_message()
4975 } else if (error == -ENOENT) { in _receive_message()
4977 ms->m_type, ms->m_remid, ms->m_header.h_nodeid, in _receive_message()
4978 ms->m_lkid, saved_seq); in _receive_message()
4980 if (ms->m_type == DLM_MSG_CONVERT) in _receive_message()
4981 dlm_dump_rsb_hash(ls, ms->m_hash); in _receive_message()
4984 if (error == -EINVAL) { in _receive_message()
4987 ms->m_type, ms->m_header.h_nodeid, in _receive_message()
4988 ms->m_lkid, ms->m_remid, saved_seq); in _receive_message()
5005 other nodes may still be sending us messages from the in dlm_receive_message()
5007 if (!ls->ls_generation) { in dlm_receive_message()
5009 ms->m_type, nodeid); in dlm_receive_message()
5036 struct dlm_header *hd = &p->header; in dlm_receive_buffer()
5040 switch (hd->h_cmd) { in dlm_receive_buffer()
5042 dlm_message_in(&p->message); in dlm_receive_buffer()
5043 type = p->message.m_type; in dlm_receive_buffer()
5046 dlm_rcom_in(&p->rcom); in dlm_receive_buffer()
5047 type = p->rcom.rc_type; in dlm_receive_buffer()
5050 log_print("invalid h_cmd %d from %u", hd->h_cmd, nodeid); in dlm_receive_buffer()
5054 if (hd->h_nodeid != nodeid) { in dlm_receive_buffer()
5056 hd->h_nodeid, nodeid, hd->h_lockspace); in dlm_receive_buffer()
5060 ls = dlm_find_lockspace_global(hd->h_lockspace); in dlm_receive_buffer()
5065 hd->h_lockspace, nodeid, hd->h_cmd, type); in dlm_receive_buffer()
5068 if (hd->h_cmd == DLM_RCOM && type == DLM_RCOM_STATUS) in dlm_receive_buffer()
5069 dlm_send_ls_not_ready(nodeid, &p->rcom); in dlm_receive_buffer()
5076 down_read(&ls->ls_recv_active); in dlm_receive_buffer()
5077 if (hd->h_cmd == DLM_MSG) in dlm_receive_buffer()
5078 dlm_receive_message(ls, &p->message, nodeid); in dlm_receive_buffer()
5080 dlm_receive_rcom(ls, &p->rcom, nodeid); in dlm_receive_buffer()
5081 up_read(&ls->ls_recv_active); in dlm_receive_buffer()
5092 ms_stub->m_flags = DLM_IFL_STUB_MS; in recover_convert_waiter()
5093 ms_stub->m_type = DLM_MSG_CONVERT_REPLY; in recover_convert_waiter()
5094 ms_stub->m_result = -EINPROGRESS; in recover_convert_waiter()
5095 ms_stub->m_header.h_nodeid = lkb->lkb_nodeid; in recover_convert_waiter()
5099 lkb->lkb_grmode = DLM_LOCK_IV; in recover_convert_waiter()
5100 rsb_set_flag(lkb->lkb_resource, RSB_RECOVER_CONVERT); in recover_convert_waiter()
5103 } else if (lkb->lkb_rqmode >= lkb->lkb_grmode) { in recover_convert_waiter()
5104 lkb->lkb_flags |= DLM_IFL_RESEND; in recover_convert_waiter()
5107 /* lkb->lkb_rqmode < lkb->lkb_grmode shouldn't happen since down in recover_convert_waiter()
5120 if (dlm_is_removed(ls, lkb->lkb_wait_nodeid)) in waiter_needs_recovery()
5128 dead node. Requests and up-conversions we flag to be resent after
5129 recovery. Down-conversions can just be completed with a fake reply like
5143 mutex_lock(&ls->ls_waiters_mutex); in dlm_recover_waiters_pre()
5145 list_for_each_entry_safe(lkb, safe, &ls->ls_waiters, lkb_wait_reply) { in dlm_recover_waiters_pre()
5147 dir_nodeid = dlm_dir_nodeid(lkb->lkb_resource); in dlm_recover_waiters_pre()
5152 if (lkb->lkb_wait_type != DLM_MSG_UNLOCK) { in dlm_recover_waiters_pre()
5155 lkb->lkb_id, in dlm_recover_waiters_pre()
5156 lkb->lkb_remid, in dlm_recover_waiters_pre()
5157 lkb->lkb_wait_type, in dlm_recover_waiters_pre()
5158 lkb->lkb_resource->res_nodeid, in dlm_recover_waiters_pre()
5159 lkb->lkb_nodeid, in dlm_recover_waiters_pre()
5160 lkb->lkb_wait_nodeid, in dlm_recover_waiters_pre()
5167 if (lkb->lkb_wait_type == DLM_MSG_LOOKUP) { in dlm_recover_waiters_pre()
5168 lkb->lkb_flags |= DLM_IFL_RESEND; in dlm_recover_waiters_pre()
5175 wait_type = lkb->lkb_wait_type; in dlm_recover_waiters_pre()
5176 stub_unlock_result = -DLM_EUNLOCK; in dlm_recover_waiters_pre()
5177 stub_cancel_result = -DLM_ECANCEL; in dlm_recover_waiters_pre()
5187 if (lkb->lkb_grmode == DLM_LOCK_IV) in dlm_recover_waiters_pre()
5192 if (lkb->lkb_grmode == DLM_LOCK_IV) in dlm_recover_waiters_pre()
5193 stub_unlock_result = -ENOENT; in dlm_recover_waiters_pre()
5197 lkb->lkb_id, lkb->lkb_flags, wait_type, in dlm_recover_waiters_pre()
5204 lkb->lkb_flags |= DLM_IFL_RESEND; in dlm_recover_waiters_pre()
5214 ms_stub->m_flags = DLM_IFL_STUB_MS; in dlm_recover_waiters_pre()
5215 ms_stub->m_type = DLM_MSG_UNLOCK_REPLY; in dlm_recover_waiters_pre()
5216 ms_stub->m_result = stub_unlock_result; in dlm_recover_waiters_pre()
5217 ms_stub->m_header.h_nodeid = lkb->lkb_nodeid; in dlm_recover_waiters_pre()
5225 ms_stub->m_flags = DLM_IFL_STUB_MS; in dlm_recover_waiters_pre()
5226 ms_stub->m_type = DLM_MSG_CANCEL_REPLY; in dlm_recover_waiters_pre()
5227 ms_stub->m_result = stub_cancel_result; in dlm_recover_waiters_pre()
5228 ms_stub->m_header.h_nodeid = lkb->lkb_nodeid; in dlm_recover_waiters_pre()
5235 lkb->lkb_wait_type, wait_type); in dlm_recover_waiters_pre()
5239 mutex_unlock(&ls->ls_waiters_mutex); in dlm_recover_waiters_pre()
5247 mutex_lock(&ls->ls_waiters_mutex); in find_resend_waiter()
5248 list_for_each_entry(iter, &ls->ls_waiters, lkb_wait_reply) { in find_resend_waiter()
5249 if (iter->lkb_flags & DLM_IFL_RESEND) { in find_resend_waiter()
5255 mutex_unlock(&ls->ls_waiters_mutex); in find_resend_waiter()
5261 master or dir-node for r. Processing the lkb may result in it being placed
5280 int error = 0, mstype, err, oc, ou; in dlm_recover_waiters_post() local
5285 error = -EINTR; in dlm_recover_waiters_post()
5293 r = lkb->lkb_resource; in dlm_recover_waiters_post()
5297 mstype = lkb->lkb_wait_type; in dlm_recover_waiters_post()
5298 oc = is_overlap_cancel(lkb); in dlm_recover_waiters_post()
5304 "overlap %d %d", lkb->lkb_id, lkb->lkb_remid, mstype, in dlm_recover_waiters_post()
5305 r->res_nodeid, lkb->lkb_nodeid, lkb->lkb_wait_nodeid, in dlm_recover_waiters_post()
5306 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5312 lkb->lkb_flags &= ~DLM_IFL_RESEND; in dlm_recover_waiters_post()
5313 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in dlm_recover_waiters_post()
5314 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in dlm_recover_waiters_post()
5315 lkb->lkb_wait_type = 0; in dlm_recover_waiters_post()
5319 while (lkb->lkb_wait_count) { in dlm_recover_waiters_post()
5320 lkb->lkb_wait_count--; in dlm_recover_waiters_post()
5323 mutex_lock(&ls->ls_waiters_mutex); in dlm_recover_waiters_post()
5324 list_del_init(&lkb->lkb_wait_reply); in dlm_recover_waiters_post()
5325 mutex_unlock(&ls->ls_waiters_mutex); in dlm_recover_waiters_post()
5327 if (oc || ou) { in dlm_recover_waiters_post()
5332 queue_cast(r, lkb, ou ? -DLM_EUNLOCK : in dlm_recover_waiters_post()
5333 -DLM_ECANCEL); in dlm_recover_waiters_post()
5337 if (oc) { in dlm_recover_waiters_post()
5338 queue_cast(r, lkb, -DLM_ECANCEL); in dlm_recover_waiters_post()
5340 lkb->lkb_exflags |= DLM_LKF_FORCEUNLOCK; in dlm_recover_waiters_post()
5366 lkb->lkb_id, mstype, r->res_nodeid, in dlm_recover_waiters_post()
5367 dlm_dir_nodeid(r), oc, ou); in dlm_recover_waiters_post()
5389 if (lkb->lkb_recover_seq == ls->ls_recover_seq) in purge_mstcpy_list()
5402 struct dlm_ls *ls = r->res_ls; in dlm_purge_mstcpy_locks()
5404 purge_mstcpy_list(ls, r, &r->res_grantqueue); in dlm_purge_mstcpy_locks()
5405 purge_mstcpy_list(ls, r, &r->res_convertqueue); in dlm_purge_mstcpy_locks()
5406 purge_mstcpy_list(ls, r, &r->res_waitqueue); in dlm_purge_mstcpy_locks()
5419 if ((lkb->lkb_nodeid == nodeid_gone) || in purge_dead_list()
5420 dlm_is_removed(ls, lkb->lkb_nodeid)) { in purge_dead_list()
5424 if ((lkb->lkb_exflags & DLM_LKF_VALBLK) && in purge_dead_list()
5425 (lkb->lkb_grmode >= DLM_LOCK_PW)) { in purge_dead_list()
5455 list_for_each_entry(memb, &ls->ls_nodes_gone, list) { in dlm_recover_purge()
5457 nodeid_gone = memb->nodeid; in dlm_recover_purge()
5463 down_write(&ls->ls_root_sem); in dlm_recover_purge()
5464 list_for_each_entry(r, &ls->ls_root_list, res_root_list) { in dlm_recover_purge()
5468 purge_dead_list(ls, r, &r->res_grantqueue, in dlm_recover_purge()
5470 purge_dead_list(ls, r, &r->res_convertqueue, in dlm_recover_purge()
5472 purge_dead_list(ls, r, &r->res_waitqueue, in dlm_recover_purge()
5479 up_write(&ls->ls_root_sem); in dlm_recover_purge()
5491 spin_lock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5492 for (n = rb_first(&ls->ls_rsbtbl[bucket].keep); n; n = rb_next(n)) { in find_grant_rsb()
5502 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5505 spin_unlock(&ls->ls_rsbtbl[bucket].lock); in find_grant_rsb()
5517 * Simplest would be to go through each master rsb and check for non-empty
5537 if (bucket == ls->ls_rsbtbl_size - 1) in dlm_recover_grant()
5566 if (lkb->lkb_nodeid == nodeid && lkb->lkb_remid == remid) in search_remid_list()
5577 lkb = search_remid_list(&r->res_grantqueue, nodeid, remid); in search_remid()
5580 lkb = search_remid_list(&r->res_convertqueue, nodeid, remid); in search_remid()
5583 lkb = search_remid_list(&r->res_waitqueue, nodeid, remid); in search_remid()
5593 struct rcom_lock *rl = (struct rcom_lock *) rc->rc_buf; in receive_rcom_lock_args()
5595 lkb->lkb_nodeid = rc->rc_header.h_nodeid; in receive_rcom_lock_args()
5596 lkb->lkb_ownpid = le32_to_cpu(rl->rl_ownpid); in receive_rcom_lock_args()
5597 lkb->lkb_remid = le32_to_cpu(rl->rl_lkid); in receive_rcom_lock_args()
5598 lkb->lkb_exflags = le32_to_cpu(rl->rl_exflags); in receive_rcom_lock_args()
5599 lkb->lkb_flags = le32_to_cpu(rl->rl_flags) & 0x0000FFFF; in receive_rcom_lock_args()
5600 lkb->lkb_flags |= DLM_IFL_MSTCPY; in receive_rcom_lock_args()
5601 lkb->lkb_lvbseq = le32_to_cpu(rl->rl_lvbseq); in receive_rcom_lock_args()
5602 lkb->lkb_rqmode = rl->rl_rqmode; in receive_rcom_lock_args()
5603 lkb->lkb_grmode = rl->rl_grmode; in receive_rcom_lock_args()
5606 lkb->lkb_bastfn = (rl->rl_asts & DLM_CB_BAST) ? &fake_bastfn : NULL; in receive_rcom_lock_args()
5607 lkb->lkb_astfn = (rl->rl_asts & DLM_CB_CAST) ? &fake_astfn : NULL; in receive_rcom_lock_args()
5609 if (lkb->lkb_exflags & DLM_LKF_VALBLK) { in receive_rcom_lock_args()
5610 int lvblen = rc->rc_header.h_length - sizeof(struct dlm_rcom) - in receive_rcom_lock_args()
5612 if (lvblen > ls->ls_lvblen) in receive_rcom_lock_args()
5613 return -EINVAL; in receive_rcom_lock_args()
5614 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_rcom_lock_args()
5615 if (!lkb->lkb_lvbptr) in receive_rcom_lock_args()
5616 return -ENOMEM; in receive_rcom_lock_args()
5617 memcpy(lkb->lkb_lvbptr, rl->rl_lvb, lvblen); in receive_rcom_lock_args()
5624 if (rl->rl_wait_type == cpu_to_le16(DLM_MSG_CONVERT) && in receive_rcom_lock_args()
5626 rl->rl_status = DLM_LKSTS_CONVERT; in receive_rcom_lock_args()
5627 lkb->lkb_grmode = DLM_LOCK_IV; in receive_rcom_lock_args()
5643 struct rcom_lock *rl = (struct rcom_lock *) rc->rc_buf; in dlm_recover_master_copy()
5647 int from_nodeid = rc->rc_header.h_nodeid; in dlm_recover_master_copy()
5650 if (rl->rl_parent_lkid) { in dlm_recover_master_copy()
5651 error = -EOPNOTSUPP; in dlm_recover_master_copy()
5655 remid = le32_to_cpu(rl->rl_lkid); in dlm_recover_master_copy()
5659 recovery of locks on another node, so one node can send us MSTCPY in dlm_recover_master_copy()
5665 error = find_rsb(ls, rl->rl_name, le16_to_cpu(rl->rl_namelen), in dlm_recover_master_copy()
5675 error = -EBADR; in dlm_recover_master_copy()
5681 error = -EEXIST; in dlm_recover_master_copy()
5696 add_lkb(r, lkb, rl->rl_status); in dlm_recover_master_copy()
5698 ls->ls_recover_locks_in++; in dlm_recover_master_copy()
5700 if (!list_empty(&r->res_waitqueue) || !list_empty(&r->res_convertqueue)) in dlm_recover_master_copy()
5705 saving in its process-copy lkb */ in dlm_recover_master_copy()
5706 rl->rl_remid = cpu_to_le32(lkb->lkb_id); in dlm_recover_master_copy()
5708 lkb->lkb_recover_seq = ls->ls_recover_seq; in dlm_recover_master_copy()
5714 if (error && error != -EEXIST) in dlm_recover_master_copy()
5717 rl->rl_result = cpu_to_le32(error); in dlm_recover_master_copy()
5724 struct rcom_lock *rl = (struct rcom_lock *) rc->rc_buf; in dlm_recover_process_copy()
5730 lkid = le32_to_cpu(rl->rl_lkid); in dlm_recover_process_copy()
5731 remid = le32_to_cpu(rl->rl_remid); in dlm_recover_process_copy()
5732 result = le32_to_cpu(rl->rl_result); in dlm_recover_process_copy()
5737 lkid, rc->rc_header.h_nodeid, remid, result); in dlm_recover_process_copy()
5741 r = lkb->lkb_resource; in dlm_recover_process_copy()
5747 lkid, rc->rc_header.h_nodeid, remid, result); in dlm_recover_process_copy()
5752 return -EINVAL; in dlm_recover_process_copy()
5756 case -EBADR: in dlm_recover_process_copy()
5762 lkid, rc->rc_header.h_nodeid, remid, result); in dlm_recover_process_copy()
5766 case -EEXIST: in dlm_recover_process_copy()
5768 lkb->lkb_remid = remid; in dlm_recover_process_copy()
5772 lkid, rc->rc_header.h_nodeid, remid, result); in dlm_recover_process_copy()
5803 ua->lksb.sb_lvbptr = kzalloc(DLM_USER_LVB_LEN, GFP_NOFS); in dlm_user_request()
5804 if (!ua->lksb.sb_lvbptr) { in dlm_user_request()
5807 error = -ENOMEM; in dlm_user_request()
5811 error = set_lock_args(mode, &ua->lksb, flags, namelen, timeout_cs, in dlm_user_request()
5814 kfree(ua->lksb.sb_lvbptr); in dlm_user_request()
5815 ua->lksb.sb_lvbptr = NULL; in dlm_user_request()
5824 lkb->lkb_flags |= DLM_IFL_USER; in dlm_user_request()
5830 case -EINPROGRESS: in dlm_user_request()
5833 case -EAGAIN: in dlm_user_request()
5841 /* add this new lkb to the per-process list of locks */ in dlm_user_request()
5842 spin_lock(&ua->proc->locks_spin); in dlm_user_request()
5844 list_add_tail(&lkb->lkb_ownqueue, &ua->proc->locks); in dlm_user_request()
5845 spin_unlock(&ua->proc->locks_spin); in dlm_user_request()
5869 ua = lkb->lkb_ua; in dlm_user_convert()
5871 if (flags & DLM_LKF_VALBLK && !ua->lksb.sb_lvbptr) { in dlm_user_convert()
5872 ua->lksb.sb_lvbptr = kzalloc(DLM_USER_LVB_LEN, GFP_NOFS); in dlm_user_convert()
5873 if (!ua->lksb.sb_lvbptr) { in dlm_user_convert()
5874 error = -ENOMEM; in dlm_user_convert()
5878 if (lvb_in && ua->lksb.sb_lvbptr) in dlm_user_convert()
5879 memcpy(ua->lksb.sb_lvbptr, lvb_in, DLM_USER_LVB_LEN); in dlm_user_convert()
5881 ua->xid = ua_tmp->xid; in dlm_user_convert()
5882 ua->castparam = ua_tmp->castparam; in dlm_user_convert()
5883 ua->castaddr = ua_tmp->castaddr; in dlm_user_convert()
5884 ua->bastparam = ua_tmp->bastparam; in dlm_user_convert()
5885 ua->bastaddr = ua_tmp->bastaddr; in dlm_user_convert()
5886 ua->user_lksb = ua_tmp->user_lksb; in dlm_user_convert()
5888 error = set_lock_args(mode, &ua->lksb, flags, 0, timeout_cs, in dlm_user_convert()
5895 if (error == -EINPROGRESS || error == -EAGAIN || error == -EDEADLK) in dlm_user_convert()
5920 mutex_lock(&ls->ls_orphans_mutex); in dlm_user_adopt_orphan()
5921 list_for_each_entry(iter, &ls->ls_orphans, lkb_ownqueue) { in dlm_user_adopt_orphan()
5922 if (iter->lkb_resource->res_length != namelen) in dlm_user_adopt_orphan()
5924 if (memcmp(iter->lkb_resource->res_name, name, namelen)) in dlm_user_adopt_orphan()
5926 if (iter->lkb_grmode != mode) { in dlm_user_adopt_orphan()
5932 list_del_init(&iter->lkb_ownqueue); in dlm_user_adopt_orphan()
5933 iter->lkb_flags &= ~DLM_IFL_ORPHAN; in dlm_user_adopt_orphan()
5934 *lkid = iter->lkb_id; in dlm_user_adopt_orphan()
5937 mutex_unlock(&ls->ls_orphans_mutex); in dlm_user_adopt_orphan()
5940 rv = -EAGAIN; in dlm_user_adopt_orphan()
5945 rv = -ENOENT; in dlm_user_adopt_orphan()
5949 lkb->lkb_exflags = flags; in dlm_user_adopt_orphan()
5950 lkb->lkb_ownpid = (int) current->pid; in dlm_user_adopt_orphan()
5952 ua = lkb->lkb_ua; in dlm_user_adopt_orphan()
5954 ua->proc = ua_tmp->proc; in dlm_user_adopt_orphan()
5955 ua->xid = ua_tmp->xid; in dlm_user_adopt_orphan()
5956 ua->castparam = ua_tmp->castparam; in dlm_user_adopt_orphan()
5957 ua->castaddr = ua_tmp->castaddr; in dlm_user_adopt_orphan()
5958 ua->bastparam = ua_tmp->bastparam; in dlm_user_adopt_orphan()
5959 ua->bastaddr = ua_tmp->bastaddr; in dlm_user_adopt_orphan()
5960 ua->user_lksb = ua_tmp->user_lksb; in dlm_user_adopt_orphan()
5968 spin_lock(&ua->proc->locks_spin); in dlm_user_adopt_orphan()
5969 list_add_tail(&lkb->lkb_ownqueue, &ua->proc->locks); in dlm_user_adopt_orphan()
5970 spin_unlock(&ua->proc->locks_spin); in dlm_user_adopt_orphan()
5990 ua = lkb->lkb_ua; in dlm_user_unlock()
5992 if (lvb_in && ua->lksb.sb_lvbptr) in dlm_user_unlock()
5993 memcpy(ua->lksb.sb_lvbptr, lvb_in, DLM_USER_LVB_LEN); in dlm_user_unlock()
5994 if (ua_tmp->castparam) in dlm_user_unlock()
5995 ua->castparam = ua_tmp->castparam; in dlm_user_unlock()
5996 ua->user_lksb = ua_tmp->user_lksb; in dlm_user_unlock()
6004 if (error == -DLM_EUNLOCK) in dlm_user_unlock()
6007 if (error == -EBUSY && (flags & DLM_LKF_FORCEUNLOCK)) in dlm_user_unlock()
6012 spin_lock(&ua->proc->locks_spin); in dlm_user_unlock()
6014 if (!list_empty(&lkb->lkb_ownqueue)) in dlm_user_unlock()
6015 list_move(&lkb->lkb_ownqueue, &ua->proc->unlocking); in dlm_user_unlock()
6016 spin_unlock(&ua->proc->locks_spin); in dlm_user_unlock()
6039 ua = lkb->lkb_ua; in dlm_user_cancel()
6040 if (ua_tmp->castparam) in dlm_user_cancel()
6041 ua->castparam = ua_tmp->castparam; in dlm_user_cancel()
6042 ua->user_lksb = ua_tmp->user_lksb; in dlm_user_cancel()
6050 if (error == -DLM_ECANCEL) in dlm_user_cancel()
6053 if (error == -EBUSY) in dlm_user_cancel()
6077 ua = lkb->lkb_ua; in dlm_user_deadlock()
6085 r = lkb->lkb_resource; in dlm_user_deadlock()
6092 lkb->lkb_flags |= DLM_IFL_DEADLOCK_CANCEL; in dlm_user_deadlock()
6099 if (error == -DLM_ECANCEL) in dlm_user_deadlock()
6102 if (error == -EBUSY) in dlm_user_deadlock()
6120 mutex_lock(&ls->ls_orphans_mutex); in orphan_proc_lock()
6121 list_add_tail(&lkb->lkb_ownqueue, &ls->ls_orphans); in orphan_proc_lock()
6122 mutex_unlock(&ls->ls_orphans_mutex); in orphan_proc_lock()
6124 set_unlock_args(0, lkb->lkb_ua, &args); in orphan_proc_lock()
6127 if (error == -DLM_ECANCEL) in orphan_proc_lock()
6143 lkb->lkb_ua, &args); in unlock_proc_lock()
6146 if (error == -DLM_EUNLOCK) in unlock_proc_lock()
6160 mutex_lock(&ls->ls_clear_proc_locks); in del_proc_lock()
6161 if (list_empty(&proc->locks)) in del_proc_lock()
6164 lkb = list_entry(proc->locks.next, struct dlm_lkb, lkb_ownqueue); in del_proc_lock()
6165 list_del_init(&lkb->lkb_ownqueue); in del_proc_lock()
6167 if (lkb->lkb_exflags & DLM_LKF_PERSISTENT) in del_proc_lock()
6168 lkb->lkb_flags |= DLM_IFL_ORPHAN; in del_proc_lock()
6170 lkb->lkb_flags |= DLM_IFL_DEAD; in del_proc_lock()
6172 mutex_unlock(&ls->ls_clear_proc_locks); in del_proc_lock()
6177 1) references lkb->ua which we free here and 2) adds lkbs to proc->asts,
6180 /* proc CLOSING flag is set so no more device_reads should look at proc->asts
6181 list, and no more device_writes should add lkb's to proc->locks list; so we
6183 device reads/writes/closes are serialized -- FIXME: we may need to serialize
6197 if (lkb->lkb_exflags & DLM_LKF_PERSISTENT) in dlm_clear_proc_locks()
6202 /* this removes the reference for the proc->locks list in dlm_clear_proc_locks()
6209 mutex_lock(&ls->ls_clear_proc_locks); in dlm_clear_proc_locks()
6211 /* in-progress unlocks */ in dlm_clear_proc_locks()
6212 list_for_each_entry_safe(lkb, safe, &proc->unlocking, lkb_ownqueue) { in dlm_clear_proc_locks()
6213 list_del_init(&lkb->lkb_ownqueue); in dlm_clear_proc_locks()
6214 lkb->lkb_flags |= DLM_IFL_DEAD; in dlm_clear_proc_locks()
6218 list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_cb_list) { in dlm_clear_proc_locks()
6219 memset(&lkb->lkb_callbacks, 0, in dlm_clear_proc_locks()
6221 list_del_init(&lkb->lkb_cb_list); in dlm_clear_proc_locks()
6225 mutex_unlock(&ls->ls_clear_proc_locks); in dlm_clear_proc_locks()
6235 spin_lock(&proc->locks_spin); in purge_proc_locks()
6236 if (!list_empty(&proc->locks)) { in purge_proc_locks()
6237 lkb = list_entry(proc->locks.next, struct dlm_lkb, in purge_proc_locks()
6239 list_del_init(&lkb->lkb_ownqueue); in purge_proc_locks()
6241 spin_unlock(&proc->locks_spin); in purge_proc_locks()
6246 lkb->lkb_flags |= DLM_IFL_DEAD; in purge_proc_locks()
6248 dlm_put_lkb(lkb); /* ref from proc->locks list */ in purge_proc_locks()
6251 spin_lock(&proc->locks_spin); in purge_proc_locks()
6252 list_for_each_entry_safe(lkb, safe, &proc->unlocking, lkb_ownqueue) { in purge_proc_locks()
6253 list_del_init(&lkb->lkb_ownqueue); in purge_proc_locks()
6254 lkb->lkb_flags |= DLM_IFL_DEAD; in purge_proc_locks()
6257 spin_unlock(&proc->locks_spin); in purge_proc_locks()
6259 spin_lock(&proc->asts_spin); in purge_proc_locks()
6260 list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_cb_list) { in purge_proc_locks()
6261 memset(&lkb->lkb_callbacks, 0, in purge_proc_locks()
6263 list_del_init(&lkb->lkb_cb_list); in purge_proc_locks()
6266 spin_unlock(&proc->asts_spin); in purge_proc_locks()
6275 mutex_lock(&ls->ls_orphans_mutex); in do_purge()
6276 list_for_each_entry_safe(lkb, safe, &ls->ls_orphans, lkb_ownqueue) { in do_purge()
6277 if (pid && lkb->lkb_ownpid != pid) in do_purge()
6280 list_del_init(&lkb->lkb_ownqueue); in do_purge()
6283 mutex_unlock(&ls->ls_orphans_mutex); in do_purge()
6296 ms->m_nodeid = nodeid; in send_purge()
6297 ms->m_pid = pid; in send_purge()
6311 if (pid == current->pid) in dlm_user_purge()