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
424 struct dlm_ctxt *dlm; in dlm_mle_release() local
427 dlm = mle->dlm; in dlm_mle_release()
429 assert_spin_locked(&dlm->spinlock); in dlm_mle_release()
430 assert_spin_locked(&dlm->master_lock); in dlm_mle_release()
436 __dlm_unlink_mle(dlm, mle); in dlm_mle_release()
439 __dlm_mle_detach_hb_events(dlm, mle); in dlm_mle_release()
441 atomic_dec(&dlm->mle_cur_count[mle->type]); in dlm_mle_release()
489 struct dlm_ctxt *dlm; in dlm_lockres_release() local
492 dlm = res->dlm; in dlm_lockres_release()
501 spin_lock(&dlm->track_lock); in dlm_lockres_release()
509 spin_unlock(&dlm->track_lock); in dlm_lockres_release()
511 atomic_dec(&dlm->res_cur_count); in dlm_lockres_release()
555 static void dlm_init_lockres(struct dlm_ctxt *dlm, in dlm_init_lockres() argument
586 res->dlm = dlm; in dlm_init_lockres()
590 atomic_inc(&dlm->res_tot_count); in dlm_init_lockres()
591 atomic_inc(&dlm->res_cur_count); in dlm_init_lockres()
595 dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_init_lockres()
602 spin_lock(&dlm->spinlock); in dlm_init_lockres()
603 list_add_tail(&res->tracking, &dlm->tracking_list); in dlm_init_lockres()
604 spin_unlock(&dlm->spinlock); in dlm_init_lockres()
610 struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm, in dlm_new_lockres() argument
624 dlm_init_lockres(dlm, res, name, namelen); in dlm_new_lockres()
633 void dlm_lockres_set_refmap_bit(struct dlm_ctxt *dlm, in dlm_lockres_set_refmap_bit() argument
644 void dlm_lockres_clear_refmap_bit(struct dlm_ctxt *dlm, in dlm_lockres_clear_refmap_bit() argument
655 static void __dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, in __dlm_lockres_grab_inflight_ref() argument
660 mlog(0, "%s: res %.*s, inflight++: now %u, %ps()\n", dlm->name, in __dlm_lockres_grab_inflight_ref()
665 void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, in dlm_lockres_grab_inflight_ref() argument
669 __dlm_lockres_grab_inflight_ref(dlm, res); in dlm_lockres_grab_inflight_ref()
672 void dlm_lockres_drop_inflight_ref(struct dlm_ctxt *dlm, in dlm_lockres_drop_inflight_ref() argument
681 mlog(0, "%s: res %.*s, inflight--: now %u, %ps()\n", dlm->name, in dlm_lockres_drop_inflight_ref()
688 void __dlm_lockres_grab_inflight_worker(struct dlm_ctxt *dlm, in __dlm_lockres_grab_inflight_worker() argument
694 dlm->name, res->lockname.len, res->lockname.name, in __dlm_lockres_grab_inflight_worker()
698 static void __dlm_lockres_drop_inflight_worker(struct dlm_ctxt *dlm, in __dlm_lockres_drop_inflight_worker() argument
705 dlm->name, res->lockname.len, res->lockname.name, in __dlm_lockres_drop_inflight_worker()
709 static void dlm_lockres_drop_inflight_worker(struct dlm_ctxt *dlm, in dlm_lockres_drop_inflight_worker() argument
713 __dlm_lockres_drop_inflight_worker(dlm, res); in dlm_lockres_drop_inflight_worker()
733 struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm, in dlm_get_lock_resource() argument
755 spin_lock(&dlm->spinlock); in dlm_get_lock_resource()
756 tmpres = __dlm_lookup_lockres_full(dlm, lockid, namelen, hash); in dlm_get_lock_resource()
758 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
785 BUG_ON(tmpres->owner == dlm->node_num); in dlm_get_lock_resource()
795 dlm_lockres_grab_inflight_ref(dlm, tmpres); in dlm_get_lock_resource()
805 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
811 res = dlm_new_lockres(dlm, lockid, namelen); in dlm_get_lock_resource()
823 dlm_change_lockres_owner(dlm, res, dlm->node_num); in dlm_get_lock_resource()
824 __dlm_insert_lockres(dlm, res); in dlm_get_lock_resource()
825 dlm_lockres_grab_inflight_ref(dlm, res); in dlm_get_lock_resource()
827 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
833 spin_lock(&dlm->master_lock); in dlm_get_lock_resource()
836 blocked = dlm_find_mle(dlm, &mle, (char *)lockid, namelen); in dlm_get_lock_resource()
853 BUG_ON(mig && mle->master == dlm->node_num); in dlm_get_lock_resource()
857 dlm->name, namelen, lockid, in dlm_get_lock_resource()
859 spin_unlock(&dlm->master_lock); in dlm_get_lock_resource()
860 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
864 dlm_mle_detach_hb_events(dlm, mle); in dlm_get_lock_resource()
878 dlm_init_mle(mle, DLM_MLE_MASTER, dlm, res, NULL, 0); in dlm_get_lock_resource()
879 set_bit(dlm->node_num, mle->maybe_map); in dlm_get_lock_resource()
880 __dlm_insert_mle(dlm, mle); in dlm_get_lock_resource()
886 bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0); in dlm_get_lock_resource()
890 dlm->name, namelen, (char *)lockid, bit); in dlm_get_lock_resource()
901 __dlm_insert_lockres(dlm, res); in dlm_get_lock_resource()
904 __dlm_lockres_grab_inflight_ref(dlm, res); in dlm_get_lock_resource()
911 spin_unlock(&dlm->master_lock); in dlm_get_lock_resource()
912 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
921 "master $RECOVERY lock now\n", dlm->name); in dlm_get_lock_resource()
922 if (!dlm_pre_master_reco_lockres(dlm, res)) in dlm_get_lock_resource()
926 "change\n", dlm->name); in dlm_get_lock_resource()
932 dlm_kick_recovery_thread(dlm); in dlm_get_lock_resource()
934 dlm_wait_for_recovery(dlm); in dlm_get_lock_resource()
936 spin_lock(&dlm->spinlock); in dlm_get_lock_resource()
937 bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0); in dlm_get_lock_resource()
941 dlm->name, namelen, (char *)lockid, bit); in dlm_get_lock_resource()
945 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
948 dlm_wait_for_node_recovery(dlm, bit, 10000); in dlm_get_lock_resource()
970 "master is %u, keep going\n", dlm->name, namelen, in dlm_get_lock_resource()
977 ret = dlm_wait_for_lock_mastery(dlm, res, mle, &blocked); in dlm_get_lock_resource()
981 "request now, blocked=%d\n", dlm->name, res->lockname.len, in dlm_get_lock_resource()
986 dlm->name, res->lockname.len, in dlm_get_lock_resource()
995 mlog(0, "%s: res %.*s, Mastered by %u\n", dlm->name, res->lockname.len, in dlm_get_lock_resource()
1001 dlm_mle_detach_hb_events(dlm, mle); in dlm_get_lock_resource()
1023 static int dlm_wait_for_lock_mastery(struct dlm_ctxt *dlm, in dlm_wait_for_lock_mastery() argument
1040 mlog(0, "%s:%.*s: owner is suddenly %u\n", dlm->name, in dlm_wait_for_lock_mastery()
1045 if (res->owner != dlm->node_num) { in dlm_wait_for_lock_mastery()
1070 dlm->name, res->lockname.len, res->lockname.name); in dlm_wait_for_lock_mastery()
1071 ret = dlm_restart_lock_mastery(dlm, res, mle, *blocked); in dlm_wait_for_lock_mastery()
1075 dlm->name, res->lockname.len, res->lockname.name, in dlm_wait_for_lock_mastery()
1085 "rechecking now\n", dlm->name, res->lockname.len, in dlm_wait_for_lock_mastery()
1091 "for %s:%.*s\n", dlm->name, res->lockname.len, in dlm_wait_for_lock_mastery()
1105 if (dlm->node_num <= bit) { in dlm_wait_for_lock_mastery()
1109 mle->master = dlm->node_num; in dlm_wait_for_lock_mastery()
1137 mlog(0, "%s:%.*s: waiting again\n", dlm->name, in dlm_wait_for_lock_mastery()
1148 m = dlm->node_num; in dlm_wait_for_lock_mastery()
1151 ret = dlm_do_assert_master(dlm, res, mle->vote_map, 0); in dlm_wait_for_lock_mastery()
1169 dlm_change_lockres_owner(dlm, res, m); in dlm_wait_for_lock_mastery()
1235 static int dlm_restart_lock_mastery(struct dlm_ctxt *dlm, in dlm_restart_lock_mastery() argument
1282 "now\n", dlm->name, in dlm_restart_lock_mastery()
1298 dlm->name, in dlm_restart_lock_mastery()
1316 set_bit(dlm->node_num, mle->maybe_map); in dlm_restart_lock_mastery()
1338 struct dlm_ctxt *dlm = mle->dlm; in dlm_do_master_request() local
1343 request.node_idx = dlm->node_num; in dlm_do_master_request()
1351 ret = o2net_send_message(DLM_MASTER_REQUEST_MSG, dlm->key, &request, in dlm_do_master_request()
1387 "reference\n", dlm->name, res->lockname.len, in dlm_do_master_request()
1433 struct dlm_ctxt *dlm = data; in dlm_master_request_handler() local
1444 if (!dlm_grab(dlm)) in dlm_master_request_handler()
1447 if (!dlm_domain_fully_joined(dlm)) { in dlm_master_request_handler()
1462 spin_lock(&dlm->spinlock); in dlm_master_request_handler()
1463 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_master_request_handler()
1465 spin_unlock(&dlm->spinlock); in dlm_master_request_handler()
1492 if (res->owner == dlm->node_num) { in dlm_master_request_handler()
1493 dlm_lockres_set_refmap_bit(dlm, res, request->node_idx); in dlm_master_request_handler()
1526 spin_lock(&dlm->master_lock); in dlm_master_request_handler()
1527 found = dlm_find_mle(dlm, &tmpmle, name, namelen); in dlm_master_request_handler()
1541 if (tmpmle->master == dlm->node_num) { in dlm_master_request_handler()
1552 if (tmpmle->master == dlm->node_num) { in dlm_master_request_handler()
1558 dlm_lockres_set_refmap_bit(dlm, res, in dlm_master_request_handler()
1571 spin_unlock(&dlm->master_lock); in dlm_master_request_handler()
1587 spin_lock(&dlm->master_lock); in dlm_master_request_handler()
1588 found = dlm_find_mle(dlm, &tmpmle, name, namelen); in dlm_master_request_handler()
1593 spin_unlock(&dlm->master_lock); in dlm_master_request_handler()
1594 spin_unlock(&dlm->spinlock); in dlm_master_request_handler()
1607 dlm_init_mle(mle, DLM_MLE_BLOCK, dlm, NULL, name, namelen); in dlm_master_request_handler()
1609 __dlm_insert_mle(dlm, mle); in dlm_master_request_handler()
1615 if (tmpmle->master == dlm->node_num) { in dlm_master_request_handler()
1632 spin_unlock(&dlm->master_lock); in dlm_master_request_handler()
1633 spin_unlock(&dlm->spinlock); in dlm_master_request_handler()
1654 dlm->node_num, res->lockname.len, res->lockname.name); in dlm_master_request_handler()
1656 ret = dlm_dispatch_assert_master(dlm, res, 0, request->node_idx, in dlm_master_request_handler()
1664 __dlm_lockres_grab_inflight_worker(dlm, res); in dlm_master_request_handler()
1673 dlm_put(dlm); in dlm_master_request_handler()
1687 static int dlm_do_assert_master(struct dlm_ctxt *dlm, in dlm_do_assert_master() argument
1717 assert.node_idx = dlm->node_num; in dlm_do_assert_master()
1722 tmpret = o2net_send_message(DLM_ASSERT_MASTER_MSG, dlm->key, in dlm_do_assert_master()
1727 DLM_ASSERT_MASTER_MSG, dlm->key, to); in dlm_do_assert_master()
1741 spin_lock(&dlm->spinlock); in dlm_do_assert_master()
1742 spin_lock(&dlm->master_lock); in dlm_do_assert_master()
1743 if (dlm_find_mle(dlm, &mle, (char *)lockname, in dlm_do_assert_master()
1748 spin_unlock(&dlm->master_lock); in dlm_do_assert_master()
1749 spin_unlock(&dlm->spinlock); in dlm_do_assert_master()
1771 dlm_lockres_set_refmap_bit(dlm, res, to); in dlm_do_assert_master()
1799 struct dlm_ctxt *dlm = data; in dlm_assert_master_handler() local
1809 if (!dlm_grab(dlm)) in dlm_assert_master_handler()
1822 spin_lock(&dlm->spinlock); in dlm_assert_master_handler()
1828 spin_lock(&dlm->master_lock); in dlm_assert_master_handler()
1829 if (!dlm_find_mle(dlm, &mle, name, namelen)) { in dlm_assert_master_handler()
1862 dlm->name, namelen, name, in dlm_assert_master_handler()
1867 dlm->name, namelen, name, in dlm_assert_master_handler()
1870 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
1871 spin_unlock(&dlm->spinlock); in dlm_assert_master_handler()
1876 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
1880 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_assert_master_handler()
1953 if (nn != dlm->node_num && nn != assert->node_idx) { in dlm_assert_master_handler()
1971 dlm->node_num, mle->new_master); in dlm_assert_master_handler()
1974 dlm_change_lockres_owner(dlm, res, mle->new_master); in dlm_assert_master_handler()
1977 dlm_change_lockres_owner(dlm, res, mle->master); in dlm_assert_master_handler()
1988 spin_lock(&dlm->master_lock); in dlm_assert_master_handler()
2005 "inuse=%d\n", dlm->name, namelen, name, in dlm_assert_master_handler()
2009 __dlm_unlink_mle(dlm, mle); in dlm_assert_master_handler()
2010 __dlm_mle_detach_hb_events(dlm, mle); in dlm_assert_master_handler()
2019 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
2027 spin_unlock(&dlm->spinlock); in dlm_assert_master_handler()
2037 dlm_put(dlm); in dlm_assert_master_handler()
2045 assert->node_idx, dlm->name, namelen, name); in dlm_assert_master_handler()
2052 dlm->name, namelen, name, assert->node_idx); in dlm_assert_master_handler()
2062 spin_lock(&dlm->master_lock); in dlm_assert_master_handler()
2065 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
2066 spin_unlock(&dlm->spinlock); in dlm_assert_master_handler()
2068 dlm_put(dlm); in dlm_assert_master_handler()
2086 int dlm_dispatch_assert_master(struct dlm_ctxt *dlm, in dlm_dispatch_assert_master() argument
2097 dlm_init_work_item(dlm, item, dlm_assert_master_worker, NULL); in dlm_dispatch_assert_master()
2108 spin_lock(&dlm->work_lock); in dlm_dispatch_assert_master()
2109 list_add_tail(&item->list, &dlm->work_list); in dlm_dispatch_assert_master()
2110 spin_unlock(&dlm->work_lock); in dlm_dispatch_assert_master()
2112 queue_work(dlm->dlm_worker, &dlm->dispatched_work); in dlm_dispatch_assert_master()
2118 struct dlm_ctxt *dlm = data; in dlm_assert_master_worker() local
2127 dlm = item->dlm; in dlm_assert_master_worker()
2133 spin_lock(&dlm->spinlock); in dlm_assert_master_worker()
2134 memcpy(nodemap, dlm->domain_map, sizeof(nodemap)); in dlm_assert_master_worker()
2135 spin_unlock(&dlm->spinlock); in dlm_assert_master_worker()
2137 clear_bit(dlm->node_num, nodemap); in dlm_assert_master_worker()
2143 bit = dlm->node_num; in dlm_assert_master_worker()
2173 res->lockname.len, res->lockname.name, dlm->node_num); in dlm_assert_master_worker()
2174 ret = dlm_do_assert_master(dlm, res, nodemap, flags); in dlm_assert_master_worker()
2182 dlm_lockres_release_ast(dlm, res); in dlm_assert_master_worker()
2185 dlm_lockres_drop_inflight_worker(dlm, res); in dlm_assert_master_worker()
2202 static int dlm_pre_master_reco_lockres(struct dlm_ctxt *dlm, in dlm_pre_master_reco_lockres() argument
2210 spin_lock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2211 dlm_node_iter_init(dlm->domain_map, &iter); in dlm_pre_master_reco_lockres()
2212 spin_unlock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2216 if (nodenum == dlm->node_num) in dlm_pre_master_reco_lockres()
2218 ret = dlm_do_master_requery(dlm, res, nodenum, &master); in dlm_pre_master_reco_lockres()
2230 spin_lock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2231 if (test_bit(master, dlm->recovery_map)) { in dlm_pre_master_reco_lockres()
2235 "lock. must wait.\n", dlm->name, in dlm_pre_master_reco_lockres()
2239 spin_unlock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2240 mlog(0, "%s: reco lock master is %u\n", dlm->name, in dlm_pre_master_reco_lockres()
2252 int dlm_drop_lockres_ref(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_drop_lockres_ref() argument
2264 deref.node_idx = dlm->node_num; in dlm_drop_lockres_ref()
2268 ret = o2net_send_message(DLM_DEREF_LOCKRES_MSG, dlm->key, in dlm_drop_lockres_ref()
2272 dlm->name, namelen, lockname, ret, res->owner); in dlm_drop_lockres_ref()
2276 dlm->name, namelen, lockname, res->owner, r); in dlm_drop_lockres_ref()
2286 struct dlm_ctxt *dlm = data; in dlm_deref_lockres_handler() local
2298 if (!dlm_grab(dlm)) in dlm_deref_lockres_handler()
2316 spin_lock(&dlm->spinlock); in dlm_deref_lockres_handler()
2317 res = __dlm_lookup_lockres_full(dlm, name, namelen, hash); in dlm_deref_lockres_handler()
2319 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_handler()
2321 dlm->name, namelen, name); in dlm_deref_lockres_handler()
2324 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_handler()
2332 dlm_lockres_clear_refmap_bit(dlm, res, node); in dlm_deref_lockres_handler()
2340 dlm_lockres_calc_usage(dlm, res); in dlm_deref_lockres_handler()
2343 "but it is already dropped!\n", dlm->name, in dlm_deref_lockres_handler()
2358 dlm_init_work_item(dlm, item, dlm_deref_lockres_worker, NULL); in dlm_deref_lockres_handler()
2362 spin_lock(&dlm->work_lock); in dlm_deref_lockres_handler()
2363 list_add_tail(&item->list, &dlm->work_list); in dlm_deref_lockres_handler()
2364 spin_unlock(&dlm->work_lock); in dlm_deref_lockres_handler()
2366 queue_work(dlm->dlm_worker, &dlm->dispatched_work); in dlm_deref_lockres_handler()
2372 dlm_put(dlm); in dlm_deref_lockres_handler()
2379 struct dlm_ctxt *dlm; in dlm_deref_lockres_worker() local
2384 dlm = item->dlm; in dlm_deref_lockres_worker()
2392 dlm_lockres_clear_refmap_bit(dlm, res, node); in dlm_deref_lockres_worker()
2399 dlm->name, res->lockname.len, res->lockname.name, node); in dlm_deref_lockres_worker()
2400 dlm_lockres_calc_usage(dlm, res); in dlm_deref_lockres_worker()
2403 "but it is already dropped!\n", dlm->name, in dlm_deref_lockres_worker()
2418 static int dlm_is_lockres_migrateable(struct dlm_ctxt *dlm, in dlm_is_lockres_migrateable() argument
2437 if (res->owner != dlm->node_num) in dlm_is_lockres_migrateable()
2443 if (lock->ml.node != dlm->node_num) { in dlm_is_lockres_migrateable()
2449 "%s list\n", dlm->name, res->lockname.len, in dlm_is_lockres_migrateable()
2464 mlog(0, "%s: res %.*s, Migrateable\n", dlm->name, res->lockname.len, in dlm_is_lockres_migrateable()
2475 static int dlm_migrate_lockres(struct dlm_ctxt *dlm, in dlm_migrate_lockres() argument
2487 if (!dlm_grab(dlm)) in dlm_migrate_lockres()
2495 mlog(0, "%s: Migrating %.*s to node %u\n", dlm->name, namelen, name, in dlm_migrate_lockres()
2517 spin_lock(&dlm->spinlock); in dlm_migrate_lockres()
2518 spin_lock(&dlm->master_lock); in dlm_migrate_lockres()
2519 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle, name, in dlm_migrate_lockres()
2520 namelen, target, dlm->node_num); in dlm_migrate_lockres()
2526 spin_unlock(&dlm->master_lock); in dlm_migrate_lockres()
2527 spin_unlock(&dlm->spinlock); in dlm_migrate_lockres()
2539 if (dlm_mark_lockres_migrating(dlm, res, target) < 0) { in dlm_migrate_lockres()
2553 dlm_mle_detach_hb_events(dlm, oldmle); in dlm_migrate_lockres()
2559 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2577 flush_workqueue(dlm->dlm_worker); in dlm_migrate_lockres()
2583 ret = dlm_send_one_lockres(dlm, res, mres, target, in dlm_migrate_lockres()
2590 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2598 dlm_wait_for_node_death(dlm, target, in dlm_migrate_lockres()
2626 dlm->name, res->lockname.len, res->lockname.name); in dlm_migrate_lockres()
2629 if (dlm_is_node_dead(dlm, target)) { in dlm_migrate_lockres()
2632 dlm->name, res->lockname.len, in dlm_migrate_lockres()
2636 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2647 dlm->name, res->lockname.len, res->lockname.name); in dlm_migrate_lockres()
2652 dlm_set_lockres_owner(dlm, res, target); in dlm_migrate_lockres()
2654 dlm_remove_nonlocal_locks(dlm, res); in dlm_migrate_lockres()
2659 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2663 dlm_lockres_calc_usage(dlm, res); in dlm_migrate_lockres()
2668 dlm_kick_thread(dlm, res); in dlm_migrate_lockres()
2678 dlm_put(dlm); in dlm_migrate_lockres()
2680 mlog(0, "%s: Migrating %.*s to %u, returns %d\n", dlm->name, namelen, in dlm_migrate_lockres()
2697 int dlm_empty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_empty_lockres() argument
2703 assert_spin_locked(&dlm->spinlock); in dlm_empty_lockres()
2706 if (dlm_is_lockres_migrateable(dlm, res)) in dlm_empty_lockres()
2707 target = dlm_pick_migration_target(dlm, res); in dlm_empty_lockres()
2714 spin_unlock(&dlm->spinlock); in dlm_empty_lockres()
2716 ret = dlm_migrate_lockres(dlm, res, target); in dlm_empty_lockres()
2719 dlm->name, res->lockname.len, res->lockname.name, in dlm_empty_lockres()
2721 spin_lock(&dlm->spinlock); in dlm_empty_lockres()
2726 int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock) in dlm_lock_basts_flushed() argument
2729 spin_lock(&dlm->ast_lock); in dlm_lock_basts_flushed()
2733 spin_unlock(&dlm->ast_lock); in dlm_lock_basts_flushed()
2737 static int dlm_migration_can_proceed(struct dlm_ctxt *dlm, in dlm_migration_can_proceed() argument
2748 spin_lock(&dlm->spinlock); in dlm_migration_can_proceed()
2749 if (!test_bit(mig_target, dlm->domain_map)) in dlm_migration_can_proceed()
2751 spin_unlock(&dlm->spinlock); in dlm_migration_can_proceed()
2755 static int dlm_lockres_is_dirty(struct dlm_ctxt *dlm, in dlm_lockres_is_dirty() argument
2766 static int dlm_mark_lockres_migrating(struct dlm_ctxt *dlm, in dlm_mark_lockres_migrating() argument
2773 res->lockname.len, res->lockname.name, dlm->node_num, in dlm_mark_lockres_migrating()
2786 dlm_kick_thread(dlm, res); in dlm_mark_lockres_migrating()
2794 wait_event(dlm->ast_wq, !dlm_lockres_is_dirty(dlm, res)); in dlm_mark_lockres_migrating()
2795 dlm_lockres_release_ast(dlm, res); in dlm_mark_lockres_migrating()
2803 ret = wait_event_interruptible_timeout(dlm->migration_wq, in dlm_mark_lockres_migrating()
2804 dlm_migration_can_proceed(dlm, res, target), in dlm_mark_lockres_migrating()
2809 test_bit(target, dlm->domain_map) ? "no":"yes"); in dlm_mark_lockres_migrating()
2813 test_bit(target, dlm->domain_map) ? "no":"yes"); in dlm_mark_lockres_migrating()
2815 if (!dlm_migration_can_proceed(dlm, res, target)) { in dlm_mark_lockres_migrating()
2822 spin_lock(&dlm->spinlock); in dlm_mark_lockres_migrating()
2823 if (!test_bit(target, dlm->domain_map)) { in dlm_mark_lockres_migrating()
2828 spin_unlock(&dlm->spinlock); in dlm_mark_lockres_migrating()
2856 static void dlm_remove_nonlocal_locks(struct dlm_ctxt *dlm, in dlm_remove_nonlocal_locks() argument
2865 BUG_ON(res->owner == dlm->node_num); in dlm_remove_nonlocal_locks()
2869 if (lock->ml.node != dlm->node_num) { in dlm_remove_nonlocal_locks()
2877 dlm_lockres_clear_refmap_bit(dlm, res, in dlm_remove_nonlocal_locks()
2895 if (bit != dlm->node_num) { in dlm_remove_nonlocal_locks()
2897 "migrating lockres, clearing\n", dlm->name, in dlm_remove_nonlocal_locks()
2899 dlm_lockres_clear_refmap_bit(dlm, res, bit); in dlm_remove_nonlocal_locks()
2910 static u8 dlm_pick_migration_target(struct dlm_ctxt *dlm, in dlm_pick_migration_target() argument
2919 assert_spin_locked(&dlm->spinlock); in dlm_pick_migration_target()
2926 if (lock->ml.node == dlm->node_num) in dlm_pick_migration_target()
2928 if (test_bit(lock->ml.node, dlm->exit_domain_map)) in dlm_pick_migration_target()
2942 if (noderef == dlm->node_num) in dlm_pick_migration_target()
2944 if (test_bit(noderef, dlm->exit_domain_map)) in dlm_pick_migration_target()
2956 static int dlm_do_migrate_request(struct dlm_ctxt *dlm, in dlm_do_migrate_request() argument
2980 spin_lock(&dlm->spinlock); in dlm_do_migrate_request()
2981 skip = (!test_bit(nodenum, dlm->domain_map)); in dlm_do_migrate_request()
2982 spin_unlock(&dlm->spinlock); in dlm_do_migrate_request()
2988 ret = o2net_send_message(DLM_MIGRATE_REQUEST_MSG, dlm->key, in dlm_do_migrate_request()
2993 "MIGRATE_REQUEST to node %u\n", dlm->name, in dlm_do_migrate_request()
3010 dlm->name, res->lockname.len, res->lockname.name, in dlm_do_migrate_request()
3013 dlm_lockres_set_refmap_bit(dlm, res, nodenum); in dlm_do_migrate_request()
3036 struct dlm_ctxt *dlm = data; in dlm_migrate_request_handler() local
3044 if (!dlm_grab(dlm)) in dlm_migrate_request_handler()
3060 spin_lock(&dlm->spinlock); in dlm_migrate_request_handler()
3061 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_migrate_request_handler()
3079 spin_lock(&dlm->master_lock); in dlm_migrate_request_handler()
3081 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle, in dlm_migrate_request_handler()
3086 spin_unlock(&dlm->master_lock); in dlm_migrate_request_handler()
3088 spin_unlock(&dlm->spinlock); in dlm_migrate_request_handler()
3092 dlm_mle_detach_hb_events(dlm, oldmle); in dlm_migrate_request_handler()
3099 dlm_put(dlm); in dlm_migrate_request_handler()
3110 static int dlm_add_migration_mle(struct dlm_ctxt *dlm, in dlm_add_migration_mle() argument
3122 assert_spin_locked(&dlm->spinlock); in dlm_add_migration_mle()
3123 assert_spin_locked(&dlm->master_lock); in dlm_add_migration_mle()
3126 found = dlm_find_mle(dlm, oldmle, (char *)name, namelen); in dlm_add_migration_mle()
3131 if (master == dlm->node_num) { in dlm_add_migration_mle()
3154 __dlm_unlink_mle(dlm, tmp); in dlm_add_migration_mle()
3155 __dlm_mle_detach_hb_events(dlm, tmp); in dlm_add_migration_mle()
3161 "migration\n", dlm->name, in dlm_add_migration_mle()
3170 dlm_init_mle(mle, DLM_MLE_MIGRATION, dlm, res, name, namelen); in dlm_add_migration_mle()
3177 __dlm_insert_mle(dlm, mle); in dlm_add_migration_mle()
3185 static struct dlm_lock_resource *dlm_reset_mleres_owner(struct dlm_ctxt *dlm, in dlm_reset_mleres_owner() argument
3191 res = __dlm_lookup_lockres(dlm, mle->mname, mle->mnamelen, in dlm_reset_mleres_owner()
3194 spin_unlock(&dlm->master_lock); in dlm_reset_mleres_owner()
3198 dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_reset_mleres_owner()
3199 dlm_move_lockres_to_recovery_list(dlm, res); in dlm_reset_mleres_owner()
3204 __dlm_mle_detach_hb_events(dlm, mle); in dlm_reset_mleres_owner()
3207 spin_lock(&dlm->master_lock); in dlm_reset_mleres_owner()
3209 spin_unlock(&dlm->master_lock); in dlm_reset_mleres_owner()
3215 static void dlm_clean_migration_mle(struct dlm_ctxt *dlm, in dlm_clean_migration_mle() argument
3218 __dlm_mle_detach_hb_events(dlm, mle); in dlm_clean_migration_mle()
3221 __dlm_unlink_mle(dlm, mle); in dlm_clean_migration_mle()
3228 static void dlm_clean_block_mle(struct dlm_ctxt *dlm, in dlm_clean_block_mle() argument
3252 __dlm_mle_detach_hb_events(dlm, mle); in dlm_clean_block_mle()
3257 void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node) in dlm_clean_master_list() argument
3265 mlog(0, "dlm=%s, dead node=%u\n", dlm->name, dead_node); in dlm_clean_master_list()
3267 assert_spin_locked(&dlm->spinlock); in dlm_clean_master_list()
3270 spin_lock(&dlm->master_lock); in dlm_clean_master_list()
3272 bucket = dlm_master_hash(dlm, i); in dlm_clean_master_list()
3288 dlm_clean_block_mle(dlm, mle, dead_node); in dlm_clean_master_list()
3311 dlm->name, dead_node, in dlm_clean_master_list()
3318 dlm_clean_migration_mle(dlm, mle); in dlm_clean_master_list()
3321 "%u to %u!\n", dlm->name, dead_node, mle->master, in dlm_clean_master_list()
3329 res = dlm_reset_mleres_owner(dlm, mle); in dlm_clean_master_list()
3338 spin_unlock(&dlm->master_lock); in dlm_clean_master_list()
3341 int dlm_finish_migration(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, in dlm_finish_migration() argument
3347 spin_lock(&dlm->spinlock); in dlm_finish_migration()
3348 dlm_node_iter_init(dlm->domain_map, &iter); in dlm_finish_migration()
3350 clear_bit(dlm->node_num, iter.node_map); in dlm_finish_migration()
3351 spin_unlock(&dlm->spinlock); in dlm_finish_migration()
3357 dlm_lockres_set_refmap_bit(dlm, res, old_master); in dlm_finish_migration()
3361 ret = dlm_do_migrate_request(dlm, res, old_master, in dlm_finish_migration()
3362 dlm->node_num, &iter); in dlm_finish_migration()
3372 ret = dlm_do_assert_master(dlm, res, iter.node_map, in dlm_finish_migration()
3384 ret = dlm_do_assert_master(dlm, res, iter.node_map, in dlm_finish_migration()
3396 dlm_set_lockres_owner(dlm, res, dlm->node_num); in dlm_finish_migration()
3400 dlm_kick_thread(dlm, res); in dlm_finish_migration()
3439 void dlm_lockres_release_ast(struct dlm_ctxt *dlm, in dlm_lockres_release_ast() argument
3455 wake_up(&dlm->migration_wq); in dlm_lockres_release_ast()
3458 void dlm_force_free_mles(struct dlm_ctxt *dlm) in dlm_force_free_mles() argument
3471 spin_lock(&dlm->spinlock); in dlm_force_free_mles()
3472 spin_lock(&dlm->master_lock); in dlm_force_free_mles()
3474 BUG_ON(dlm->dlm_state != DLM_CTXT_LEAVING); in dlm_force_free_mles()
3475 BUG_ON((find_next_bit(dlm->domain_map, O2NM_MAX_NODES, 0) < O2NM_MAX_NODES)); in dlm_force_free_mles()
3478 bucket = dlm_master_hash(dlm, i); in dlm_force_free_mles()
3487 __dlm_unlink_mle(dlm, mle); in dlm_force_free_mles()
3488 __dlm_mle_detach_hb_events(dlm, mle); in dlm_force_free_mles()
3492 spin_unlock(&dlm->master_lock); in dlm_force_free_mles()
3493 spin_unlock(&dlm->spinlock); in dlm_force_free_mles()