Lines Matching refs:dlm

55 static void dlm_mle_node_down(struct dlm_ctxt *dlm,
59 static void dlm_mle_node_up(struct dlm_ctxt *dlm,
65 static int dlm_do_assert_master(struct dlm_ctxt *dlm,
70 static inline int dlm_mle_equal(struct dlm_ctxt *dlm, in dlm_mle_equal() argument
75 if (dlm != mle->dlm) in dlm_mle_equal()
92 struct dlm_ctxt *dlm,
98 static int dlm_find_mle(struct dlm_ctxt *dlm,
106 static int dlm_wait_for_lock_mastery(struct dlm_ctxt *dlm,
110 static int dlm_restart_lock_mastery(struct dlm_ctxt *dlm,
114 static int dlm_add_migration_mle(struct dlm_ctxt *dlm,
121 static u8 dlm_pick_migration_target(struct dlm_ctxt *dlm,
123 static void dlm_remove_nonlocal_locks(struct dlm_ctxt *dlm,
125 static int dlm_mark_lockres_migrating(struct dlm_ctxt *dlm,
128 static int dlm_pre_master_reco_lockres(struct dlm_ctxt *dlm,
178 static inline void __dlm_mle_attach_hb_events(struct dlm_ctxt *dlm, in __dlm_mle_attach_hb_events() argument
181 assert_spin_locked(&dlm->spinlock); in __dlm_mle_attach_hb_events()
183 list_add_tail(&mle->hb_events, &dlm->mle_hb_events); in __dlm_mle_attach_hb_events()
187 static inline void __dlm_mle_detach_hb_events(struct dlm_ctxt *dlm, in __dlm_mle_detach_hb_events() argument
195 static inline void dlm_mle_detach_hb_events(struct dlm_ctxt *dlm, in dlm_mle_detach_hb_events() argument
198 spin_lock(&dlm->spinlock); in dlm_mle_detach_hb_events()
199 __dlm_mle_detach_hb_events(dlm, mle); in dlm_mle_detach_hb_events()
200 spin_unlock(&dlm->spinlock); in dlm_mle_detach_hb_events()
205 struct dlm_ctxt *dlm; in dlm_get_mle_inuse() local
206 dlm = mle->dlm; in dlm_get_mle_inuse()
208 assert_spin_locked(&dlm->spinlock); in dlm_get_mle_inuse()
209 assert_spin_locked(&dlm->master_lock); in dlm_get_mle_inuse()
216 struct dlm_ctxt *dlm; in dlm_put_mle_inuse() local
217 dlm = mle->dlm; in dlm_put_mle_inuse()
219 spin_lock(&dlm->spinlock); in dlm_put_mle_inuse()
220 spin_lock(&dlm->master_lock); in dlm_put_mle_inuse()
223 spin_unlock(&dlm->master_lock); in dlm_put_mle_inuse()
224 spin_unlock(&dlm->spinlock); in dlm_put_mle_inuse()
231 struct dlm_ctxt *dlm; in __dlm_put_mle() local
232 dlm = mle->dlm; in __dlm_put_mle()
234 assert_spin_locked(&dlm->spinlock); in __dlm_put_mle()
235 assert_spin_locked(&dlm->master_lock); in __dlm_put_mle()
250 struct dlm_ctxt *dlm; in dlm_put_mle() local
251 dlm = mle->dlm; in dlm_put_mle()
253 spin_lock(&dlm->spinlock); in dlm_put_mle()
254 spin_lock(&dlm->master_lock); in dlm_put_mle()
256 spin_unlock(&dlm->master_lock); in dlm_put_mle()
257 spin_unlock(&dlm->spinlock); in dlm_put_mle()
267 struct dlm_ctxt *dlm, in dlm_init_mle() argument
272 assert_spin_locked(&dlm->spinlock); in dlm_init_mle()
274 mle->dlm = dlm; in dlm_init_mle()
306 atomic_inc(&dlm->mle_tot_count[mle->type]); in dlm_init_mle()
307 atomic_inc(&dlm->mle_cur_count[mle->type]); in dlm_init_mle()
310 memcpy(mle->node_map, dlm->domain_map, sizeof(mle->node_map)); in dlm_init_mle()
311 memcpy(mle->vote_map, dlm->domain_map, sizeof(mle->vote_map)); in dlm_init_mle()
312 clear_bit(dlm->node_num, mle->vote_map); in dlm_init_mle()
313 clear_bit(dlm->node_num, mle->node_map); in dlm_init_mle()
316 __dlm_mle_attach_hb_events(dlm, mle); in dlm_init_mle()
319 void __dlm_unlink_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle) in __dlm_unlink_mle() argument
321 assert_spin_locked(&dlm->spinlock); in __dlm_unlink_mle()
322 assert_spin_locked(&dlm->master_lock); in __dlm_unlink_mle()
328 void __dlm_insert_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle) in __dlm_insert_mle() argument
332 assert_spin_locked(&dlm->master_lock); in __dlm_insert_mle()
334 bucket = dlm_master_hash(dlm, mle->mnamehash); in __dlm_insert_mle()
339 static int dlm_find_mle(struct dlm_ctxt *dlm, in dlm_find_mle() argument
347 assert_spin_locked(&dlm->master_lock); in dlm_find_mle()
350 bucket = dlm_master_hash(dlm, hash); in dlm_find_mle()
352 if (!dlm_mle_equal(dlm, tmpmle, name, namelen)) in dlm_find_mle()
361 void dlm_hb_event_notify_attached(struct dlm_ctxt *dlm, int idx, int node_up) in dlm_hb_event_notify_attached() argument
365 assert_spin_locked(&dlm->spinlock); in dlm_hb_event_notify_attached()
367 list_for_each_entry(mle, &dlm->mle_hb_events, hb_events) { in dlm_hb_event_notify_attached()
369 dlm_mle_node_up(dlm, mle, NULL, idx); in dlm_hb_event_notify_attached()
371 dlm_mle_node_down(dlm, mle, NULL, idx); in dlm_hb_event_notify_attached()
375 static void dlm_mle_node_down(struct dlm_ctxt *dlm, in dlm_mle_node_down() argument
389 static void dlm_mle_node_up(struct dlm_ctxt *dlm, in dlm_mle_node_up() argument
423 struct dlm_ctxt *dlm; in dlm_mle_release() local
426 dlm = mle->dlm; in dlm_mle_release()
428 assert_spin_locked(&dlm->spinlock); in dlm_mle_release()
429 assert_spin_locked(&dlm->master_lock); in dlm_mle_release()
435 __dlm_unlink_mle(dlm, mle); in dlm_mle_release()
438 __dlm_mle_detach_hb_events(dlm, mle); in dlm_mle_release()
440 atomic_dec(&dlm->mle_cur_count[mle->type]); in dlm_mle_release()
484 struct dlm_ctxt *dlm; in dlm_lockres_release() local
487 dlm = res->dlm; in dlm_lockres_release()
496 atomic_dec(&dlm->res_cur_count); in dlm_lockres_release()
540 static void dlm_init_lockres(struct dlm_ctxt *dlm, in dlm_init_lockres() argument
571 res->dlm = dlm; in dlm_init_lockres()
575 atomic_inc(&dlm->res_tot_count); in dlm_init_lockres()
576 atomic_inc(&dlm->res_cur_count); in dlm_init_lockres()
580 dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_init_lockres()
587 spin_lock(&dlm->track_lock); in dlm_init_lockres()
588 list_add_tail(&res->tracking, &dlm->tracking_list); in dlm_init_lockres()
589 spin_unlock(&dlm->track_lock); in dlm_init_lockres()
595 struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm, in dlm_new_lockres() argument
609 dlm_init_lockres(dlm, res, name, namelen); in dlm_new_lockres()
618 void dlm_lockres_set_refmap_bit(struct dlm_ctxt *dlm, in dlm_lockres_set_refmap_bit() argument
629 void dlm_lockres_clear_refmap_bit(struct dlm_ctxt *dlm, in dlm_lockres_clear_refmap_bit() argument
640 static void __dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, in __dlm_lockres_grab_inflight_ref() argument
645 mlog(0, "%s: res %.*s, inflight++: now %u, %ps()\n", dlm->name, in __dlm_lockres_grab_inflight_ref()
650 void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, in dlm_lockres_grab_inflight_ref() argument
654 __dlm_lockres_grab_inflight_ref(dlm, res); in dlm_lockres_grab_inflight_ref()
657 void dlm_lockres_drop_inflight_ref(struct dlm_ctxt *dlm, in dlm_lockres_drop_inflight_ref() argument
666 mlog(0, "%s: res %.*s, inflight--: now %u, %ps()\n", dlm->name, in dlm_lockres_drop_inflight_ref()
673 void __dlm_lockres_grab_inflight_worker(struct dlm_ctxt *dlm, in __dlm_lockres_grab_inflight_worker() argument
679 dlm->name, res->lockname.len, res->lockname.name, in __dlm_lockres_grab_inflight_worker()
683 static void __dlm_lockres_drop_inflight_worker(struct dlm_ctxt *dlm, in __dlm_lockres_drop_inflight_worker() argument
690 dlm->name, res->lockname.len, res->lockname.name, in __dlm_lockres_drop_inflight_worker()
694 static void dlm_lockres_drop_inflight_worker(struct dlm_ctxt *dlm, in dlm_lockres_drop_inflight_worker() argument
698 __dlm_lockres_drop_inflight_worker(dlm, res); in dlm_lockres_drop_inflight_worker()
718 struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm, in dlm_get_lock_resource() argument
740 spin_lock(&dlm->spinlock); in dlm_get_lock_resource()
741 tmpres = __dlm_lookup_lockres_full(dlm, lockid, namelen, hash); in dlm_get_lock_resource()
743 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
770 BUG_ON(tmpres->owner == dlm->node_num); in dlm_get_lock_resource()
780 dlm_lockres_grab_inflight_ref(dlm, tmpres); in dlm_get_lock_resource()
784 spin_lock(&dlm->track_lock); in dlm_get_lock_resource()
792 spin_unlock(&dlm->track_lock); in dlm_get_lock_resource()
800 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
806 res = dlm_new_lockres(dlm, lockid, namelen); in dlm_get_lock_resource()
818 dlm_change_lockres_owner(dlm, res, dlm->node_num); in dlm_get_lock_resource()
819 __dlm_insert_lockres(dlm, res); in dlm_get_lock_resource()
820 dlm_lockres_grab_inflight_ref(dlm, res); in dlm_get_lock_resource()
822 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
828 spin_lock(&dlm->master_lock); in dlm_get_lock_resource()
831 blocked = dlm_find_mle(dlm, &mle, (char *)lockid, namelen); in dlm_get_lock_resource()
848 BUG_ON(mig && mle->master == dlm->node_num); in dlm_get_lock_resource()
852 dlm->name, namelen, lockid, in dlm_get_lock_resource()
854 spin_unlock(&dlm->master_lock); in dlm_get_lock_resource()
855 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
859 dlm_mle_detach_hb_events(dlm, mle); in dlm_get_lock_resource()
873 dlm_init_mle(mle, DLM_MLE_MASTER, dlm, res, NULL, 0); in dlm_get_lock_resource()
874 set_bit(dlm->node_num, mle->maybe_map); in dlm_get_lock_resource()
875 __dlm_insert_mle(dlm, mle); in dlm_get_lock_resource()
881 bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0); in dlm_get_lock_resource()
885 dlm->name, namelen, (char *)lockid, bit); in dlm_get_lock_resource()
896 __dlm_insert_lockres(dlm, res); in dlm_get_lock_resource()
899 __dlm_lockres_grab_inflight_ref(dlm, res); in dlm_get_lock_resource()
906 spin_unlock(&dlm->master_lock); in dlm_get_lock_resource()
907 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
916 "master $RECOVERY lock now\n", dlm->name); in dlm_get_lock_resource()
917 if (!dlm_pre_master_reco_lockres(dlm, res)) in dlm_get_lock_resource()
921 "change\n", dlm->name); in dlm_get_lock_resource()
927 dlm_kick_recovery_thread(dlm); in dlm_get_lock_resource()
929 dlm_wait_for_recovery(dlm); in dlm_get_lock_resource()
931 spin_lock(&dlm->spinlock); in dlm_get_lock_resource()
932 bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0); in dlm_get_lock_resource()
936 dlm->name, namelen, (char *)lockid, bit); in dlm_get_lock_resource()
940 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
943 dlm_wait_for_node_recovery(dlm, bit, 10000); in dlm_get_lock_resource()
965 "master is %u, keep going\n", dlm->name, namelen, in dlm_get_lock_resource()
972 ret = dlm_wait_for_lock_mastery(dlm, res, mle, &blocked); in dlm_get_lock_resource()
976 "request now, blocked=%d\n", dlm->name, res->lockname.len, in dlm_get_lock_resource()
981 dlm->name, res->lockname.len, in dlm_get_lock_resource()
990 mlog(0, "%s: res %.*s, Mastered by %u\n", dlm->name, res->lockname.len, in dlm_get_lock_resource()
996 dlm_mle_detach_hb_events(dlm, mle); in dlm_get_lock_resource()
1018 static int dlm_wait_for_lock_mastery(struct dlm_ctxt *dlm, in dlm_wait_for_lock_mastery() argument
1035 mlog(0, "%s:%.*s: owner is suddenly %u\n", dlm->name, in dlm_wait_for_lock_mastery()
1040 if (res->owner != dlm->node_num) { in dlm_wait_for_lock_mastery()
1065 dlm->name, res->lockname.len, res->lockname.name); in dlm_wait_for_lock_mastery()
1066 ret = dlm_restart_lock_mastery(dlm, res, mle, *blocked); in dlm_wait_for_lock_mastery()
1070 dlm->name, res->lockname.len, res->lockname.name, in dlm_wait_for_lock_mastery()
1080 "rechecking now\n", dlm->name, res->lockname.len, in dlm_wait_for_lock_mastery()
1086 "for %s:%.*s\n", dlm->name, res->lockname.len, in dlm_wait_for_lock_mastery()
1100 if (dlm->node_num <= bit) { in dlm_wait_for_lock_mastery()
1104 mle->master = dlm->node_num; in dlm_wait_for_lock_mastery()
1125 mlog(0, "%s:%.*s: waiting again\n", dlm->name, in dlm_wait_for_lock_mastery()
1136 m = dlm->node_num; in dlm_wait_for_lock_mastery()
1139 ret = dlm_do_assert_master(dlm, res, mle->vote_map, 0); in dlm_wait_for_lock_mastery()
1157 dlm_change_lockres_owner(dlm, res, m); in dlm_wait_for_lock_mastery()
1223 static int dlm_restart_lock_mastery(struct dlm_ctxt *dlm, in dlm_restart_lock_mastery() argument
1270 "now\n", dlm->name, in dlm_restart_lock_mastery()
1286 dlm->name, in dlm_restart_lock_mastery()
1304 set_bit(dlm->node_num, mle->maybe_map); in dlm_restart_lock_mastery()
1326 struct dlm_ctxt *dlm = mle->dlm; in dlm_do_master_request() local
1331 request.node_idx = dlm->node_num; in dlm_do_master_request()
1339 ret = o2net_send_message(DLM_MASTER_REQUEST_MSG, dlm->key, &request, in dlm_do_master_request()
1375 "reference\n", dlm->name, res->lockname.len, in dlm_do_master_request()
1421 struct dlm_ctxt *dlm = data; in dlm_master_request_handler() local
1432 if (!dlm_grab(dlm)) in dlm_master_request_handler()
1435 if (!dlm_domain_fully_joined(dlm)) { in dlm_master_request_handler()
1450 spin_lock(&dlm->spinlock); in dlm_master_request_handler()
1451 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_master_request_handler()
1453 spin_unlock(&dlm->spinlock); in dlm_master_request_handler()
1480 if (res->owner == dlm->node_num) { in dlm_master_request_handler()
1481 dlm_lockres_set_refmap_bit(dlm, res, request->node_idx); in dlm_master_request_handler()
1514 spin_lock(&dlm->master_lock); in dlm_master_request_handler()
1515 found = dlm_find_mle(dlm, &tmpmle, name, namelen); in dlm_master_request_handler()
1529 if (tmpmle->master == dlm->node_num) { in dlm_master_request_handler()
1540 if (tmpmle->master == dlm->node_num) { in dlm_master_request_handler()
1546 dlm_lockres_set_refmap_bit(dlm, res, in dlm_master_request_handler()
1559 spin_unlock(&dlm->master_lock); in dlm_master_request_handler()
1575 spin_lock(&dlm->master_lock); in dlm_master_request_handler()
1576 found = dlm_find_mle(dlm, &tmpmle, name, namelen); in dlm_master_request_handler()
1581 spin_unlock(&dlm->master_lock); in dlm_master_request_handler()
1582 spin_unlock(&dlm->spinlock); in dlm_master_request_handler()
1595 dlm_init_mle(mle, DLM_MLE_BLOCK, dlm, NULL, name, namelen); in dlm_master_request_handler()
1597 __dlm_insert_mle(dlm, mle); in dlm_master_request_handler()
1601 if (tmpmle->master == dlm->node_num) { in dlm_master_request_handler()
1617 spin_unlock(&dlm->master_lock); in dlm_master_request_handler()
1618 spin_unlock(&dlm->spinlock); in dlm_master_request_handler()
1633 dlm->node_num, res->lockname.len, res->lockname.name); in dlm_master_request_handler()
1635 ret = dlm_dispatch_assert_master(dlm, res, 0, request->node_idx, in dlm_master_request_handler()
1644 __dlm_lockres_grab_inflight_worker(dlm, res); in dlm_master_request_handler()
1653 dlm_put(dlm); in dlm_master_request_handler()
1667 static int dlm_do_assert_master(struct dlm_ctxt *dlm, in dlm_do_assert_master() argument
1697 assert.node_idx = dlm->node_num; in dlm_do_assert_master()
1702 tmpret = o2net_send_message(DLM_ASSERT_MASTER_MSG, dlm->key, in dlm_do_assert_master()
1707 DLM_ASSERT_MASTER_MSG, dlm->key, to); in dlm_do_assert_master()
1721 spin_lock(&dlm->spinlock); in dlm_do_assert_master()
1722 spin_lock(&dlm->master_lock); in dlm_do_assert_master()
1723 if (dlm_find_mle(dlm, &mle, (char *)lockname, in dlm_do_assert_master()
1728 spin_unlock(&dlm->master_lock); in dlm_do_assert_master()
1729 spin_unlock(&dlm->spinlock); in dlm_do_assert_master()
1751 dlm_lockres_set_refmap_bit(dlm, res, to); in dlm_do_assert_master()
1779 struct dlm_ctxt *dlm = data; in dlm_assert_master_handler() local
1789 if (!dlm_grab(dlm)) in dlm_assert_master_handler()
1802 spin_lock(&dlm->spinlock); in dlm_assert_master_handler()
1808 spin_lock(&dlm->master_lock); in dlm_assert_master_handler()
1809 if (!dlm_find_mle(dlm, &mle, name, namelen)) { in dlm_assert_master_handler()
1842 dlm->name, namelen, name, in dlm_assert_master_handler()
1847 dlm->name, namelen, name, in dlm_assert_master_handler()
1850 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
1851 spin_unlock(&dlm->spinlock); in dlm_assert_master_handler()
1856 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
1860 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_assert_master_handler()
1933 if (nn != dlm->node_num && nn != assert->node_idx) { in dlm_assert_master_handler()
1951 dlm->node_num, mle->new_master); in dlm_assert_master_handler()
1954 dlm_change_lockres_owner(dlm, res, mle->new_master); in dlm_assert_master_handler()
1957 dlm_change_lockres_owner(dlm, res, mle->master); in dlm_assert_master_handler()
1968 spin_lock(&dlm->master_lock); in dlm_assert_master_handler()
1985 "inuse=%d\n", dlm->name, namelen, name, in dlm_assert_master_handler()
1989 __dlm_unlink_mle(dlm, mle); in dlm_assert_master_handler()
1990 __dlm_mle_detach_hb_events(dlm, mle); in dlm_assert_master_handler()
1999 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
2007 spin_unlock(&dlm->spinlock); in dlm_assert_master_handler()
2017 dlm_put(dlm); in dlm_assert_master_handler()
2025 assert->node_idx, dlm->name, namelen, name); in dlm_assert_master_handler()
2032 dlm->name, namelen, name, assert->node_idx); in dlm_assert_master_handler()
2042 spin_lock(&dlm->master_lock); in dlm_assert_master_handler()
2045 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
2046 spin_unlock(&dlm->spinlock); in dlm_assert_master_handler()
2048 dlm_put(dlm); in dlm_assert_master_handler()
2066 int dlm_dispatch_assert_master(struct dlm_ctxt *dlm, in dlm_dispatch_assert_master() argument
2077 dlm_init_work_item(dlm, item, dlm_assert_master_worker, NULL); in dlm_dispatch_assert_master()
2088 spin_lock(&dlm->work_lock); in dlm_dispatch_assert_master()
2089 list_add_tail(&item->list, &dlm->work_list); in dlm_dispatch_assert_master()
2090 spin_unlock(&dlm->work_lock); in dlm_dispatch_assert_master()
2092 queue_work(dlm->dlm_worker, &dlm->dispatched_work); in dlm_dispatch_assert_master()
2098 struct dlm_ctxt *dlm = data; in dlm_assert_master_worker() local
2107 dlm = item->dlm; in dlm_assert_master_worker()
2113 spin_lock(&dlm->spinlock); in dlm_assert_master_worker()
2114 memcpy(nodemap, dlm->domain_map, sizeof(nodemap)); in dlm_assert_master_worker()
2115 spin_unlock(&dlm->spinlock); in dlm_assert_master_worker()
2117 clear_bit(dlm->node_num, nodemap); in dlm_assert_master_worker()
2123 bit = dlm->node_num; in dlm_assert_master_worker()
2153 res->lockname.len, res->lockname.name, dlm->node_num); in dlm_assert_master_worker()
2154 ret = dlm_do_assert_master(dlm, res, nodemap, flags); in dlm_assert_master_worker()
2162 dlm_lockres_release_ast(dlm, res); in dlm_assert_master_worker()
2165 dlm_lockres_drop_inflight_worker(dlm, res); in dlm_assert_master_worker()
2182 static int dlm_pre_master_reco_lockres(struct dlm_ctxt *dlm, in dlm_pre_master_reco_lockres() argument
2190 spin_lock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2191 dlm_node_iter_init(dlm->domain_map, &iter); in dlm_pre_master_reco_lockres()
2192 spin_unlock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2196 if (nodenum == dlm->node_num) in dlm_pre_master_reco_lockres()
2198 ret = dlm_do_master_requery(dlm, res, nodenum, &master); in dlm_pre_master_reco_lockres()
2210 spin_lock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2211 if (test_bit(master, dlm->recovery_map)) { in dlm_pre_master_reco_lockres()
2215 "lock. must wait.\n", dlm->name, in dlm_pre_master_reco_lockres()
2219 spin_unlock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2220 mlog(0, "%s: reco lock master is %u\n", dlm->name, in dlm_pre_master_reco_lockres()
2232 int dlm_drop_lockres_ref(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_drop_lockres_ref() argument
2244 deref.node_idx = dlm->node_num; in dlm_drop_lockres_ref()
2248 ret = o2net_send_message(DLM_DEREF_LOCKRES_MSG, dlm->key, in dlm_drop_lockres_ref()
2252 dlm->name, namelen, lockname, ret, res->owner); in dlm_drop_lockres_ref()
2256 dlm->name, namelen, lockname, res->owner, r); in dlm_drop_lockres_ref()
2269 struct dlm_ctxt *dlm = data; in dlm_deref_lockres_handler() local
2281 if (!dlm_grab(dlm)) in dlm_deref_lockres_handler()
2299 spin_lock(&dlm->spinlock); in dlm_deref_lockres_handler()
2300 res = __dlm_lookup_lockres_full(dlm, name, namelen, hash); in dlm_deref_lockres_handler()
2302 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_handler()
2304 dlm->name, namelen, name); in dlm_deref_lockres_handler()
2307 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_handler()
2315 dlm_lockres_clear_refmap_bit(dlm, res, node); in dlm_deref_lockres_handler()
2323 dlm_lockres_calc_usage(dlm, res); in dlm_deref_lockres_handler()
2326 "but it is already dropped!\n", dlm->name, in dlm_deref_lockres_handler()
2341 dlm_init_work_item(dlm, item, dlm_deref_lockres_worker, NULL); in dlm_deref_lockres_handler()
2345 spin_lock(&dlm->work_lock); in dlm_deref_lockres_handler()
2346 list_add_tail(&item->list, &dlm->work_list); in dlm_deref_lockres_handler()
2347 spin_unlock(&dlm->work_lock); in dlm_deref_lockres_handler()
2349 queue_work(dlm->dlm_worker, &dlm->dispatched_work); in dlm_deref_lockres_handler()
2355 dlm_put(dlm); in dlm_deref_lockres_handler()
2363 struct dlm_ctxt *dlm = data; in dlm_deref_lockres_done_handler() local
2373 if (!dlm_grab(dlm)) in dlm_deref_lockres_done_handler()
2391 spin_lock(&dlm->spinlock); in dlm_deref_lockres_done_handler()
2392 res = __dlm_lookup_lockres_full(dlm, name, namelen, hash); in dlm_deref_lockres_done_handler()
2394 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_done_handler()
2396 dlm->name, namelen, name); in dlm_deref_lockres_done_handler()
2403 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_done_handler()
2405 "but it is already derefed!\n", dlm->name, in dlm_deref_lockres_done_handler()
2411 __dlm_do_purge_lockres(dlm, res); in dlm_deref_lockres_done_handler()
2415 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_done_handler()
2421 dlm_put(dlm); in dlm_deref_lockres_done_handler()
2425 static void dlm_drop_lockres_ref_done(struct dlm_ctxt *dlm, in dlm_drop_lockres_ref_done() argument
2438 deref.node_idx = dlm->node_num; in dlm_drop_lockres_ref_done()
2442 ret = o2net_send_message(DLM_DEREF_LOCKRES_DONE, dlm->key, in dlm_drop_lockres_ref_done()
2446 " to node %u\n", dlm->name, namelen, in dlm_drop_lockres_ref_done()
2451 dlm->name, namelen, lockname, node, r); in dlm_drop_lockres_ref_done()
2458 struct dlm_ctxt *dlm; in dlm_deref_lockres_worker() local
2463 dlm = item->dlm; in dlm_deref_lockres_worker()
2471 dlm_lockres_clear_refmap_bit(dlm, res, node); in dlm_deref_lockres_worker()
2476 dlm_drop_lockres_ref_done(dlm, res, node); in dlm_deref_lockres_worker()
2480 dlm->name, res->lockname.len, res->lockname.name, node); in dlm_deref_lockres_worker()
2481 dlm_lockres_calc_usage(dlm, res); in dlm_deref_lockres_worker()
2484 "but it is already dropped!\n", dlm->name, in dlm_deref_lockres_worker()
2499 static int dlm_is_lockres_migratable(struct dlm_ctxt *dlm, in dlm_is_lockres_migratable() argument
2519 if (res->owner != dlm->node_num) in dlm_is_lockres_migratable()
2525 if (lock->ml.node != dlm->node_num) { in dlm_is_lockres_migratable()
2531 "%s list\n", dlm->name, res->lockname.len, in dlm_is_lockres_migratable()
2546 mlog(0, "%s: res %.*s, Migratable\n", dlm->name, res->lockname.len, in dlm_is_lockres_migratable()
2557 static int dlm_migrate_lockres(struct dlm_ctxt *dlm, in dlm_migrate_lockres() argument
2569 if (!dlm_grab(dlm)) in dlm_migrate_lockres()
2577 mlog(0, "%s: Migrating %.*s to node %u\n", dlm->name, namelen, name, in dlm_migrate_lockres()
2599 spin_lock(&dlm->spinlock); in dlm_migrate_lockres()
2600 spin_lock(&dlm->master_lock); in dlm_migrate_lockres()
2601 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle, name, in dlm_migrate_lockres()
2602 namelen, target, dlm->node_num); in dlm_migrate_lockres()
2610 spin_unlock(&dlm->master_lock); in dlm_migrate_lockres()
2611 spin_unlock(&dlm->spinlock); in dlm_migrate_lockres()
2623 if (dlm_mark_lockres_migrating(dlm, res, target) < 0) { in dlm_migrate_lockres()
2637 dlm_mle_detach_hb_events(dlm, oldmle); in dlm_migrate_lockres()
2643 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2661 flush_workqueue(dlm->dlm_worker); in dlm_migrate_lockres()
2667 ret = dlm_send_one_lockres(dlm, res, mres, target, in dlm_migrate_lockres()
2674 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2682 dlm_wait_for_node_death(dlm, target, in dlm_migrate_lockres()
2710 dlm->name, res->lockname.len, res->lockname.name); in dlm_migrate_lockres()
2713 if (dlm_is_node_dead(dlm, target)) { in dlm_migrate_lockres()
2716 dlm->name, res->lockname.len, in dlm_migrate_lockres()
2720 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2731 dlm->name, res->lockname.len, res->lockname.name); in dlm_migrate_lockres()
2736 dlm_set_lockres_owner(dlm, res, target); in dlm_migrate_lockres()
2738 dlm_remove_nonlocal_locks(dlm, res); in dlm_migrate_lockres()
2743 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2747 dlm_lockres_calc_usage(dlm, res); in dlm_migrate_lockres()
2752 dlm_kick_thread(dlm, res); in dlm_migrate_lockres()
2762 dlm_put(dlm); in dlm_migrate_lockres()
2764 mlog(0, "%s: Migrating %.*s to %u, returns %d\n", dlm->name, namelen, in dlm_migrate_lockres()
2781 int dlm_empty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_empty_lockres() argument
2787 assert_spin_locked(&dlm->spinlock); in dlm_empty_lockres()
2790 if (dlm_is_lockres_migratable(dlm, res)) in dlm_empty_lockres()
2791 target = dlm_pick_migration_target(dlm, res); in dlm_empty_lockres()
2798 spin_unlock(&dlm->spinlock); in dlm_empty_lockres()
2800 ret = dlm_migrate_lockres(dlm, res, target); in dlm_empty_lockres()
2803 dlm->name, res->lockname.len, res->lockname.name, in dlm_empty_lockres()
2805 spin_lock(&dlm->spinlock); in dlm_empty_lockres()
2810 int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock) in dlm_lock_basts_flushed() argument
2813 spin_lock(&dlm->ast_lock); in dlm_lock_basts_flushed()
2817 spin_unlock(&dlm->ast_lock); in dlm_lock_basts_flushed()
2821 static int dlm_migration_can_proceed(struct dlm_ctxt *dlm, in dlm_migration_can_proceed() argument
2832 spin_lock(&dlm->spinlock); in dlm_migration_can_proceed()
2833 if (!test_bit(mig_target, dlm->domain_map)) in dlm_migration_can_proceed()
2835 spin_unlock(&dlm->spinlock); in dlm_migration_can_proceed()
2839 static int dlm_lockres_is_dirty(struct dlm_ctxt *dlm, in dlm_lockres_is_dirty() argument
2850 static int dlm_mark_lockres_migrating(struct dlm_ctxt *dlm, in dlm_mark_lockres_migrating() argument
2857 res->lockname.len, res->lockname.name, dlm->node_num, in dlm_mark_lockres_migrating()
2870 dlm_kick_thread(dlm, res); in dlm_mark_lockres_migrating()
2878 wait_event(dlm->ast_wq, !dlm_lockres_is_dirty(dlm, res)); in dlm_mark_lockres_migrating()
2879 dlm_lockres_release_ast(dlm, res); in dlm_mark_lockres_migrating()
2887 ret = wait_event_interruptible_timeout(dlm->migration_wq, in dlm_mark_lockres_migrating()
2888 dlm_migration_can_proceed(dlm, res, target), in dlm_mark_lockres_migrating()
2893 test_bit(target, dlm->domain_map) ? "no":"yes"); in dlm_mark_lockres_migrating()
2897 test_bit(target, dlm->domain_map) ? "no":"yes"); in dlm_mark_lockres_migrating()
2899 if (!dlm_migration_can_proceed(dlm, res, target)) { in dlm_mark_lockres_migrating()
2906 spin_lock(&dlm->spinlock); in dlm_mark_lockres_migrating()
2907 if (!test_bit(target, dlm->domain_map)) { in dlm_mark_lockres_migrating()
2912 spin_unlock(&dlm->spinlock); in dlm_mark_lockres_migrating()
2942 static void dlm_remove_nonlocal_locks(struct dlm_ctxt *dlm, in dlm_remove_nonlocal_locks() argument
2951 BUG_ON(res->owner == dlm->node_num); in dlm_remove_nonlocal_locks()
2955 if (lock->ml.node != dlm->node_num) { in dlm_remove_nonlocal_locks()
2963 dlm_lockres_clear_refmap_bit(dlm, res, in dlm_remove_nonlocal_locks()
2981 if (bit != dlm->node_num) { in dlm_remove_nonlocal_locks()
2983 "migrating lockres, clearing\n", dlm->name, in dlm_remove_nonlocal_locks()
2985 dlm_lockres_clear_refmap_bit(dlm, res, bit); in dlm_remove_nonlocal_locks()
2996 static u8 dlm_pick_migration_target(struct dlm_ctxt *dlm, in dlm_pick_migration_target() argument
3005 assert_spin_locked(&dlm->spinlock); in dlm_pick_migration_target()
3012 if (lock->ml.node == dlm->node_num) in dlm_pick_migration_target()
3014 if (test_bit(lock->ml.node, dlm->exit_domain_map)) in dlm_pick_migration_target()
3028 if (noderef == dlm->node_num) in dlm_pick_migration_target()
3030 if (test_bit(noderef, dlm->exit_domain_map)) in dlm_pick_migration_target()
3042 static int dlm_do_migrate_request(struct dlm_ctxt *dlm, in dlm_do_migrate_request() argument
3066 spin_lock(&dlm->spinlock); in dlm_do_migrate_request()
3067 skip = (!test_bit(nodenum, dlm->domain_map)); in dlm_do_migrate_request()
3068 spin_unlock(&dlm->spinlock); in dlm_do_migrate_request()
3074 ret = o2net_send_message(DLM_MIGRATE_REQUEST_MSG, dlm->key, in dlm_do_migrate_request()
3079 "MIGRATE_REQUEST to node %u\n", dlm->name, in dlm_do_migrate_request()
3096 dlm->name, res->lockname.len, res->lockname.name, in dlm_do_migrate_request()
3099 dlm_lockres_set_refmap_bit(dlm, res, nodenum); in dlm_do_migrate_request()
3122 struct dlm_ctxt *dlm = data; in dlm_migrate_request_handler() local
3130 if (!dlm_grab(dlm)) in dlm_migrate_request_handler()
3146 spin_lock(&dlm->spinlock); in dlm_migrate_request_handler()
3147 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_migrate_request_handler()
3165 spin_lock(&dlm->master_lock); in dlm_migrate_request_handler()
3167 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle, in dlm_migrate_request_handler()
3175 spin_unlock(&dlm->master_lock); in dlm_migrate_request_handler()
3177 spin_unlock(&dlm->spinlock); in dlm_migrate_request_handler()
3181 dlm_mle_detach_hb_events(dlm, oldmle); in dlm_migrate_request_handler()
3188 dlm_put(dlm); in dlm_migrate_request_handler()
3199 static int dlm_add_migration_mle(struct dlm_ctxt *dlm, in dlm_add_migration_mle() argument
3211 assert_spin_locked(&dlm->spinlock); in dlm_add_migration_mle()
3212 assert_spin_locked(&dlm->master_lock); in dlm_add_migration_mle()
3215 found = dlm_find_mle(dlm, oldmle, (char *)name, namelen); in dlm_add_migration_mle()
3220 if (master == dlm->node_num) { in dlm_add_migration_mle()
3244 __dlm_unlink_mle(dlm, tmp); in dlm_add_migration_mle()
3245 __dlm_mle_detach_hb_events(dlm, tmp); in dlm_add_migration_mle()
3251 "migration\n", dlm->name, in dlm_add_migration_mle()
3260 dlm_init_mle(mle, DLM_MLE_MIGRATION, dlm, res, name, namelen); in dlm_add_migration_mle()
3267 __dlm_insert_mle(dlm, mle); in dlm_add_migration_mle()
3275 static struct dlm_lock_resource *dlm_reset_mleres_owner(struct dlm_ctxt *dlm, in dlm_reset_mleres_owner() argument
3281 res = __dlm_lookup_lockres(dlm, mle->mname, mle->mnamelen, in dlm_reset_mleres_owner()
3284 spin_unlock(&dlm->master_lock); in dlm_reset_mleres_owner()
3288 dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_reset_mleres_owner()
3289 dlm_move_lockres_to_recovery_list(dlm, res); in dlm_reset_mleres_owner()
3294 __dlm_mle_detach_hb_events(dlm, mle); in dlm_reset_mleres_owner()
3297 spin_lock(&dlm->master_lock); in dlm_reset_mleres_owner()
3299 spin_unlock(&dlm->master_lock); in dlm_reset_mleres_owner()
3305 static void dlm_clean_migration_mle(struct dlm_ctxt *dlm, in dlm_clean_migration_mle() argument
3308 __dlm_mle_detach_hb_events(dlm, mle); in dlm_clean_migration_mle()
3311 __dlm_unlink_mle(dlm, mle); in dlm_clean_migration_mle()
3318 static void dlm_clean_block_mle(struct dlm_ctxt *dlm, in dlm_clean_block_mle() argument
3342 __dlm_mle_detach_hb_events(dlm, mle); in dlm_clean_block_mle()
3347 void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node) in dlm_clean_master_list() argument
3355 mlog(0, "dlm=%s, dead node=%u\n", dlm->name, dead_node); in dlm_clean_master_list()
3357 assert_spin_locked(&dlm->spinlock); in dlm_clean_master_list()
3360 spin_lock(&dlm->master_lock); in dlm_clean_master_list()
3362 bucket = dlm_master_hash(dlm, i); in dlm_clean_master_list()
3378 dlm_clean_block_mle(dlm, mle, dead_node); in dlm_clean_master_list()
3401 dlm->name, dead_node, in dlm_clean_master_list()
3408 dlm_clean_migration_mle(dlm, mle); in dlm_clean_master_list()
3411 "%u to %u!\n", dlm->name, dead_node, mle->master, in dlm_clean_master_list()
3419 res = dlm_reset_mleres_owner(dlm, mle); in dlm_clean_master_list()
3428 spin_unlock(&dlm->master_lock); in dlm_clean_master_list()
3431 int dlm_finish_migration(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, in dlm_finish_migration() argument
3437 spin_lock(&dlm->spinlock); in dlm_finish_migration()
3438 dlm_node_iter_init(dlm->domain_map, &iter); in dlm_finish_migration()
3440 clear_bit(dlm->node_num, iter.node_map); in dlm_finish_migration()
3441 spin_unlock(&dlm->spinlock); in dlm_finish_migration()
3447 dlm_lockres_set_refmap_bit(dlm, res, old_master); in dlm_finish_migration()
3451 ret = dlm_do_migrate_request(dlm, res, old_master, in dlm_finish_migration()
3452 dlm->node_num, &iter); in dlm_finish_migration()
3462 ret = dlm_do_assert_master(dlm, res, iter.node_map, in dlm_finish_migration()
3474 ret = dlm_do_assert_master(dlm, res, iter.node_map, in dlm_finish_migration()
3486 dlm_set_lockres_owner(dlm, res, dlm->node_num); in dlm_finish_migration()
3490 dlm_kick_thread(dlm, res); in dlm_finish_migration()
3529 void dlm_lockres_release_ast(struct dlm_ctxt *dlm, in dlm_lockres_release_ast() argument
3545 wake_up(&dlm->migration_wq); in dlm_lockres_release_ast()
3548 void dlm_force_free_mles(struct dlm_ctxt *dlm) in dlm_force_free_mles() argument
3561 spin_lock(&dlm->spinlock); in dlm_force_free_mles()
3562 spin_lock(&dlm->master_lock); in dlm_force_free_mles()
3564 BUG_ON(dlm->dlm_state != DLM_CTXT_LEAVING); in dlm_force_free_mles()
3565 BUG_ON((find_next_bit(dlm->domain_map, O2NM_MAX_NODES, 0) < O2NM_MAX_NODES)); in dlm_force_free_mles()
3568 bucket = dlm_master_hash(dlm, i); in dlm_force_free_mles()
3577 __dlm_unlink_mle(dlm, mle); in dlm_force_free_mles()
3578 __dlm_mle_detach_hb_events(dlm, mle); in dlm_force_free_mles()
3582 spin_unlock(&dlm->master_lock); in dlm_force_free_mles()
3583 spin_unlock(&dlm->spinlock); in dlm_force_free_mles()