Lines Matching refs:dlm

156 static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm);
158 void __dlm_unhash_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res)
163 mlog(0, "%s: Unhash res %.*s\n", dlm->name, res->lockname.len,
169 void __dlm_insert_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res)
174 assert_spin_locked(&dlm->spinlock);
177 bucket = dlm_lockres_hash(dlm, q->hash);
184 mlog(0, "%s: Hash res %.*s\n", dlm->name, res->lockname.len,
188 struct dlm_lock_resource * __dlm_lookup_lockres_full(struct dlm_ctxt *dlm,
198 assert_spin_locked(&dlm->spinlock);
200 bucket = dlm_lockres_hash(dlm, hash);
221 struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm,
230 assert_spin_locked(&dlm->spinlock);
232 res = __dlm_lookup_lockres_full(dlm, name, len, hash);
246 struct dlm_lock_resource * dlm_lookup_lockres(struct dlm_ctxt *dlm,
253 spin_lock(&dlm->spinlock);
254 res = __dlm_lookup_lockres(dlm, name, len, hash);
255 spin_unlock(&dlm->spinlock);
305 static void dlm_free_ctxt_mem(struct dlm_ctxt *dlm)
307 dlm_destroy_debugfs_subroot(dlm);
309 if (dlm->lockres_hash)
310 dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES);
312 if (dlm->master_hash)
313 dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES);
315 kfree(dlm->name);
316 kfree(dlm);
324 struct dlm_ctxt *dlm;
326 dlm = container_of(kref, struct dlm_ctxt, dlm_refs);
328 BUG_ON(dlm->num_joins);
329 BUG_ON(dlm->dlm_state == DLM_CTXT_JOINED);
332 list_del_init(&dlm->list);
336 mlog(0, "freeing memory from domain %s\n", dlm->name);
340 dlm_free_ctxt_mem(dlm);
345 void dlm_put(struct dlm_ctxt *dlm)
348 kref_put(&dlm->dlm_refs, dlm_ctxt_release);
352 static void __dlm_get(struct dlm_ctxt *dlm)
354 kref_get(&dlm->dlm_refs);
357 /* given a questionable reference to a dlm object, gets a reference if
360 struct dlm_ctxt *dlm_grab(struct dlm_ctxt *dlm)
368 if (target == dlm) {
380 int dlm_domain_fully_joined(struct dlm_ctxt *dlm)
385 ret = (dlm->dlm_state == DLM_CTXT_JOINED) ||
386 (dlm->dlm_state == DLM_CTXT_IN_SHUTDOWN);
392 static void dlm_destroy_dlm_worker(struct dlm_ctxt *dlm)
394 if (dlm->dlm_worker) {
395 flush_workqueue(dlm->dlm_worker);
396 destroy_workqueue(dlm->dlm_worker);
397 dlm->dlm_worker = NULL;
401 static void dlm_complete_dlm_shutdown(struct dlm_ctxt *dlm)
403 dlm_unregister_domain_handlers(dlm);
404 dlm_debug_shutdown(dlm);
405 dlm_complete_thread(dlm);
406 dlm_complete_recovery_thread(dlm);
407 dlm_destroy_dlm_worker(dlm);
413 list_del_init(&dlm->list);
420 static int dlm_migrate_all_locks(struct dlm_ctxt *dlm)
428 mlog(0, "Migrating locks from domain %s\n", dlm->name);
431 spin_lock(&dlm->spinlock);
435 bucket = dlm_lockres_hash(dlm, i);
442 /* migrate, if necessary. this will drop the dlm
444 dropped = dlm_empty_lockres(dlm, res);
448 __dlm_lockres_calc_usage(dlm, res);
456 cond_resched_lock(&dlm->spinlock);
460 cond_resched_lock(&dlm->spinlock);
463 spin_unlock(&dlm->spinlock);
464 wake_up(&dlm->dlm_thread_wq);
466 /* let the dlm thread take care of purging, keep scanning until
470 dlm->name, num);
473 mlog(0, "DONE Migrating locks from domain %s\n", dlm->name);
477 static int dlm_no_joining_node(struct dlm_ctxt *dlm)
481 spin_lock(&dlm->spinlock);
482 ret = dlm->joining_node == DLM_LOCK_RES_OWNER_UNKNOWN;
483 spin_unlock(&dlm->spinlock);
491 struct dlm_ctxt *dlm = data;
495 if (!dlm_grab(dlm))
499 mlog(0, "%s: Node %u sent a begin exit domain message\n", dlm->name, node);
501 spin_lock(&dlm->spinlock);
502 set_bit(node, dlm->exit_domain_map);
503 spin_unlock(&dlm->spinlock);
505 dlm_put(dlm);
510 static void dlm_mark_domain_leaving(struct dlm_ctxt *dlm)
512 /* Yikes, a double spinlock! I need domain_lock for the dlm
513 * state and the dlm spinlock for join state... Sorry! */
516 spin_lock(&dlm->spinlock);
518 if (dlm->joining_node != DLM_LOCK_RES_OWNER_UNKNOWN) {
520 dlm->joining_node);
521 spin_unlock(&dlm->spinlock);
524 wait_event(dlm->dlm_join_events, dlm_no_joining_node(dlm));
528 dlm->dlm_state = DLM_CTXT_LEAVING;
529 spin_unlock(&dlm->spinlock);
533 static void __dlm_print_nodes(struct dlm_ctxt *dlm)
537 assert_spin_locked(&dlm->spinlock);
540 while ((node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES,
551 struct dlm_ctxt *dlm = data;
557 if (!dlm_grab(dlm))
562 spin_lock(&dlm->spinlock);
563 clear_bit(node, dlm->domain_map);
564 clear_bit(node, dlm->exit_domain_map);
565 printk(KERN_NOTICE "o2dlm: Node %u leaves domain %s ", node, dlm->name);
566 __dlm_print_nodes(dlm);
569 dlm_hb_event_notify_attached(dlm, node, 0);
571 spin_unlock(&dlm->spinlock);
573 dlm_put(dlm);
578 static int dlm_send_one_domain_exit(struct dlm_ctxt *dlm, u32 msg_type,
584 mlog(0, "%s: Sending domain exit message %u to node %u\n", dlm->name,
588 leave_msg.node_idx = dlm->node_num;
590 status = o2net_send_message(msg_type, dlm->key, &leave_msg,
595 dlm->name);
600 static void dlm_begin_exit_domain(struct dlm_ctxt *dlm)
605 if (dlm->dlm_locking_proto.pv_major == 1 &&
606 dlm->dlm_locking_proto.pv_minor < 2)
614 spin_lock(&dlm->spinlock);
616 node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, node + 1);
619 if (node == dlm->node_num)
622 spin_unlock(&dlm->spinlock);
623 dlm_send_one_domain_exit(dlm, DLM_BEGIN_EXIT_DOMAIN_MSG, node);
624 spin_lock(&dlm->spinlock);
626 spin_unlock(&dlm->spinlock);
629 static void dlm_leave_domain(struct dlm_ctxt *dlm)
634 * accept mastership of new ones. The dlm is responsible for
638 spin_lock(&dlm->spinlock);
640 clear_bit(dlm->node_num, dlm->domain_map);
641 while ((node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES,
643 /* Drop the dlm spinlock. This is safe wrt the domain_map.
649 spin_unlock(&dlm->spinlock);
653 status = dlm_send_one_domain_exit(dlm, DLM_EXIT_DOMAIN_MSG,
668 spin_lock(&dlm->spinlock);
672 clear_bit(node, dlm->domain_map);
674 spin_unlock(&dlm->spinlock);
677 int dlm_joined(struct dlm_ctxt *dlm)
683 if (dlm->dlm_state == DLM_CTXT_JOINED)
691 int dlm_shutting_down(struct dlm_ctxt *dlm)
697 if (dlm->dlm_state == DLM_CTXT_IN_SHUTDOWN)
705 void dlm_unregister_domain(struct dlm_ctxt *dlm)
711 BUG_ON(dlm->dlm_state != DLM_CTXT_JOINED);
712 BUG_ON(!dlm->num_joins);
714 dlm->num_joins--;
715 if (!dlm->num_joins) {
722 dlm->dlm_state = DLM_CTXT_IN_SHUTDOWN;
728 mlog(0, "shutting down domain %s\n", dlm->name);
729 dlm_begin_exit_domain(dlm);
731 /* We changed dlm state, notify the thread */
732 dlm_kick_thread(dlm, NULL);
734 while (dlm_migrate_all_locks(dlm)) {
737 mlog(0, "%s: more migration to do\n", dlm->name);
741 if (!list_empty(&dlm->tracking_list)) {
744 list_for_each_entry(res, &dlm->tracking_list, tracking)
748 dlm_mark_domain_leaving(dlm);
749 dlm_leave_domain(dlm);
750 printk(KERN_NOTICE "o2dlm: Leaving domain %s\n", dlm->name);
751 dlm_force_free_mles(dlm);
752 dlm_complete_dlm_shutdown(dlm);
754 dlm_put(dlm);
828 struct dlm_ctxt *dlm = NULL;
853 dlm = __dlm_lookup_domain_full(query->domain, query->name_len);
854 if (!dlm)
864 if (test_bit(nodenum, dlm->domain_map)) {
876 /* Once the dlm ctxt is marked as leaving then we don't want
880 if (dlm && dlm->dlm_state != DLM_CTXT_LEAVING) {
882 spin_lock(&dlm->spinlock);
884 if (dlm->dlm_state == DLM_CTXT_NEW &&
885 dlm->joining_node == DLM_LOCK_RES_OWNER_UNKNOWN) {
890 } else if (dlm->joining_node != DLM_LOCK_RES_OWNER_UNKNOWN) {
893 } else if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) {
897 } else if (test_bit(bit, dlm->recovery_map)) {
901 } else if (test_bit(bit, dlm->domain_map)) {
914 &dlm->dlm_locking_proto,
918 &dlm->fs_locking_proto,
925 __dlm_set_joining_node(dlm, query->node_idx);
929 spin_unlock(&dlm->spinlock);
945 struct dlm_ctxt *dlm = NULL;
953 dlm = __dlm_lookup_domain_full(assert->domain, assert->name_len);
954 /* XXX should we consider no dlm ctxt an error? */
955 if (dlm) {
956 spin_lock(&dlm->spinlock);
961 BUG_ON(dlm->joining_node != assert->node_idx);
963 if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) {
964 mlog(0, "dlm recovery is ongoing, disallow join\n");
965 spin_unlock(&dlm->spinlock);
970 set_bit(assert->node_idx, dlm->domain_map);
971 clear_bit(assert->node_idx, dlm->exit_domain_map);
972 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN);
975 assert->node_idx, dlm->name);
976 __dlm_print_nodes(dlm);
979 dlm_hb_event_notify_attached(dlm, assert->node_idx, 1);
981 spin_unlock(&dlm->spinlock);
988 static int dlm_match_regions(struct dlm_ctxt *dlm,
1001 qr->qr_domain, qr->qr_node, dlm->node_num);
1010 qr->qr_domain, dlm->node_num, qr->qr_node);
1041 dlm->node_num, qr->qr_node);
1064 qr->qr_node, dlm->node_num);
1074 static int dlm_send_regions(struct dlm_ctxt *dlm, unsigned long *node_map)
1090 qr->qr_node = dlm->node_num;
1091 qr->qr_namelen = strlen(dlm->name);
1092 memcpy(qr->qr_domain, dlm->name, qr->qr_namelen);
1105 if (i == dlm->node_num)
1131 struct dlm_ctxt *dlm = NULL;
1148 dlm = __dlm_lookup_domain_full(qr->qr_domain, qr->qr_namelen);
1149 if (!dlm) {
1155 spin_lock(&dlm->spinlock);
1156 if (dlm->joining_node != qr->qr_node) {
1159 dlm->joining_node);
1164 if (dlm->dlm_locking_proto.pv_major == 1 &&
1165 dlm->dlm_locking_proto.pv_minor == 0) {
1167 "but active dlm protocol is %d.%d\n", qr->qr_node,
1168 qr->qr_domain, dlm->dlm_locking_proto.pv_major,
1169 dlm->dlm_locking_proto.pv_minor);
1173 status = dlm_match_regions(dlm, qr, local, sizeof(qr->qr_regions));
1176 spin_unlock(&dlm->spinlock);
1186 static int dlm_match_nodes(struct dlm_ctxt *dlm, struct dlm_query_nodeinfo *qn)
1228 qn->qn_nodenum, dlm->node_num);
1235 dlm->node_num, qn->qn_nodenum);
1246 static int dlm_send_nodeinfo(struct dlm_ctxt *dlm, unsigned long *node_map)
1275 qn->qn_nodenum = dlm->node_num;
1277 qn->qn_namelen = strlen(dlm->name);
1278 memcpy(qn->qn_domain, dlm->name, qn->qn_namelen);
1283 if (i == dlm->node_num)
1308 struct dlm_ctxt *dlm = NULL;
1317 dlm = __dlm_lookup_domain_full(qn->qn_domain, qn->qn_namelen);
1318 if (!dlm) {
1324 spin_lock(&dlm->spinlock);
1326 if (dlm->joining_node != qn->qn_nodenum) {
1329 dlm->joining_node);
1334 if (dlm->dlm_locking_proto.pv_major == 1 &&
1335 dlm->dlm_locking_proto.pv_minor == 0) {
1337 "but active dlm protocol is %d.%d\n", qn->qn_nodenum,
1338 qn->qn_domain, dlm->dlm_locking_proto.pv_major,
1339 dlm->dlm_locking_proto.pv_minor);
1343 status = dlm_match_nodes(dlm, qn);
1347 spin_unlock(&dlm->spinlock);
1357 struct dlm_ctxt *dlm = NULL;
1365 dlm = __dlm_lookup_domain_full(cancel->domain, cancel->name_len);
1367 if (dlm) {
1368 spin_lock(&dlm->spinlock);
1372 BUG_ON(dlm->joining_node != cancel->node_idx);
1373 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN);
1375 spin_unlock(&dlm->spinlock);
1382 static int dlm_send_one_join_cancel(struct dlm_ctxt *dlm,
1389 cancel_msg.node_idx = dlm->node_num;
1390 cancel_msg.name_len = strlen(dlm->name);
1391 memcpy(cancel_msg.domain, dlm->name, cancel_msg.name_len);
1408 static int dlm_send_join_cancels(struct dlm_ctxt *dlm,
1427 if (node == dlm->node_num)
1430 tmpstat = dlm_send_one_join_cancel(dlm, node);
1444 static int dlm_request_join(struct dlm_ctxt *dlm,
1456 join_msg.node_idx = dlm->node_num;
1457 join_msg.name_len = strlen(dlm->name);
1458 memcpy(join_msg.domain, dlm->name, join_msg.name_len);
1459 join_msg.dlm_proto = dlm->dlm_locking_proto;
1460 join_msg.fs_proto = dlm->fs_locking_proto;
1463 byte_copymap(join_msg.node_map, dlm->live_nodes_map, O2NM_MAX_NODES);
1477 his dlm isn't up, so we can consider him a 'yes' but not
1491 dlm->dlm_locking_proto.pv_major,
1492 dlm->dlm_locking_proto.pv_minor,
1493 dlm->fs_locking_proto.pv_major,
1494 dlm->fs_locking_proto.pv_minor,
1501 dlm->dlm_locking_proto.pv_minor = packet.dlm_minor;
1502 dlm->fs_locking_proto.pv_minor = packet.fs_minor;
1507 dlm->dlm_locking_proto.pv_major,
1508 dlm->dlm_locking_proto.pv_minor,
1509 dlm->fs_locking_proto.pv_major,
1510 dlm->fs_locking_proto.pv_minor);
1524 static int dlm_send_one_join_assert(struct dlm_ctxt *dlm,
1534 assert_msg.node_idx = dlm->node_num;
1535 assert_msg.name_len = strlen(dlm->name);
1536 memcpy(assert_msg.domain, dlm->name, assert_msg.name_len);
1551 static void dlm_send_join_asserts(struct dlm_ctxt *dlm,
1560 if (node == dlm->node_num)
1567 status = dlm_send_one_join_assert(dlm, node);
1569 spin_lock(&dlm->spinlock);
1570 live = test_bit(node, dlm->live_nodes_map);
1571 spin_unlock(&dlm->spinlock);
1590 static int dlm_should_restart_join(struct dlm_ctxt *dlm,
1601 spin_lock(&dlm->spinlock);
1604 ret = memcmp(ctxt->live_map, dlm->live_nodes_map,
1605 sizeof(dlm->live_nodes_map));
1606 spin_unlock(&dlm->spinlock);
1614 static int dlm_try_to_join_domain(struct dlm_ctxt *dlm)
1620 mlog(0, "%p", dlm);
1632 o2hb_fill_node_map(dlm->live_nodes_map, sizeof(dlm->live_nodes_map));
1634 spin_lock(&dlm->spinlock);
1635 memcpy(ctxt->live_map, dlm->live_nodes_map, sizeof(ctxt->live_map));
1637 __dlm_set_joining_node(dlm, dlm->node_num);
1639 spin_unlock(&dlm->spinlock);
1644 if (node == dlm->node_num)
1647 status = dlm_request_join(dlm, node, &response);
1654 * dlm up. */
1658 if (dlm_should_restart_join(dlm, ctxt, response)) {
1670 spin_lock(&dlm->spinlock);
1671 memcpy(dlm->domain_map, ctxt->yes_resp_map,
1673 set_bit(dlm->node_num, dlm->domain_map);
1674 spin_unlock(&dlm->spinlock);
1677 if (dlm->dlm_locking_proto.pv_major > 1 ||
1678 dlm->dlm_locking_proto.pv_minor > 0) {
1679 status = dlm_send_nodeinfo(dlm, ctxt->yes_resp_map);
1684 status = dlm_send_regions(dlm, ctxt->yes_resp_map);
1691 dlm_send_join_asserts(dlm, ctxt->yes_resp_map);
1698 dlm->dlm_state = DLM_CTXT_JOINED;
1699 dlm->num_joins++;
1703 spin_lock(&dlm->spinlock);
1704 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN);
1706 printk(KERN_NOTICE "o2dlm: Joining domain %s ", dlm->name);
1707 __dlm_print_nodes(dlm);
1709 spin_unlock(&dlm->spinlock);
1714 tmpstat = dlm_send_join_cancels(dlm,
1727 static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm)
1729 o2hb_unregister_callback(dlm->name, &dlm->dlm_hb_up);
1730 o2hb_unregister_callback(dlm->name, &dlm->dlm_hb_down);
1731 o2net_unregister_handler_list(&dlm->dlm_domain_handlers);
1734 static int dlm_register_domain_handlers(struct dlm_ctxt *dlm)
1740 o2hb_setup_callback(&dlm->dlm_hb_down, O2HB_NODE_DOWN_CB,
1741 dlm_hb_node_down_cb, dlm, DLM_HB_NODE_DOWN_PRI);
1742 status = o2hb_register_callback(dlm->name, &dlm->dlm_hb_down);
1746 o2hb_setup_callback(&dlm->dlm_hb_up, O2HB_NODE_UP_CB,
1747 dlm_hb_node_up_cb, dlm, DLM_HB_NODE_UP_PRI);
1748 status = o2hb_register_callback(dlm->name, &dlm->dlm_hb_up);
1752 status = o2net_register_handler(DLM_MASTER_REQUEST_MSG, dlm->key,
1755 dlm, NULL, &dlm->dlm_domain_handlers);
1759 status = o2net_register_handler(DLM_ASSERT_MASTER_MSG, dlm->key,
1762 dlm, dlm_assert_master_post_handler,
1763 &dlm->dlm_domain_handlers);
1767 status = o2net_register_handler(DLM_CREATE_LOCK_MSG, dlm->key,
1770 dlm, NULL, &dlm->dlm_domain_handlers);
1774 status = o2net_register_handler(DLM_CONVERT_LOCK_MSG, dlm->key,
1777 dlm, NULL, &dlm->dlm_domain_handlers);
1781 status = o2net_register_handler(DLM_UNLOCK_LOCK_MSG, dlm->key,
1784 dlm, NULL, &dlm->dlm_domain_handlers);
1788 status = o2net_register_handler(DLM_PROXY_AST_MSG, dlm->key,
1791 dlm, NULL, &dlm->dlm_domain_handlers);
1795 status = o2net_register_handler(DLM_EXIT_DOMAIN_MSG, dlm->key,
1798 dlm, NULL, &dlm->dlm_domain_handlers);
1802 status = o2net_register_handler(DLM_DEREF_LOCKRES_MSG, dlm->key,
1805 dlm, NULL, &dlm->dlm_domain_handlers);
1809 status = o2net_register_handler(DLM_MIGRATE_REQUEST_MSG, dlm->key,
1812 dlm, NULL, &dlm->dlm_domain_handlers);
1816 status = o2net_register_handler(DLM_MIG_LOCKRES_MSG, dlm->key,
1819 dlm, NULL, &dlm->dlm_domain_handlers);
1823 status = o2net_register_handler(DLM_MASTER_REQUERY_MSG, dlm->key,
1826 dlm, NULL, &dlm->dlm_domain_handlers);
1830 status = o2net_register_handler(DLM_LOCK_REQUEST_MSG, dlm->key,
1833 dlm, NULL, &dlm->dlm_domain_handlers);
1837 status = o2net_register_handler(DLM_RECO_DATA_DONE_MSG, dlm->key,
1840 dlm, NULL, &dlm->dlm_domain_handlers);
1844 status = o2net_register_handler(DLM_BEGIN_RECO_MSG, dlm->key,
1847 dlm, NULL, &dlm->dlm_domain_handlers);
1851 status = o2net_register_handler(DLM_FINALIZE_RECO_MSG, dlm->key,
1854 dlm, NULL, &dlm->dlm_domain_handlers);
1858 status = o2net_register_handler(DLM_BEGIN_EXIT_DOMAIN_MSG, dlm->key,
1861 dlm, NULL, &dlm->dlm_domain_handlers);
1867 dlm_unregister_domain_handlers(dlm);
1872 static int dlm_join_domain(struct dlm_ctxt *dlm)
1878 BUG_ON(!dlm);
1880 mlog(0, "Join domain %s\n", dlm->name);
1882 status = dlm_register_domain_handlers(dlm);
1888 status = dlm_launch_thread(dlm);
1894 status = dlm_launch_recovery_thread(dlm);
1900 status = dlm_debug_init(dlm);
1906 dlm->dlm_worker = create_singlethread_workqueue("dlm_wq");
1907 if (!dlm->dlm_worker) {
1914 status = dlm_try_to_join_domain(dlm);
1928 mlog(ML_NOTICE, "Timed out joining dlm domain "
1929 "%s after %u msecs\n", dlm->name,
1959 dlm_unregister_domain_handlers(dlm);
1960 dlm_debug_shutdown(dlm);
1961 dlm_complete_thread(dlm);
1962 dlm_complete_recovery_thread(dlm);
1963 dlm_destroy_dlm_worker(dlm);
1974 struct dlm_ctxt *dlm = NULL;
1976 dlm = kzalloc(sizeof(*dlm), GFP_KERNEL);
1977 if (!dlm) {
1983 dlm->name = kstrdup(domain, GFP_KERNEL);
1984 if (dlm->name == NULL) {
1990 dlm->lockres_hash = (struct hlist_head **)dlm_alloc_pagevec(DLM_HASH_PAGES);
1991 if (!dlm->lockres_hash) {
1998 INIT_HLIST_HEAD(dlm_lockres_hash(dlm, i));
2000 dlm->master_hash = (struct hlist_head **)
2002 if (!dlm->master_hash) {
2009 INIT_HLIST_HEAD(dlm_master_hash(dlm, i));
2011 dlm->key = key;
2012 dlm->node_num = o2nm_this_node();
2014 ret = dlm_create_debugfs_subroot(dlm);
2018 spin_lock_init(&dlm->spinlock);
2019 spin_lock_init(&dlm->master_lock);
2020 spin_lock_init(&dlm->ast_lock);
2021 spin_lock_init(&dlm->track_lock);
2022 INIT_LIST_HEAD(&dlm->list);
2023 INIT_LIST_HEAD(&dlm->dirty_list);
2024 INIT_LIST_HEAD(&dlm->reco.resources);
2025 INIT_LIST_HEAD(&dlm->reco.node_data);
2026 INIT_LIST_HEAD(&dlm->purge_list);
2027 INIT_LIST_HEAD(&dlm->dlm_domain_handlers);
2028 INIT_LIST_HEAD(&dlm->tracking_list);
2029 dlm->reco.state = 0;
2031 INIT_LIST_HEAD(&dlm->pending_asts);
2032 INIT_LIST_HEAD(&dlm->pending_basts);
2034 mlog(0, "dlm->recovery_map=%p, &(dlm->recovery_map[0])=%p\n",
2035 dlm->recovery_map, &(dlm->recovery_map[0]));
2037 memset(dlm->recovery_map, 0, sizeof(dlm->recovery_map));
2038 memset(dlm->live_nodes_map, 0, sizeof(dlm->live_nodes_map));
2039 memset(dlm->domain_map, 0, sizeof(dlm->domain_map));
2041 dlm->dlm_thread_task = NULL;
2042 dlm->dlm_reco_thread_task = NULL;
2043 dlm->dlm_worker = NULL;
2044 init_waitqueue_head(&dlm->dlm_thread_wq);
2045 init_waitqueue_head(&dlm->dlm_reco_thread_wq);
2046 init_waitqueue_head(&dlm->reco.event);
2047 init_waitqueue_head(&dlm->ast_wq);
2048 init_waitqueue_head(&dlm->migration_wq);
2049 INIT_LIST_HEAD(&dlm->mle_hb_events);
2051 dlm->joining_node = DLM_LOCK_RES_OWNER_UNKNOWN;
2052 init_waitqueue_head(&dlm->dlm_join_events);
2054 dlm->reco.new_master = O2NM_INVALID_NODE_NUM;
2055 dlm->reco.dead_node = O2NM_INVALID_NODE_NUM;
2057 atomic_set(&dlm->res_tot_count, 0);
2058 atomic_set(&dlm->res_cur_count, 0);
2060 atomic_set(&dlm->mle_tot_count[i], 0);
2061 atomic_set(&dlm->mle_cur_count[i], 0);
2064 spin_lock_init(&dlm->work_lock);
2065 INIT_LIST_HEAD(&dlm->work_list);
2066 INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work);
2068 kref_init(&dlm->dlm_refs);
2069 dlm->dlm_state = DLM_CTXT_NEW;
2071 INIT_LIST_HEAD(&dlm->dlm_eviction_callbacks);
2074 atomic_read(&dlm->dlm_refs.refcount));
2077 if (ret < 0 && dlm) {
2078 if (dlm->master_hash)
2079 dlm_free_pagevec((void **)dlm->master_hash,
2082 if (dlm->lockres_hash)
2083 dlm_free_pagevec((void **)dlm->lockres_hash,
2086 kfree(dlm->name);
2087 kfree(dlm);
2088 dlm = NULL;
2090 return dlm;
2128 struct dlm_ctxt *dlm = NULL;
2140 dlm = NULL;
2149 dlm = __dlm_lookup_domain(domain);
2150 if (dlm) {
2151 if (dlm->dlm_state != DLM_CTXT_JOINED) {
2161 if (dlm_protocol_compare(&dlm->fs_locking_proto, fs_proto)) {
2171 __dlm_get(dlm);
2172 dlm->num_joins++;
2194 dlm = new_ctxt;
2198 list_add_tail(&dlm->list, &dlm_domains);
2205 dlm->dlm_locking_proto = dlm_protocol;
2206 dlm->fs_locking_proto = *fs_proto;
2208 ret = dlm_join_domain(dlm);
2211 dlm_put(dlm);
2216 *fs_proto = dlm->fs_locking_proto;
2224 dlm = ERR_PTR(ret);
2226 return dlm;
2284 * dlm completes it's recovery work, otherwise it may be able to
2285 * acquire locks on resources requiring recovery. Since the dlm can
2294 void dlm_fire_domain_eviction_callbacks(struct dlm_ctxt *dlm,
2300 list_for_each_entry(cb, &dlm->dlm_eviction_callbacks, ec_item) {
2316 void dlm_register_eviction_cb(struct dlm_ctxt *dlm,
2320 list_add_tail(&cb->ec_item, &dlm->dlm_eviction_callbacks);