• Home
  • Raw
  • Download

Lines Matching refs:dlm

40 static void dlm_mle_node_down(struct dlm_ctxt *dlm,
44 static void dlm_mle_node_up(struct dlm_ctxt *dlm,
50 static int dlm_do_assert_master(struct dlm_ctxt *dlm,
55 static inline int dlm_mle_equal(struct dlm_ctxt *dlm, in dlm_mle_equal() argument
60 if (dlm != mle->dlm) in dlm_mle_equal()
77 struct dlm_ctxt *dlm,
83 static int dlm_find_mle(struct dlm_ctxt *dlm,
91 static int dlm_wait_for_lock_mastery(struct dlm_ctxt *dlm,
95 static int dlm_restart_lock_mastery(struct dlm_ctxt *dlm,
99 static int dlm_add_migration_mle(struct dlm_ctxt *dlm,
106 static u8 dlm_pick_migration_target(struct dlm_ctxt *dlm,
108 static void dlm_remove_nonlocal_locks(struct dlm_ctxt *dlm,
110 static int dlm_mark_lockres_migrating(struct dlm_ctxt *dlm,
113 static int dlm_pre_master_reco_lockres(struct dlm_ctxt *dlm,
163 static inline void __dlm_mle_attach_hb_events(struct dlm_ctxt *dlm, in __dlm_mle_attach_hb_events() argument
166 assert_spin_locked(&dlm->spinlock); in __dlm_mle_attach_hb_events()
168 list_add_tail(&mle->hb_events, &dlm->mle_hb_events); in __dlm_mle_attach_hb_events()
172 static inline void __dlm_mle_detach_hb_events(struct dlm_ctxt *dlm, in __dlm_mle_detach_hb_events() argument
180 static inline void dlm_mle_detach_hb_events(struct dlm_ctxt *dlm, in dlm_mle_detach_hb_events() argument
183 spin_lock(&dlm->spinlock); in dlm_mle_detach_hb_events()
184 __dlm_mle_detach_hb_events(dlm, mle); in dlm_mle_detach_hb_events()
185 spin_unlock(&dlm->spinlock); in dlm_mle_detach_hb_events()
190 struct dlm_ctxt *dlm; in dlm_get_mle_inuse() local
191 dlm = mle->dlm; in dlm_get_mle_inuse()
193 assert_spin_locked(&dlm->spinlock); in dlm_get_mle_inuse()
194 assert_spin_locked(&dlm->master_lock); in dlm_get_mle_inuse()
201 struct dlm_ctxt *dlm; in dlm_put_mle_inuse() local
202 dlm = mle->dlm; in dlm_put_mle_inuse()
204 spin_lock(&dlm->spinlock); in dlm_put_mle_inuse()
205 spin_lock(&dlm->master_lock); in dlm_put_mle_inuse()
208 spin_unlock(&dlm->master_lock); in dlm_put_mle_inuse()
209 spin_unlock(&dlm->spinlock); in dlm_put_mle_inuse()
216 struct dlm_ctxt *dlm; in __dlm_put_mle() local
217 dlm = mle->dlm; in __dlm_put_mle()
219 assert_spin_locked(&dlm->spinlock); in __dlm_put_mle()
220 assert_spin_locked(&dlm->master_lock); in __dlm_put_mle()
235 struct dlm_ctxt *dlm; in dlm_put_mle() local
236 dlm = mle->dlm; in dlm_put_mle()
238 spin_lock(&dlm->spinlock); in dlm_put_mle()
239 spin_lock(&dlm->master_lock); in dlm_put_mle()
241 spin_unlock(&dlm->master_lock); in dlm_put_mle()
242 spin_unlock(&dlm->spinlock); in dlm_put_mle()
252 struct dlm_ctxt *dlm, in dlm_init_mle() argument
257 assert_spin_locked(&dlm->spinlock); in dlm_init_mle()
259 mle->dlm = dlm; in dlm_init_mle()
291 atomic_inc(&dlm->mle_tot_count[mle->type]); in dlm_init_mle()
292 atomic_inc(&dlm->mle_cur_count[mle->type]); in dlm_init_mle()
295 memcpy(mle->node_map, dlm->domain_map, sizeof(mle->node_map)); in dlm_init_mle()
296 memcpy(mle->vote_map, dlm->domain_map, sizeof(mle->vote_map)); in dlm_init_mle()
297 clear_bit(dlm->node_num, mle->vote_map); in dlm_init_mle()
298 clear_bit(dlm->node_num, mle->node_map); in dlm_init_mle()
301 __dlm_mle_attach_hb_events(dlm, mle); in dlm_init_mle()
304 void __dlm_unlink_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle) in __dlm_unlink_mle() argument
306 assert_spin_locked(&dlm->spinlock); in __dlm_unlink_mle()
307 assert_spin_locked(&dlm->master_lock); in __dlm_unlink_mle()
313 void __dlm_insert_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle) in __dlm_insert_mle() argument
317 assert_spin_locked(&dlm->master_lock); in __dlm_insert_mle()
319 bucket = dlm_master_hash(dlm, mle->mnamehash); in __dlm_insert_mle()
324 static int dlm_find_mle(struct dlm_ctxt *dlm, in dlm_find_mle() argument
332 assert_spin_locked(&dlm->master_lock); in dlm_find_mle()
335 bucket = dlm_master_hash(dlm, hash); in dlm_find_mle()
337 if (!dlm_mle_equal(dlm, tmpmle, name, namelen)) in dlm_find_mle()
346 void dlm_hb_event_notify_attached(struct dlm_ctxt *dlm, int idx, int node_up) in dlm_hb_event_notify_attached() argument
350 assert_spin_locked(&dlm->spinlock); in dlm_hb_event_notify_attached()
352 list_for_each_entry(mle, &dlm->mle_hb_events, hb_events) { in dlm_hb_event_notify_attached()
354 dlm_mle_node_up(dlm, mle, NULL, idx); in dlm_hb_event_notify_attached()
356 dlm_mle_node_down(dlm, mle, NULL, idx); in dlm_hb_event_notify_attached()
360 static void dlm_mle_node_down(struct dlm_ctxt *dlm, in dlm_mle_node_down() argument
374 static void dlm_mle_node_up(struct dlm_ctxt *dlm, in dlm_mle_node_up() argument
408 struct dlm_ctxt *dlm; in dlm_mle_release() local
411 dlm = mle->dlm; in dlm_mle_release()
413 assert_spin_locked(&dlm->spinlock); in dlm_mle_release()
414 assert_spin_locked(&dlm->master_lock); in dlm_mle_release()
420 __dlm_unlink_mle(dlm, mle); in dlm_mle_release()
423 __dlm_mle_detach_hb_events(dlm, mle); in dlm_mle_release()
425 atomic_dec(&dlm->mle_cur_count[mle->type]); in dlm_mle_release()
469 struct dlm_ctxt *dlm; in dlm_lockres_release() local
472 dlm = res->dlm; in dlm_lockres_release()
481 atomic_dec(&dlm->res_cur_count); in dlm_lockres_release()
525 static void dlm_init_lockres(struct dlm_ctxt *dlm, in dlm_init_lockres() argument
556 res->dlm = dlm; in dlm_init_lockres()
560 atomic_inc(&dlm->res_tot_count); in dlm_init_lockres()
561 atomic_inc(&dlm->res_cur_count); in dlm_init_lockres()
565 dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_init_lockres()
572 spin_lock(&dlm->track_lock); in dlm_init_lockres()
573 list_add_tail(&res->tracking, &dlm->tracking_list); in dlm_init_lockres()
574 spin_unlock(&dlm->track_lock); in dlm_init_lockres()
580 struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm, in dlm_new_lockres() argument
594 dlm_init_lockres(dlm, res, name, namelen); in dlm_new_lockres()
603 void dlm_lockres_set_refmap_bit(struct dlm_ctxt *dlm, in dlm_lockres_set_refmap_bit() argument
614 void dlm_lockres_clear_refmap_bit(struct dlm_ctxt *dlm, in dlm_lockres_clear_refmap_bit() argument
625 static void __dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, in __dlm_lockres_grab_inflight_ref() argument
630 mlog(0, "%s: res %.*s, inflight++: now %u, %ps()\n", dlm->name, in __dlm_lockres_grab_inflight_ref()
635 void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, in dlm_lockres_grab_inflight_ref() argument
639 __dlm_lockres_grab_inflight_ref(dlm, res); in dlm_lockres_grab_inflight_ref()
642 void dlm_lockres_drop_inflight_ref(struct dlm_ctxt *dlm, in dlm_lockres_drop_inflight_ref() argument
651 mlog(0, "%s: res %.*s, inflight--: now %u, %ps()\n", dlm->name, in dlm_lockres_drop_inflight_ref()
658 void __dlm_lockres_grab_inflight_worker(struct dlm_ctxt *dlm, in __dlm_lockres_grab_inflight_worker() argument
664 dlm->name, res->lockname.len, res->lockname.name, in __dlm_lockres_grab_inflight_worker()
668 static void __dlm_lockres_drop_inflight_worker(struct dlm_ctxt *dlm, in __dlm_lockres_drop_inflight_worker() argument
675 dlm->name, res->lockname.len, res->lockname.name, in __dlm_lockres_drop_inflight_worker()
679 static void dlm_lockres_drop_inflight_worker(struct dlm_ctxt *dlm, in dlm_lockres_drop_inflight_worker() argument
683 __dlm_lockres_drop_inflight_worker(dlm, res); in dlm_lockres_drop_inflight_worker()
703 struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm, in dlm_get_lock_resource() argument
725 spin_lock(&dlm->spinlock); in dlm_get_lock_resource()
726 tmpres = __dlm_lookup_lockres_full(dlm, lockid, namelen, hash); in dlm_get_lock_resource()
728 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
755 BUG_ON(tmpres->owner == dlm->node_num); in dlm_get_lock_resource()
765 dlm_lockres_grab_inflight_ref(dlm, tmpres); in dlm_get_lock_resource()
769 spin_lock(&dlm->track_lock); in dlm_get_lock_resource()
777 spin_unlock(&dlm->track_lock); in dlm_get_lock_resource()
785 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
791 res = dlm_new_lockres(dlm, lockid, namelen); in dlm_get_lock_resource()
803 dlm_change_lockres_owner(dlm, res, dlm->node_num); in dlm_get_lock_resource()
804 __dlm_insert_lockres(dlm, res); in dlm_get_lock_resource()
805 dlm_lockres_grab_inflight_ref(dlm, res); in dlm_get_lock_resource()
807 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
813 spin_lock(&dlm->master_lock); in dlm_get_lock_resource()
816 blocked = dlm_find_mle(dlm, &mle, (char *)lockid, namelen); in dlm_get_lock_resource()
833 BUG_ON(mig && mle->master == dlm->node_num); in dlm_get_lock_resource()
837 dlm->name, namelen, lockid, in dlm_get_lock_resource()
839 spin_unlock(&dlm->master_lock); in dlm_get_lock_resource()
840 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
844 dlm_mle_detach_hb_events(dlm, mle); in dlm_get_lock_resource()
858 dlm_init_mle(mle, DLM_MLE_MASTER, dlm, res, NULL, 0); in dlm_get_lock_resource()
859 set_bit(dlm->node_num, mle->maybe_map); in dlm_get_lock_resource()
860 __dlm_insert_mle(dlm, mle); in dlm_get_lock_resource()
866 bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0); in dlm_get_lock_resource()
870 dlm->name, namelen, (char *)lockid, bit); in dlm_get_lock_resource()
881 __dlm_insert_lockres(dlm, res); in dlm_get_lock_resource()
884 __dlm_lockres_grab_inflight_ref(dlm, res); in dlm_get_lock_resource()
891 spin_unlock(&dlm->master_lock); in dlm_get_lock_resource()
892 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
901 "master $RECOVERY lock now\n", dlm->name); in dlm_get_lock_resource()
902 if (!dlm_pre_master_reco_lockres(dlm, res)) in dlm_get_lock_resource()
906 "change\n", dlm->name); in dlm_get_lock_resource()
912 dlm_kick_recovery_thread(dlm); in dlm_get_lock_resource()
914 dlm_wait_for_recovery(dlm); in dlm_get_lock_resource()
916 spin_lock(&dlm->spinlock); in dlm_get_lock_resource()
917 bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0); in dlm_get_lock_resource()
921 dlm->name, namelen, (char *)lockid, bit); in dlm_get_lock_resource()
925 spin_unlock(&dlm->spinlock); in dlm_get_lock_resource()
928 dlm_wait_for_node_recovery(dlm, bit, 10000); in dlm_get_lock_resource()
950 "master is %u, keep going\n", dlm->name, namelen, in dlm_get_lock_resource()
957 ret = dlm_wait_for_lock_mastery(dlm, res, mle, &blocked); in dlm_get_lock_resource()
961 "request now, blocked=%d\n", dlm->name, res->lockname.len, in dlm_get_lock_resource()
966 dlm->name, res->lockname.len, in dlm_get_lock_resource()
975 mlog(0, "%s: res %.*s, Mastered by %u\n", dlm->name, res->lockname.len, in dlm_get_lock_resource()
981 dlm_mle_detach_hb_events(dlm, mle); in dlm_get_lock_resource()
1003 static int dlm_wait_for_lock_mastery(struct dlm_ctxt *dlm, in dlm_wait_for_lock_mastery() argument
1020 mlog(0, "%s:%.*s: owner is suddenly %u\n", dlm->name, in dlm_wait_for_lock_mastery()
1025 if (res->owner != dlm->node_num) { in dlm_wait_for_lock_mastery()
1050 dlm->name, res->lockname.len, res->lockname.name); in dlm_wait_for_lock_mastery()
1051 ret = dlm_restart_lock_mastery(dlm, res, mle, *blocked); in dlm_wait_for_lock_mastery()
1055 dlm->name, res->lockname.len, res->lockname.name, in dlm_wait_for_lock_mastery()
1065 "rechecking now\n", dlm->name, res->lockname.len, in dlm_wait_for_lock_mastery()
1071 "for %s:%.*s\n", dlm->name, res->lockname.len, in dlm_wait_for_lock_mastery()
1085 if (dlm->node_num <= bit) { in dlm_wait_for_lock_mastery()
1089 mle->master = dlm->node_num; in dlm_wait_for_lock_mastery()
1110 mlog(0, "%s:%.*s: waiting again\n", dlm->name, in dlm_wait_for_lock_mastery()
1121 m = dlm->node_num; in dlm_wait_for_lock_mastery()
1124 ret = dlm_do_assert_master(dlm, res, mle->vote_map, 0); in dlm_wait_for_lock_mastery()
1142 dlm_change_lockres_owner(dlm, res, m); in dlm_wait_for_lock_mastery()
1208 static int dlm_restart_lock_mastery(struct dlm_ctxt *dlm, in dlm_restart_lock_mastery() argument
1255 "now\n", dlm->name, in dlm_restart_lock_mastery()
1271 dlm->name, in dlm_restart_lock_mastery()
1289 set_bit(dlm->node_num, mle->maybe_map); in dlm_restart_lock_mastery()
1311 struct dlm_ctxt *dlm = mle->dlm; in dlm_do_master_request() local
1316 request.node_idx = dlm->node_num; in dlm_do_master_request()
1324 ret = o2net_send_message(DLM_MASTER_REQUEST_MSG, dlm->key, &request, in dlm_do_master_request()
1360 "reference\n", dlm->name, res->lockname.len, in dlm_do_master_request()
1406 struct dlm_ctxt *dlm = data; in dlm_master_request_handler() local
1417 if (!dlm_grab(dlm)) in dlm_master_request_handler()
1420 if (!dlm_domain_fully_joined(dlm)) { in dlm_master_request_handler()
1435 spin_lock(&dlm->spinlock); in dlm_master_request_handler()
1436 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_master_request_handler()
1438 spin_unlock(&dlm->spinlock); in dlm_master_request_handler()
1465 if (res->owner == dlm->node_num) { in dlm_master_request_handler()
1466 dlm_lockres_set_refmap_bit(dlm, res, request->node_idx); in dlm_master_request_handler()
1499 spin_lock(&dlm->master_lock); in dlm_master_request_handler()
1500 found = dlm_find_mle(dlm, &tmpmle, name, namelen); in dlm_master_request_handler()
1514 if (tmpmle->master == dlm->node_num) { in dlm_master_request_handler()
1525 if (tmpmle->master == dlm->node_num) { in dlm_master_request_handler()
1531 dlm_lockres_set_refmap_bit(dlm, res, in dlm_master_request_handler()
1544 spin_unlock(&dlm->master_lock); in dlm_master_request_handler()
1560 spin_lock(&dlm->master_lock); in dlm_master_request_handler()
1561 found = dlm_find_mle(dlm, &tmpmle, name, namelen); in dlm_master_request_handler()
1566 spin_unlock(&dlm->master_lock); in dlm_master_request_handler()
1567 spin_unlock(&dlm->spinlock); in dlm_master_request_handler()
1580 dlm_init_mle(mle, DLM_MLE_BLOCK, dlm, NULL, name, namelen); in dlm_master_request_handler()
1582 __dlm_insert_mle(dlm, mle); in dlm_master_request_handler()
1586 if (tmpmle->master == dlm->node_num) { in dlm_master_request_handler()
1602 spin_unlock(&dlm->master_lock); in dlm_master_request_handler()
1603 spin_unlock(&dlm->spinlock); in dlm_master_request_handler()
1618 dlm->node_num, res->lockname.len, res->lockname.name); in dlm_master_request_handler()
1620 ret = dlm_dispatch_assert_master(dlm, res, 0, request->node_idx, in dlm_master_request_handler()
1629 __dlm_lockres_grab_inflight_worker(dlm, res); in dlm_master_request_handler()
1638 dlm_put(dlm); in dlm_master_request_handler()
1652 static int dlm_do_assert_master(struct dlm_ctxt *dlm, in dlm_do_assert_master() argument
1682 assert.node_idx = dlm->node_num; in dlm_do_assert_master()
1687 tmpret = o2net_send_message(DLM_ASSERT_MASTER_MSG, dlm->key, in dlm_do_assert_master()
1692 DLM_ASSERT_MASTER_MSG, dlm->key, to); in dlm_do_assert_master()
1706 spin_lock(&dlm->spinlock); in dlm_do_assert_master()
1707 spin_lock(&dlm->master_lock); in dlm_do_assert_master()
1708 if (dlm_find_mle(dlm, &mle, (char *)lockname, in dlm_do_assert_master()
1713 spin_unlock(&dlm->master_lock); in dlm_do_assert_master()
1714 spin_unlock(&dlm->spinlock); in dlm_do_assert_master()
1736 dlm_lockres_set_refmap_bit(dlm, res, to); in dlm_do_assert_master()
1764 struct dlm_ctxt *dlm = data; in dlm_assert_master_handler() local
1774 if (!dlm_grab(dlm)) in dlm_assert_master_handler()
1787 spin_lock(&dlm->spinlock); in dlm_assert_master_handler()
1793 spin_lock(&dlm->master_lock); in dlm_assert_master_handler()
1794 if (!dlm_find_mle(dlm, &mle, name, namelen)) { in dlm_assert_master_handler()
1827 dlm->name, namelen, name, in dlm_assert_master_handler()
1832 dlm->name, namelen, name, in dlm_assert_master_handler()
1835 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
1836 spin_unlock(&dlm->spinlock); in dlm_assert_master_handler()
1841 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
1845 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_assert_master_handler()
1918 if (nn != dlm->node_num && nn != assert->node_idx) { in dlm_assert_master_handler()
1936 dlm->node_num, mle->new_master); in dlm_assert_master_handler()
1939 dlm_change_lockres_owner(dlm, res, mle->new_master); in dlm_assert_master_handler()
1942 dlm_change_lockres_owner(dlm, res, mle->master); in dlm_assert_master_handler()
1953 spin_lock(&dlm->master_lock); in dlm_assert_master_handler()
1970 "inuse=%d\n", dlm->name, namelen, name, in dlm_assert_master_handler()
1974 __dlm_unlink_mle(dlm, mle); in dlm_assert_master_handler()
1975 __dlm_mle_detach_hb_events(dlm, mle); in dlm_assert_master_handler()
1984 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
1992 spin_unlock(&dlm->spinlock); in dlm_assert_master_handler()
2002 dlm_put(dlm); in dlm_assert_master_handler()
2010 assert->node_idx, dlm->name, namelen, name); in dlm_assert_master_handler()
2017 dlm->name, namelen, name, assert->node_idx); in dlm_assert_master_handler()
2027 spin_lock(&dlm->master_lock); in dlm_assert_master_handler()
2030 spin_unlock(&dlm->master_lock); in dlm_assert_master_handler()
2031 spin_unlock(&dlm->spinlock); in dlm_assert_master_handler()
2033 dlm_put(dlm); in dlm_assert_master_handler()
2051 int dlm_dispatch_assert_master(struct dlm_ctxt *dlm, in dlm_dispatch_assert_master() argument
2062 dlm_init_work_item(dlm, item, dlm_assert_master_worker, NULL); in dlm_dispatch_assert_master()
2073 spin_lock(&dlm->work_lock); in dlm_dispatch_assert_master()
2074 list_add_tail(&item->list, &dlm->work_list); in dlm_dispatch_assert_master()
2075 spin_unlock(&dlm->work_lock); in dlm_dispatch_assert_master()
2077 queue_work(dlm->dlm_worker, &dlm->dispatched_work); in dlm_dispatch_assert_master()
2083 struct dlm_ctxt *dlm = data; in dlm_assert_master_worker() local
2092 dlm = item->dlm; in dlm_assert_master_worker()
2098 spin_lock(&dlm->spinlock); in dlm_assert_master_worker()
2099 memcpy(nodemap, dlm->domain_map, sizeof(nodemap)); in dlm_assert_master_worker()
2100 spin_unlock(&dlm->spinlock); in dlm_assert_master_worker()
2102 clear_bit(dlm->node_num, nodemap); in dlm_assert_master_worker()
2108 bit = dlm->node_num; in dlm_assert_master_worker()
2138 res->lockname.len, res->lockname.name, dlm->node_num); in dlm_assert_master_worker()
2139 ret = dlm_do_assert_master(dlm, res, nodemap, flags); in dlm_assert_master_worker()
2147 dlm_lockres_release_ast(dlm, res); in dlm_assert_master_worker()
2150 dlm_lockres_drop_inflight_worker(dlm, res); in dlm_assert_master_worker()
2167 static int dlm_pre_master_reco_lockres(struct dlm_ctxt *dlm, in dlm_pre_master_reco_lockres() argument
2175 spin_lock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2176 dlm_node_iter_init(dlm->domain_map, &iter); in dlm_pre_master_reco_lockres()
2177 spin_unlock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2181 if (nodenum == dlm->node_num) in dlm_pre_master_reco_lockres()
2183 ret = dlm_do_master_requery(dlm, res, nodenum, &master); in dlm_pre_master_reco_lockres()
2195 spin_lock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2196 if (test_bit(master, dlm->recovery_map)) { in dlm_pre_master_reco_lockres()
2200 "lock. must wait.\n", dlm->name, in dlm_pre_master_reco_lockres()
2204 spin_unlock(&dlm->spinlock); in dlm_pre_master_reco_lockres()
2205 mlog(0, "%s: reco lock master is %u\n", dlm->name, in dlm_pre_master_reco_lockres()
2217 int dlm_drop_lockres_ref(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_drop_lockres_ref() argument
2229 deref.node_idx = dlm->node_num; in dlm_drop_lockres_ref()
2233 ret = o2net_send_message(DLM_DEREF_LOCKRES_MSG, dlm->key, in dlm_drop_lockres_ref()
2237 dlm->name, namelen, lockname, ret, res->owner); in dlm_drop_lockres_ref()
2241 dlm->name, namelen, lockname, res->owner, r); in dlm_drop_lockres_ref()
2254 struct dlm_ctxt *dlm = data; in dlm_deref_lockres_handler() local
2266 if (!dlm_grab(dlm)) in dlm_deref_lockres_handler()
2284 spin_lock(&dlm->spinlock); in dlm_deref_lockres_handler()
2285 res = __dlm_lookup_lockres_full(dlm, name, namelen, hash); in dlm_deref_lockres_handler()
2287 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_handler()
2289 dlm->name, namelen, name); in dlm_deref_lockres_handler()
2292 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_handler()
2300 dlm_lockres_clear_refmap_bit(dlm, res, node); in dlm_deref_lockres_handler()
2308 dlm_lockres_calc_usage(dlm, res); in dlm_deref_lockres_handler()
2311 "but it is already dropped!\n", dlm->name, in dlm_deref_lockres_handler()
2326 dlm_init_work_item(dlm, item, dlm_deref_lockres_worker, NULL); in dlm_deref_lockres_handler()
2330 spin_lock(&dlm->work_lock); in dlm_deref_lockres_handler()
2331 list_add_tail(&item->list, &dlm->work_list); in dlm_deref_lockres_handler()
2332 spin_unlock(&dlm->work_lock); in dlm_deref_lockres_handler()
2334 queue_work(dlm->dlm_worker, &dlm->dispatched_work); in dlm_deref_lockres_handler()
2340 dlm_put(dlm); in dlm_deref_lockres_handler()
2348 struct dlm_ctxt *dlm = data; in dlm_deref_lockres_done_handler() local
2358 if (!dlm_grab(dlm)) in dlm_deref_lockres_done_handler()
2376 spin_lock(&dlm->spinlock); in dlm_deref_lockres_done_handler()
2377 res = __dlm_lookup_lockres_full(dlm, name, namelen, hash); in dlm_deref_lockres_done_handler()
2379 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_done_handler()
2381 dlm->name, namelen, name); in dlm_deref_lockres_done_handler()
2388 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_done_handler()
2390 "but it is already derefed!\n", dlm->name, in dlm_deref_lockres_done_handler()
2396 __dlm_do_purge_lockres(dlm, res); in dlm_deref_lockres_done_handler()
2400 spin_unlock(&dlm->spinlock); in dlm_deref_lockres_done_handler()
2406 dlm_put(dlm); in dlm_deref_lockres_done_handler()
2410 static void dlm_drop_lockres_ref_done(struct dlm_ctxt *dlm, in dlm_drop_lockres_ref_done() argument
2423 deref.node_idx = dlm->node_num; in dlm_drop_lockres_ref_done()
2427 ret = o2net_send_message(DLM_DEREF_LOCKRES_DONE, dlm->key, in dlm_drop_lockres_ref_done()
2431 " to node %u\n", dlm->name, namelen, in dlm_drop_lockres_ref_done()
2436 dlm->name, namelen, lockname, node, r); in dlm_drop_lockres_ref_done()
2443 struct dlm_ctxt *dlm; in dlm_deref_lockres_worker() local
2448 dlm = item->dlm; in dlm_deref_lockres_worker()
2456 dlm_lockres_clear_refmap_bit(dlm, res, node); in dlm_deref_lockres_worker()
2461 dlm_drop_lockres_ref_done(dlm, res, node); in dlm_deref_lockres_worker()
2465 dlm->name, res->lockname.len, res->lockname.name, node); in dlm_deref_lockres_worker()
2466 dlm_lockres_calc_usage(dlm, res); in dlm_deref_lockres_worker()
2469 "but it is already dropped!\n", dlm->name, in dlm_deref_lockres_worker()
2484 static int dlm_is_lockres_migratable(struct dlm_ctxt *dlm, in dlm_is_lockres_migratable() argument
2504 if (res->owner != dlm->node_num) in dlm_is_lockres_migratable()
2510 if (lock->ml.node != dlm->node_num) { in dlm_is_lockres_migratable()
2516 "%s list\n", dlm->name, res->lockname.len, in dlm_is_lockres_migratable()
2531 mlog(0, "%s: res %.*s, Migratable\n", dlm->name, res->lockname.len, in dlm_is_lockres_migratable()
2542 static int dlm_migrate_lockres(struct dlm_ctxt *dlm, in dlm_migrate_lockres() argument
2554 if (!dlm_grab(dlm)) in dlm_migrate_lockres()
2562 mlog(0, "%s: Migrating %.*s to node %u\n", dlm->name, namelen, name, in dlm_migrate_lockres()
2584 spin_lock(&dlm->spinlock); in dlm_migrate_lockres()
2585 spin_lock(&dlm->master_lock); in dlm_migrate_lockres()
2586 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle, name, in dlm_migrate_lockres()
2587 namelen, target, dlm->node_num); in dlm_migrate_lockres()
2595 spin_unlock(&dlm->master_lock); in dlm_migrate_lockres()
2596 spin_unlock(&dlm->spinlock); in dlm_migrate_lockres()
2608 if (dlm_mark_lockres_migrating(dlm, res, target) < 0) { in dlm_migrate_lockres()
2622 dlm_mle_detach_hb_events(dlm, oldmle); in dlm_migrate_lockres()
2628 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2646 flush_workqueue(dlm->dlm_worker); in dlm_migrate_lockres()
2652 ret = dlm_send_one_lockres(dlm, res, mres, target, in dlm_migrate_lockres()
2659 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2667 dlm_wait_for_node_death(dlm, target, in dlm_migrate_lockres()
2695 dlm->name, res->lockname.len, res->lockname.name); in dlm_migrate_lockres()
2698 if (dlm_is_node_dead(dlm, target)) { in dlm_migrate_lockres()
2701 dlm->name, res->lockname.len, in dlm_migrate_lockres()
2705 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2716 dlm->name, res->lockname.len, res->lockname.name); in dlm_migrate_lockres()
2721 dlm_set_lockres_owner(dlm, res, target); in dlm_migrate_lockres()
2723 dlm_remove_nonlocal_locks(dlm, res); in dlm_migrate_lockres()
2728 dlm_mle_detach_hb_events(dlm, mle); in dlm_migrate_lockres()
2732 dlm_lockres_calc_usage(dlm, res); in dlm_migrate_lockres()
2737 dlm_kick_thread(dlm, res); in dlm_migrate_lockres()
2747 dlm_put(dlm); in dlm_migrate_lockres()
2749 mlog(0, "%s: Migrating %.*s to %u, returns %d\n", dlm->name, namelen, in dlm_migrate_lockres()
2766 int dlm_empty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_empty_lockres() argument
2772 assert_spin_locked(&dlm->spinlock); in dlm_empty_lockres()
2775 if (dlm_is_lockres_migratable(dlm, res)) in dlm_empty_lockres()
2776 target = dlm_pick_migration_target(dlm, res); in dlm_empty_lockres()
2783 spin_unlock(&dlm->spinlock); in dlm_empty_lockres()
2785 ret = dlm_migrate_lockres(dlm, res, target); in dlm_empty_lockres()
2788 dlm->name, res->lockname.len, res->lockname.name, in dlm_empty_lockres()
2790 spin_lock(&dlm->spinlock); in dlm_empty_lockres()
2795 int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock) in dlm_lock_basts_flushed() argument
2798 spin_lock(&dlm->ast_lock); in dlm_lock_basts_flushed()
2802 spin_unlock(&dlm->ast_lock); in dlm_lock_basts_flushed()
2806 static int dlm_migration_can_proceed(struct dlm_ctxt *dlm, in dlm_migration_can_proceed() argument
2817 spin_lock(&dlm->spinlock); in dlm_migration_can_proceed()
2818 if (!test_bit(mig_target, dlm->domain_map)) in dlm_migration_can_proceed()
2820 spin_unlock(&dlm->spinlock); in dlm_migration_can_proceed()
2824 static int dlm_lockres_is_dirty(struct dlm_ctxt *dlm, in dlm_lockres_is_dirty() argument
2835 static int dlm_mark_lockres_migrating(struct dlm_ctxt *dlm, in dlm_mark_lockres_migrating() argument
2842 res->lockname.len, res->lockname.name, dlm->node_num, in dlm_mark_lockres_migrating()
2855 dlm_kick_thread(dlm, res); in dlm_mark_lockres_migrating()
2863 wait_event(dlm->ast_wq, !dlm_lockres_is_dirty(dlm, res)); in dlm_mark_lockres_migrating()
2864 dlm_lockres_release_ast(dlm, res); in dlm_mark_lockres_migrating()
2872 ret = wait_event_interruptible_timeout(dlm->migration_wq, in dlm_mark_lockres_migrating()
2873 dlm_migration_can_proceed(dlm, res, target), in dlm_mark_lockres_migrating()
2878 test_bit(target, dlm->domain_map) ? "no":"yes"); in dlm_mark_lockres_migrating()
2882 test_bit(target, dlm->domain_map) ? "no":"yes"); in dlm_mark_lockres_migrating()
2884 if (!dlm_migration_can_proceed(dlm, res, target)) { in dlm_mark_lockres_migrating()
2891 spin_lock(&dlm->spinlock); in dlm_mark_lockres_migrating()
2892 if (!test_bit(target, dlm->domain_map)) { in dlm_mark_lockres_migrating()
2897 spin_unlock(&dlm->spinlock); in dlm_mark_lockres_migrating()
2927 static void dlm_remove_nonlocal_locks(struct dlm_ctxt *dlm, in dlm_remove_nonlocal_locks() argument
2936 BUG_ON(res->owner == dlm->node_num); in dlm_remove_nonlocal_locks()
2940 if (lock->ml.node != dlm->node_num) { in dlm_remove_nonlocal_locks()
2948 dlm_lockres_clear_refmap_bit(dlm, res, in dlm_remove_nonlocal_locks()
2966 if (bit != dlm->node_num) { in dlm_remove_nonlocal_locks()
2968 "migrating lockres, clearing\n", dlm->name, in dlm_remove_nonlocal_locks()
2970 dlm_lockres_clear_refmap_bit(dlm, res, bit); in dlm_remove_nonlocal_locks()
2981 static u8 dlm_pick_migration_target(struct dlm_ctxt *dlm, in dlm_pick_migration_target() argument
2990 assert_spin_locked(&dlm->spinlock); in dlm_pick_migration_target()
2997 if (lock->ml.node == dlm->node_num) in dlm_pick_migration_target()
2999 if (test_bit(lock->ml.node, dlm->exit_domain_map)) in dlm_pick_migration_target()
3013 if (noderef == dlm->node_num) in dlm_pick_migration_target()
3015 if (test_bit(noderef, dlm->exit_domain_map)) in dlm_pick_migration_target()
3027 static int dlm_do_migrate_request(struct dlm_ctxt *dlm, in dlm_do_migrate_request() argument
3051 spin_lock(&dlm->spinlock); in dlm_do_migrate_request()
3052 skip = (!test_bit(nodenum, dlm->domain_map)); in dlm_do_migrate_request()
3053 spin_unlock(&dlm->spinlock); in dlm_do_migrate_request()
3059 ret = o2net_send_message(DLM_MIGRATE_REQUEST_MSG, dlm->key, in dlm_do_migrate_request()
3064 "MIGRATE_REQUEST to node %u\n", dlm->name, in dlm_do_migrate_request()
3081 dlm->name, res->lockname.len, res->lockname.name, in dlm_do_migrate_request()
3084 dlm_lockres_set_refmap_bit(dlm, res, nodenum); in dlm_do_migrate_request()
3107 struct dlm_ctxt *dlm = data; in dlm_migrate_request_handler() local
3115 if (!dlm_grab(dlm)) in dlm_migrate_request_handler()
3131 spin_lock(&dlm->spinlock); in dlm_migrate_request_handler()
3132 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_migrate_request_handler()
3150 spin_lock(&dlm->master_lock); in dlm_migrate_request_handler()
3152 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle, in dlm_migrate_request_handler()
3160 spin_unlock(&dlm->master_lock); in dlm_migrate_request_handler()
3162 spin_unlock(&dlm->spinlock); in dlm_migrate_request_handler()
3166 dlm_mle_detach_hb_events(dlm, oldmle); in dlm_migrate_request_handler()
3173 dlm_put(dlm); in dlm_migrate_request_handler()
3184 static int dlm_add_migration_mle(struct dlm_ctxt *dlm, in dlm_add_migration_mle() argument
3196 assert_spin_locked(&dlm->spinlock); in dlm_add_migration_mle()
3197 assert_spin_locked(&dlm->master_lock); in dlm_add_migration_mle()
3200 found = dlm_find_mle(dlm, oldmle, (char *)name, namelen); in dlm_add_migration_mle()
3205 if (master == dlm->node_num) { in dlm_add_migration_mle()
3229 __dlm_unlink_mle(dlm, tmp); in dlm_add_migration_mle()
3230 __dlm_mle_detach_hb_events(dlm, tmp); in dlm_add_migration_mle()
3236 "migration\n", dlm->name, in dlm_add_migration_mle()
3245 dlm_init_mle(mle, DLM_MLE_MIGRATION, dlm, res, name, namelen); in dlm_add_migration_mle()
3252 __dlm_insert_mle(dlm, mle); in dlm_add_migration_mle()
3260 static struct dlm_lock_resource *dlm_reset_mleres_owner(struct dlm_ctxt *dlm, in dlm_reset_mleres_owner() argument
3266 res = __dlm_lookup_lockres(dlm, mle->mname, mle->mnamelen, in dlm_reset_mleres_owner()
3269 spin_unlock(&dlm->master_lock); in dlm_reset_mleres_owner()
3273 dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_reset_mleres_owner()
3274 dlm_move_lockres_to_recovery_list(dlm, res); in dlm_reset_mleres_owner()
3279 __dlm_mle_detach_hb_events(dlm, mle); in dlm_reset_mleres_owner()
3282 spin_lock(&dlm->master_lock); in dlm_reset_mleres_owner()
3284 spin_unlock(&dlm->master_lock); in dlm_reset_mleres_owner()
3290 static void dlm_clean_migration_mle(struct dlm_ctxt *dlm, in dlm_clean_migration_mle() argument
3293 __dlm_mle_detach_hb_events(dlm, mle); in dlm_clean_migration_mle()
3296 __dlm_unlink_mle(dlm, mle); in dlm_clean_migration_mle()
3303 static void dlm_clean_block_mle(struct dlm_ctxt *dlm, in dlm_clean_block_mle() argument
3327 __dlm_mle_detach_hb_events(dlm, mle); in dlm_clean_block_mle()
3332 void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node) in dlm_clean_master_list() argument
3340 mlog(0, "dlm=%s, dead node=%u\n", dlm->name, dead_node); in dlm_clean_master_list()
3342 assert_spin_locked(&dlm->spinlock); in dlm_clean_master_list()
3345 spin_lock(&dlm->master_lock); in dlm_clean_master_list()
3347 bucket = dlm_master_hash(dlm, i); in dlm_clean_master_list()
3363 dlm_clean_block_mle(dlm, mle, dead_node); in dlm_clean_master_list()
3386 dlm->name, dead_node, in dlm_clean_master_list()
3393 dlm_clean_migration_mle(dlm, mle); in dlm_clean_master_list()
3396 "%u to %u!\n", dlm->name, dead_node, mle->master, in dlm_clean_master_list()
3404 res = dlm_reset_mleres_owner(dlm, mle); in dlm_clean_master_list()
3413 spin_unlock(&dlm->master_lock); in dlm_clean_master_list()
3416 int dlm_finish_migration(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, in dlm_finish_migration() argument
3422 spin_lock(&dlm->spinlock); in dlm_finish_migration()
3423 dlm_node_iter_init(dlm->domain_map, &iter); in dlm_finish_migration()
3425 clear_bit(dlm->node_num, iter.node_map); in dlm_finish_migration()
3426 spin_unlock(&dlm->spinlock); in dlm_finish_migration()
3432 dlm_lockres_set_refmap_bit(dlm, res, old_master); in dlm_finish_migration()
3436 ret = dlm_do_migrate_request(dlm, res, old_master, in dlm_finish_migration()
3437 dlm->node_num, &iter); in dlm_finish_migration()
3447 ret = dlm_do_assert_master(dlm, res, iter.node_map, in dlm_finish_migration()
3459 ret = dlm_do_assert_master(dlm, res, iter.node_map, in dlm_finish_migration()
3471 dlm_set_lockres_owner(dlm, res, dlm->node_num); in dlm_finish_migration()
3475 dlm_kick_thread(dlm, res); in dlm_finish_migration()
3514 void dlm_lockres_release_ast(struct dlm_ctxt *dlm, in dlm_lockres_release_ast() argument
3530 wake_up(&dlm->migration_wq); in dlm_lockres_release_ast()
3533 void dlm_force_free_mles(struct dlm_ctxt *dlm) in dlm_force_free_mles() argument
3546 spin_lock(&dlm->spinlock); in dlm_force_free_mles()
3547 spin_lock(&dlm->master_lock); in dlm_force_free_mles()
3549 BUG_ON(dlm->dlm_state != DLM_CTXT_LEAVING); in dlm_force_free_mles()
3550 BUG_ON((find_next_bit(dlm->domain_map, O2NM_MAX_NODES, 0) < O2NM_MAX_NODES)); in dlm_force_free_mles()
3553 bucket = dlm_master_hash(dlm, i); in dlm_force_free_mles()
3562 __dlm_unlink_mle(dlm, mle); in dlm_force_free_mles()
3563 __dlm_mle_detach_hb_events(dlm, mle); in dlm_force_free_mles()
3567 spin_unlock(&dlm->master_lock); in dlm_force_free_mles()
3568 spin_unlock(&dlm->spinlock); in dlm_force_free_mles()