Lines Matching refs:dlm

160 static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm);
162 void __dlm_unhash_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_unhash_lockres() argument
167 mlog(0, "%s: Unhash res %.*s\n", dlm->name, res->lockname.len, in __dlm_unhash_lockres()
173 void __dlm_insert_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_insert_lockres() argument
177 assert_spin_locked(&dlm->spinlock); in __dlm_insert_lockres()
179 bucket = dlm_lockres_hash(dlm, res->lockname.hash); in __dlm_insert_lockres()
186 mlog(0, "%s: Hash res %.*s\n", dlm->name, res->lockname.len, in __dlm_insert_lockres()
190 struct dlm_lock_resource * __dlm_lookup_lockres_full(struct dlm_ctxt *dlm, in __dlm_lookup_lockres_full() argument
200 assert_spin_locked(&dlm->spinlock); in __dlm_lookup_lockres_full()
202 bucket = dlm_lockres_hash(dlm, hash); in __dlm_lookup_lockres_full()
223 struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm, in __dlm_lookup_lockres() argument
232 assert_spin_locked(&dlm->spinlock); in __dlm_lookup_lockres()
234 res = __dlm_lookup_lockres_full(dlm, name, len, hash); in __dlm_lookup_lockres()
248 struct dlm_lock_resource * dlm_lookup_lockres(struct dlm_ctxt *dlm, in dlm_lookup_lockres() argument
255 spin_lock(&dlm->spinlock); in dlm_lookup_lockres()
256 res = __dlm_lookup_lockres(dlm, name, len, hash); in dlm_lookup_lockres()
257 spin_unlock(&dlm->spinlock); in dlm_lookup_lockres()
307 static void dlm_free_ctxt_mem(struct dlm_ctxt *dlm) in dlm_free_ctxt_mem() argument
309 dlm_destroy_debugfs_subroot(dlm); in dlm_free_ctxt_mem()
311 if (dlm->lockres_hash) in dlm_free_ctxt_mem()
312 dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); in dlm_free_ctxt_mem()
314 if (dlm->master_hash) in dlm_free_ctxt_mem()
315 dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES); in dlm_free_ctxt_mem()
317 kfree(dlm->name); in dlm_free_ctxt_mem()
318 kfree(dlm); in dlm_free_ctxt_mem()
326 struct dlm_ctxt *dlm; in dlm_ctxt_release() local
328 dlm = container_of(kref, struct dlm_ctxt, dlm_refs); in dlm_ctxt_release()
330 BUG_ON(dlm->num_joins); in dlm_ctxt_release()
331 BUG_ON(dlm->dlm_state == DLM_CTXT_JOINED); in dlm_ctxt_release()
334 list_del_init(&dlm->list); in dlm_ctxt_release()
338 mlog(0, "freeing memory from domain %s\n", dlm->name); in dlm_ctxt_release()
342 dlm_free_ctxt_mem(dlm); in dlm_ctxt_release()
347 void dlm_put(struct dlm_ctxt *dlm) in dlm_put() argument
350 kref_put(&dlm->dlm_refs, dlm_ctxt_release); in dlm_put()
354 static void __dlm_get(struct dlm_ctxt *dlm) in __dlm_get() argument
356 kref_get(&dlm->dlm_refs); in __dlm_get()
362 struct dlm_ctxt *dlm_grab(struct dlm_ctxt *dlm) in dlm_grab() argument
370 if (target == dlm) { in dlm_grab()
382 int dlm_domain_fully_joined(struct dlm_ctxt *dlm) in dlm_domain_fully_joined() argument
387 ret = (dlm->dlm_state == DLM_CTXT_JOINED) || in dlm_domain_fully_joined()
388 (dlm->dlm_state == DLM_CTXT_IN_SHUTDOWN); in dlm_domain_fully_joined()
394 static void dlm_destroy_dlm_worker(struct dlm_ctxt *dlm) in dlm_destroy_dlm_worker() argument
396 if (dlm->dlm_worker) { in dlm_destroy_dlm_worker()
397 destroy_workqueue(dlm->dlm_worker); in dlm_destroy_dlm_worker()
398 dlm->dlm_worker = NULL; in dlm_destroy_dlm_worker()
402 static void dlm_complete_dlm_shutdown(struct dlm_ctxt *dlm) in dlm_complete_dlm_shutdown() argument
404 dlm_unregister_domain_handlers(dlm); in dlm_complete_dlm_shutdown()
405 dlm_debug_shutdown(dlm); in dlm_complete_dlm_shutdown()
406 dlm_complete_thread(dlm); in dlm_complete_dlm_shutdown()
407 dlm_complete_recovery_thread(dlm); in dlm_complete_dlm_shutdown()
408 dlm_destroy_dlm_worker(dlm); in dlm_complete_dlm_shutdown()
414 list_del_init(&dlm->list); in dlm_complete_dlm_shutdown()
421 static int dlm_migrate_all_locks(struct dlm_ctxt *dlm) in dlm_migrate_all_locks() argument
429 mlog(0, "Migrating locks from domain %s\n", dlm->name); in dlm_migrate_all_locks()
432 spin_lock(&dlm->spinlock); in dlm_migrate_all_locks()
436 bucket = dlm_lockres_hash(dlm, i); in dlm_migrate_all_locks()
445 dropped = dlm_empty_lockres(dlm, res); in dlm_migrate_all_locks()
449 __dlm_lockres_calc_usage(dlm, res); in dlm_migrate_all_locks()
457 cond_resched_lock(&dlm->spinlock); in dlm_migrate_all_locks()
461 cond_resched_lock(&dlm->spinlock); in dlm_migrate_all_locks()
466 if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { in dlm_migrate_all_locks()
468 "need to be migrated after dlm recovery\n", dlm->name); in dlm_migrate_all_locks()
472 "all lock resources\n", dlm->name); in dlm_migrate_all_locks()
473 dlm->migrate_done = 1; in dlm_migrate_all_locks()
477 spin_unlock(&dlm->spinlock); in dlm_migrate_all_locks()
478 wake_up(&dlm->dlm_thread_wq); in dlm_migrate_all_locks()
484 dlm->name, num); in dlm_migrate_all_locks()
487 mlog(0, "DONE Migrating locks from domain %s\n", dlm->name); in dlm_migrate_all_locks()
491 static int dlm_no_joining_node(struct dlm_ctxt *dlm) in dlm_no_joining_node() argument
495 spin_lock(&dlm->spinlock); in dlm_no_joining_node()
496 ret = dlm->joining_node == DLM_LOCK_RES_OWNER_UNKNOWN; in dlm_no_joining_node()
497 spin_unlock(&dlm->spinlock); in dlm_no_joining_node()
505 struct dlm_ctxt *dlm = data; in dlm_begin_exit_domain_handler() local
509 if (!dlm_grab(dlm)) in dlm_begin_exit_domain_handler()
513 mlog(0, "%s: Node %u sent a begin exit domain message\n", dlm->name, node); in dlm_begin_exit_domain_handler()
515 spin_lock(&dlm->spinlock); in dlm_begin_exit_domain_handler()
516 set_bit(node, dlm->exit_domain_map); in dlm_begin_exit_domain_handler()
517 spin_unlock(&dlm->spinlock); in dlm_begin_exit_domain_handler()
519 dlm_put(dlm); in dlm_begin_exit_domain_handler()
524 static void dlm_mark_domain_leaving(struct dlm_ctxt *dlm) in dlm_mark_domain_leaving() argument
530 spin_lock(&dlm->spinlock); in dlm_mark_domain_leaving()
532 if (dlm->joining_node != DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_mark_domain_leaving()
534 dlm->joining_node); in dlm_mark_domain_leaving()
535 spin_unlock(&dlm->spinlock); in dlm_mark_domain_leaving()
538 wait_event(dlm->dlm_join_events, dlm_no_joining_node(dlm)); in dlm_mark_domain_leaving()
542 dlm->dlm_state = DLM_CTXT_LEAVING; in dlm_mark_domain_leaving()
543 spin_unlock(&dlm->spinlock); in dlm_mark_domain_leaving()
547 static void __dlm_print_nodes(struct dlm_ctxt *dlm) in __dlm_print_nodes() argument
551 assert_spin_locked(&dlm->spinlock); in __dlm_print_nodes()
554 while ((node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, in __dlm_print_nodes()
565 struct dlm_ctxt *dlm = data; in dlm_exit_domain_handler() local
571 if (!dlm_grab(dlm)) in dlm_exit_domain_handler()
576 spin_lock(&dlm->spinlock); in dlm_exit_domain_handler()
577 clear_bit(node, dlm->domain_map); in dlm_exit_domain_handler()
578 clear_bit(node, dlm->exit_domain_map); in dlm_exit_domain_handler()
579 printk(KERN_NOTICE "o2dlm: Node %u leaves domain %s ", node, dlm->name); in dlm_exit_domain_handler()
580 __dlm_print_nodes(dlm); in dlm_exit_domain_handler()
583 dlm_hb_event_notify_attached(dlm, node, 0); in dlm_exit_domain_handler()
585 spin_unlock(&dlm->spinlock); in dlm_exit_domain_handler()
587 dlm_put(dlm); in dlm_exit_domain_handler()
592 static int dlm_send_one_domain_exit(struct dlm_ctxt *dlm, u32 msg_type, in dlm_send_one_domain_exit() argument
598 mlog(0, "%s: Sending domain exit message %u to node %u\n", dlm->name, in dlm_send_one_domain_exit()
602 leave_msg.node_idx = dlm->node_num; in dlm_send_one_domain_exit()
604 status = o2net_send_message(msg_type, dlm->key, &leave_msg, in dlm_send_one_domain_exit()
609 dlm->name); in dlm_send_one_domain_exit()
614 static void dlm_begin_exit_domain(struct dlm_ctxt *dlm) in dlm_begin_exit_domain() argument
619 if (dlm->dlm_locking_proto.pv_major == 1 && in dlm_begin_exit_domain()
620 dlm->dlm_locking_proto.pv_minor < 2) in dlm_begin_exit_domain()
628 spin_lock(&dlm->spinlock); in dlm_begin_exit_domain()
630 node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, node + 1); in dlm_begin_exit_domain()
633 if (node == dlm->node_num) in dlm_begin_exit_domain()
636 spin_unlock(&dlm->spinlock); in dlm_begin_exit_domain()
637 dlm_send_one_domain_exit(dlm, DLM_BEGIN_EXIT_DOMAIN_MSG, node); in dlm_begin_exit_domain()
638 spin_lock(&dlm->spinlock); in dlm_begin_exit_domain()
640 spin_unlock(&dlm->spinlock); in dlm_begin_exit_domain()
643 static void dlm_leave_domain(struct dlm_ctxt *dlm) in dlm_leave_domain() argument
652 spin_lock(&dlm->spinlock); in dlm_leave_domain()
654 clear_bit(dlm->node_num, dlm->domain_map); in dlm_leave_domain()
655 while ((node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, in dlm_leave_domain()
663 spin_unlock(&dlm->spinlock); in dlm_leave_domain()
667 status = dlm_send_one_domain_exit(dlm, DLM_EXIT_DOMAIN_MSG, in dlm_leave_domain()
682 spin_lock(&dlm->spinlock); in dlm_leave_domain()
686 clear_bit(node, dlm->domain_map); in dlm_leave_domain()
688 spin_unlock(&dlm->spinlock); in dlm_leave_domain()
691 void dlm_unregister_domain(struct dlm_ctxt *dlm) in dlm_unregister_domain() argument
697 BUG_ON(dlm->dlm_state != DLM_CTXT_JOINED); in dlm_unregister_domain()
698 BUG_ON(!dlm->num_joins); in dlm_unregister_domain()
700 dlm->num_joins--; in dlm_unregister_domain()
701 if (!dlm->num_joins) { in dlm_unregister_domain()
708 dlm->dlm_state = DLM_CTXT_IN_SHUTDOWN; in dlm_unregister_domain()
714 mlog(0, "shutting down domain %s\n", dlm->name); in dlm_unregister_domain()
715 dlm_begin_exit_domain(dlm); in dlm_unregister_domain()
718 dlm_kick_thread(dlm, NULL); in dlm_unregister_domain()
720 while (dlm_migrate_all_locks(dlm)) { in dlm_unregister_domain()
723 mlog(0, "%s: more migration to do\n", dlm->name); in dlm_unregister_domain()
727 if (!list_empty(&dlm->tracking_list)) { in dlm_unregister_domain()
730 list_for_each_entry(res, &dlm->tracking_list, tracking) in dlm_unregister_domain()
734 dlm_mark_domain_leaving(dlm); in dlm_unregister_domain()
735 dlm_leave_domain(dlm); in dlm_unregister_domain()
736 printk(KERN_NOTICE "o2dlm: Leaving domain %s\n", dlm->name); in dlm_unregister_domain()
737 dlm_force_free_mles(dlm); in dlm_unregister_domain()
738 dlm_complete_dlm_shutdown(dlm); in dlm_unregister_domain()
740 dlm_put(dlm); in dlm_unregister_domain()
814 struct dlm_ctxt *dlm = NULL; in dlm_query_join_handler() local
839 dlm = __dlm_lookup_domain_full(query->domain, query->name_len); in dlm_query_join_handler()
840 if (!dlm) in dlm_query_join_handler()
850 if (test_bit(nodenum, dlm->domain_map)) { in dlm_query_join_handler()
866 if (dlm->dlm_state != DLM_CTXT_LEAVING) { in dlm_query_join_handler()
868 spin_lock(&dlm->spinlock); in dlm_query_join_handler()
870 if (dlm->dlm_state == DLM_CTXT_NEW && in dlm_query_join_handler()
871 dlm->joining_node == DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_query_join_handler()
876 } else if (dlm->joining_node != DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_query_join_handler()
879 } else if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { in dlm_query_join_handler()
883 } else if (test_bit(bit, dlm->recovery_map)) { in dlm_query_join_handler()
887 } else if (test_bit(bit, dlm->domain_map)) { in dlm_query_join_handler()
900 &dlm->dlm_locking_proto, in dlm_query_join_handler()
904 &dlm->fs_locking_proto, in dlm_query_join_handler()
911 __dlm_set_joining_node(dlm, query->node_idx); in dlm_query_join_handler()
915 spin_unlock(&dlm->spinlock); in dlm_query_join_handler()
931 struct dlm_ctxt *dlm = NULL; in dlm_assert_joined_handler() local
939 dlm = __dlm_lookup_domain_full(assert->domain, assert->name_len); in dlm_assert_joined_handler()
941 if (dlm) { in dlm_assert_joined_handler()
942 spin_lock(&dlm->spinlock); in dlm_assert_joined_handler()
947 BUG_ON(dlm->joining_node != assert->node_idx); in dlm_assert_joined_handler()
949 if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { in dlm_assert_joined_handler()
951 spin_unlock(&dlm->spinlock); in dlm_assert_joined_handler()
956 set_bit(assert->node_idx, dlm->domain_map); in dlm_assert_joined_handler()
957 clear_bit(assert->node_idx, dlm->exit_domain_map); in dlm_assert_joined_handler()
958 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_assert_joined_handler()
961 assert->node_idx, dlm->name); in dlm_assert_joined_handler()
962 __dlm_print_nodes(dlm); in dlm_assert_joined_handler()
965 dlm_hb_event_notify_attached(dlm, assert->node_idx, 1); in dlm_assert_joined_handler()
967 spin_unlock(&dlm->spinlock); in dlm_assert_joined_handler()
974 static int dlm_match_regions(struct dlm_ctxt *dlm, in dlm_match_regions() argument
987 qr->qr_domain, qr->qr_node, dlm->node_num); in dlm_match_regions()
996 qr->qr_domain, dlm->node_num, qr->qr_node); in dlm_match_regions()
1027 dlm->node_num, qr->qr_node); in dlm_match_regions()
1050 qr->qr_node, dlm->node_num); in dlm_match_regions()
1060 static int dlm_send_regions(struct dlm_ctxt *dlm, unsigned long *node_map) in dlm_send_regions() argument
1076 qr->qr_node = dlm->node_num; in dlm_send_regions()
1077 qr->qr_namelen = strlen(dlm->name); in dlm_send_regions()
1078 memcpy(qr->qr_domain, dlm->name, qr->qr_namelen); in dlm_send_regions()
1091 if (i == dlm->node_num) in dlm_send_regions()
1117 struct dlm_ctxt *dlm = NULL; in dlm_query_region_handler() local
1134 dlm = __dlm_lookup_domain_full(qr->qr_domain, qr->qr_namelen); in dlm_query_region_handler()
1135 if (!dlm) { in dlm_query_region_handler()
1141 spin_lock(&dlm->spinlock); in dlm_query_region_handler()
1142 if (dlm->joining_node != qr->qr_node) { in dlm_query_region_handler()
1145 dlm->joining_node); in dlm_query_region_handler()
1150 if (dlm->dlm_locking_proto.pv_major == 1 && in dlm_query_region_handler()
1151 dlm->dlm_locking_proto.pv_minor == 0) { in dlm_query_region_handler()
1154 qr->qr_domain, dlm->dlm_locking_proto.pv_major, in dlm_query_region_handler()
1155 dlm->dlm_locking_proto.pv_minor); in dlm_query_region_handler()
1159 status = dlm_match_regions(dlm, qr, local, sizeof(qr->qr_regions)); in dlm_query_region_handler()
1162 spin_unlock(&dlm->spinlock); in dlm_query_region_handler()
1172 static int dlm_match_nodes(struct dlm_ctxt *dlm, struct dlm_query_nodeinfo *qn) in dlm_match_nodes() argument
1214 qn->qn_nodenum, dlm->node_num); in dlm_match_nodes()
1221 dlm->node_num, qn->qn_nodenum); in dlm_match_nodes()
1232 static int dlm_send_nodeinfo(struct dlm_ctxt *dlm, unsigned long *node_map) in dlm_send_nodeinfo() argument
1261 qn->qn_nodenum = dlm->node_num; in dlm_send_nodeinfo()
1263 qn->qn_namelen = strlen(dlm->name); in dlm_send_nodeinfo()
1264 memcpy(qn->qn_domain, dlm->name, qn->qn_namelen); in dlm_send_nodeinfo()
1269 if (i == dlm->node_num) in dlm_send_nodeinfo()
1294 struct dlm_ctxt *dlm = NULL; in dlm_query_nodeinfo_handler() local
1303 dlm = __dlm_lookup_domain_full(qn->qn_domain, qn->qn_namelen); in dlm_query_nodeinfo_handler()
1304 if (!dlm) { in dlm_query_nodeinfo_handler()
1310 spin_lock(&dlm->spinlock); in dlm_query_nodeinfo_handler()
1312 if (dlm->joining_node != qn->qn_nodenum) { in dlm_query_nodeinfo_handler()
1315 dlm->joining_node); in dlm_query_nodeinfo_handler()
1320 if (dlm->dlm_locking_proto.pv_major == 1 && in dlm_query_nodeinfo_handler()
1321 dlm->dlm_locking_proto.pv_minor == 0) { in dlm_query_nodeinfo_handler()
1324 qn->qn_domain, dlm->dlm_locking_proto.pv_major, in dlm_query_nodeinfo_handler()
1325 dlm->dlm_locking_proto.pv_minor); in dlm_query_nodeinfo_handler()
1329 status = dlm_match_nodes(dlm, qn); in dlm_query_nodeinfo_handler()
1333 spin_unlock(&dlm->spinlock); in dlm_query_nodeinfo_handler()
1343 struct dlm_ctxt *dlm = NULL; in dlm_cancel_join_handler() local
1351 dlm = __dlm_lookup_domain_full(cancel->domain, cancel->name_len); in dlm_cancel_join_handler()
1353 if (dlm) { in dlm_cancel_join_handler()
1354 spin_lock(&dlm->spinlock); in dlm_cancel_join_handler()
1358 BUG_ON(dlm->joining_node != cancel->node_idx); in dlm_cancel_join_handler()
1359 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_cancel_join_handler()
1361 spin_unlock(&dlm->spinlock); in dlm_cancel_join_handler()
1368 static int dlm_send_one_join_cancel(struct dlm_ctxt *dlm, in dlm_send_one_join_cancel() argument
1375 cancel_msg.node_idx = dlm->node_num; in dlm_send_one_join_cancel()
1376 cancel_msg.name_len = strlen(dlm->name); in dlm_send_one_join_cancel()
1377 memcpy(cancel_msg.domain, dlm->name, cancel_msg.name_len); in dlm_send_one_join_cancel()
1394 static int dlm_send_join_cancels(struct dlm_ctxt *dlm, in dlm_send_join_cancels() argument
1413 if (node == dlm->node_num) in dlm_send_join_cancels()
1416 tmpstat = dlm_send_one_join_cancel(dlm, node); in dlm_send_join_cancels()
1430 static int dlm_request_join(struct dlm_ctxt *dlm, in dlm_request_join() argument
1442 join_msg.node_idx = dlm->node_num; in dlm_request_join()
1443 join_msg.name_len = strlen(dlm->name); in dlm_request_join()
1444 memcpy(join_msg.domain, dlm->name, join_msg.name_len); in dlm_request_join()
1445 join_msg.dlm_proto = dlm->dlm_locking_proto; in dlm_request_join()
1446 join_msg.fs_proto = dlm->fs_locking_proto; in dlm_request_join()
1449 byte_copymap(join_msg.node_map, dlm->live_nodes_map, O2NM_MAX_NODES); in dlm_request_join()
1480 dlm->dlm_locking_proto.pv_major, in dlm_request_join()
1481 dlm->dlm_locking_proto.pv_minor, in dlm_request_join()
1482 dlm->fs_locking_proto.pv_major, in dlm_request_join()
1483 dlm->fs_locking_proto.pv_minor, in dlm_request_join()
1489 dlm->dlm_locking_proto.pv_minor = packet.dlm_minor; in dlm_request_join()
1490 dlm->fs_locking_proto.pv_minor = packet.fs_minor; in dlm_request_join()
1495 dlm->dlm_locking_proto.pv_major, in dlm_request_join()
1496 dlm->dlm_locking_proto.pv_minor, in dlm_request_join()
1497 dlm->fs_locking_proto.pv_major, in dlm_request_join()
1498 dlm->fs_locking_proto.pv_minor); in dlm_request_join()
1517 static int dlm_send_one_join_assert(struct dlm_ctxt *dlm, in dlm_send_one_join_assert() argument
1527 assert_msg.node_idx = dlm->node_num; in dlm_send_one_join_assert()
1528 assert_msg.name_len = strlen(dlm->name); in dlm_send_one_join_assert()
1529 memcpy(assert_msg.domain, dlm->name, assert_msg.name_len); in dlm_send_one_join_assert()
1544 static void dlm_send_join_asserts(struct dlm_ctxt *dlm, in dlm_send_join_asserts() argument
1553 if (node == dlm->node_num) in dlm_send_join_asserts()
1560 status = dlm_send_one_join_assert(dlm, node); in dlm_send_join_asserts()
1562 spin_lock(&dlm->spinlock); in dlm_send_join_asserts()
1563 live = test_bit(node, dlm->live_nodes_map); in dlm_send_join_asserts()
1564 spin_unlock(&dlm->spinlock); in dlm_send_join_asserts()
1583 static int dlm_should_restart_join(struct dlm_ctxt *dlm, in dlm_should_restart_join() argument
1594 spin_lock(&dlm->spinlock); in dlm_should_restart_join()
1597 ret = memcmp(ctxt->live_map, dlm->live_nodes_map, in dlm_should_restart_join()
1598 sizeof(dlm->live_nodes_map)); in dlm_should_restart_join()
1599 spin_unlock(&dlm->spinlock); in dlm_should_restart_join()
1607 static int dlm_try_to_join_domain(struct dlm_ctxt *dlm) in dlm_try_to_join_domain() argument
1613 mlog(0, "%p", dlm); in dlm_try_to_join_domain()
1625 o2hb_fill_node_map(dlm->live_nodes_map, sizeof(dlm->live_nodes_map)); in dlm_try_to_join_domain()
1627 spin_lock(&dlm->spinlock); in dlm_try_to_join_domain()
1628 memcpy(ctxt->live_map, dlm->live_nodes_map, sizeof(ctxt->live_map)); in dlm_try_to_join_domain()
1630 __dlm_set_joining_node(dlm, dlm->node_num); in dlm_try_to_join_domain()
1632 spin_unlock(&dlm->spinlock); in dlm_try_to_join_domain()
1637 if (node == dlm->node_num) in dlm_try_to_join_domain()
1640 status = dlm_request_join(dlm, node, &response); in dlm_try_to_join_domain()
1651 if (dlm_should_restart_join(dlm, ctxt, response)) { in dlm_try_to_join_domain()
1663 spin_lock(&dlm->spinlock); in dlm_try_to_join_domain()
1664 memcpy(dlm->domain_map, ctxt->yes_resp_map, in dlm_try_to_join_domain()
1666 set_bit(dlm->node_num, dlm->domain_map); in dlm_try_to_join_domain()
1667 spin_unlock(&dlm->spinlock); in dlm_try_to_join_domain()
1670 if (dlm->dlm_locking_proto.pv_major > 1 || in dlm_try_to_join_domain()
1671 dlm->dlm_locking_proto.pv_minor > 0) { in dlm_try_to_join_domain()
1672 status = dlm_send_nodeinfo(dlm, ctxt->yes_resp_map); in dlm_try_to_join_domain()
1677 status = dlm_send_regions(dlm, ctxt->yes_resp_map); in dlm_try_to_join_domain()
1684 dlm_send_join_asserts(dlm, ctxt->yes_resp_map); in dlm_try_to_join_domain()
1691 dlm->dlm_state = DLM_CTXT_JOINED; in dlm_try_to_join_domain()
1692 dlm->num_joins++; in dlm_try_to_join_domain()
1696 spin_lock(&dlm->spinlock); in dlm_try_to_join_domain()
1697 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_try_to_join_domain()
1699 printk(KERN_NOTICE "o2dlm: Joining domain %s ", dlm->name); in dlm_try_to_join_domain()
1700 __dlm_print_nodes(dlm); in dlm_try_to_join_domain()
1702 spin_unlock(&dlm->spinlock); in dlm_try_to_join_domain()
1707 tmpstat = dlm_send_join_cancels(dlm, in dlm_try_to_join_domain()
1720 static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm) in dlm_unregister_domain_handlers() argument
1722 o2hb_unregister_callback(dlm->name, &dlm->dlm_hb_up); in dlm_unregister_domain_handlers()
1723 o2hb_unregister_callback(dlm->name, &dlm->dlm_hb_down); in dlm_unregister_domain_handlers()
1724 o2net_unregister_handler_list(&dlm->dlm_domain_handlers); in dlm_unregister_domain_handlers()
1727 static int dlm_register_domain_handlers(struct dlm_ctxt *dlm) in dlm_register_domain_handlers() argument
1733 o2hb_setup_callback(&dlm->dlm_hb_down, O2HB_NODE_DOWN_CB, in dlm_register_domain_handlers()
1734 dlm_hb_node_down_cb, dlm, DLM_HB_NODE_DOWN_PRI); in dlm_register_domain_handlers()
1735 o2hb_setup_callback(&dlm->dlm_hb_up, O2HB_NODE_UP_CB, in dlm_register_domain_handlers()
1736 dlm_hb_node_up_cb, dlm, DLM_HB_NODE_UP_PRI); in dlm_register_domain_handlers()
1738 status = o2hb_register_callback(dlm->name, &dlm->dlm_hb_down); in dlm_register_domain_handlers()
1742 status = o2hb_register_callback(dlm->name, &dlm->dlm_hb_up); in dlm_register_domain_handlers()
1746 status = o2net_register_handler(DLM_MASTER_REQUEST_MSG, dlm->key, in dlm_register_domain_handlers()
1749 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1753 status = o2net_register_handler(DLM_ASSERT_MASTER_MSG, dlm->key, in dlm_register_domain_handlers()
1756 dlm, dlm_assert_master_post_handler, in dlm_register_domain_handlers()
1757 &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1761 status = o2net_register_handler(DLM_CREATE_LOCK_MSG, dlm->key, in dlm_register_domain_handlers()
1764 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1768 status = o2net_register_handler(DLM_CONVERT_LOCK_MSG, dlm->key, in dlm_register_domain_handlers()
1771 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1775 status = o2net_register_handler(DLM_UNLOCK_LOCK_MSG, dlm->key, in dlm_register_domain_handlers()
1778 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1782 status = o2net_register_handler(DLM_PROXY_AST_MSG, dlm->key, in dlm_register_domain_handlers()
1785 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1789 status = o2net_register_handler(DLM_EXIT_DOMAIN_MSG, dlm->key, in dlm_register_domain_handlers()
1792 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1796 status = o2net_register_handler(DLM_DEREF_LOCKRES_MSG, dlm->key, in dlm_register_domain_handlers()
1799 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1803 status = o2net_register_handler(DLM_MIGRATE_REQUEST_MSG, dlm->key, in dlm_register_domain_handlers()
1806 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1810 status = o2net_register_handler(DLM_MIG_LOCKRES_MSG, dlm->key, in dlm_register_domain_handlers()
1813 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1817 status = o2net_register_handler(DLM_MASTER_REQUERY_MSG, dlm->key, in dlm_register_domain_handlers()
1820 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1824 status = o2net_register_handler(DLM_LOCK_REQUEST_MSG, dlm->key, in dlm_register_domain_handlers()
1827 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1831 status = o2net_register_handler(DLM_RECO_DATA_DONE_MSG, dlm->key, in dlm_register_domain_handlers()
1834 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1838 status = o2net_register_handler(DLM_BEGIN_RECO_MSG, dlm->key, in dlm_register_domain_handlers()
1841 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1845 status = o2net_register_handler(DLM_FINALIZE_RECO_MSG, dlm->key, in dlm_register_domain_handlers()
1848 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1852 status = o2net_register_handler(DLM_BEGIN_EXIT_DOMAIN_MSG, dlm->key, in dlm_register_domain_handlers()
1855 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1859 status = o2net_register_handler(DLM_DEREF_LOCKRES_DONE, dlm->key, in dlm_register_domain_handlers()
1862 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1865 dlm_unregister_domain_handlers(dlm); in dlm_register_domain_handlers()
1870 static int dlm_join_domain(struct dlm_ctxt *dlm) in dlm_join_domain() argument
1877 BUG_ON(!dlm); in dlm_join_domain()
1879 mlog(0, "Join domain %s\n", dlm->name); in dlm_join_domain()
1881 status = dlm_register_domain_handlers(dlm); in dlm_join_domain()
1887 status = dlm_launch_thread(dlm); in dlm_join_domain()
1893 status = dlm_launch_recovery_thread(dlm); in dlm_join_domain()
1899 status = dlm_debug_init(dlm); in dlm_join_domain()
1905 snprintf(wq_name, O2NM_MAX_NAME_LEN, "dlm_wq-%s", dlm->name); in dlm_join_domain()
1906 dlm->dlm_worker = alloc_workqueue(wq_name, WQ_MEM_RECLAIM, 0); in dlm_join_domain()
1907 if (!dlm->dlm_worker) { in dlm_join_domain()
1914 status = dlm_try_to_join_domain(dlm); in dlm_join_domain()
1929 "%s after %u msecs\n", dlm->name, in dlm_join_domain()
1959 dlm_unregister_domain_handlers(dlm); in dlm_join_domain()
1960 dlm_debug_shutdown(dlm); in dlm_join_domain()
1961 dlm_complete_thread(dlm); in dlm_join_domain()
1962 dlm_complete_recovery_thread(dlm); in dlm_join_domain()
1963 dlm_destroy_dlm_worker(dlm); in dlm_join_domain()
1974 struct dlm_ctxt *dlm = NULL; in dlm_alloc_ctxt() local
1976 dlm = kzalloc(sizeof(*dlm), GFP_KERNEL); in dlm_alloc_ctxt()
1977 if (!dlm) { in dlm_alloc_ctxt()
1983 dlm->name = kstrdup(domain, GFP_KERNEL); in dlm_alloc_ctxt()
1984 if (dlm->name == NULL) { in dlm_alloc_ctxt()
1990 dlm->lockres_hash = (struct hlist_head **)dlm_alloc_pagevec(DLM_HASH_PAGES); in dlm_alloc_ctxt()
1991 if (!dlm->lockres_hash) { in dlm_alloc_ctxt()
1998 INIT_HLIST_HEAD(dlm_lockres_hash(dlm, i)); in dlm_alloc_ctxt()
2000 dlm->master_hash = (struct hlist_head **) in dlm_alloc_ctxt()
2002 if (!dlm->master_hash) { in dlm_alloc_ctxt()
2009 INIT_HLIST_HEAD(dlm_master_hash(dlm, i)); in dlm_alloc_ctxt()
2011 dlm->key = key; in dlm_alloc_ctxt()
2012 dlm->node_num = o2nm_this_node(); in dlm_alloc_ctxt()
2014 ret = dlm_create_debugfs_subroot(dlm); in dlm_alloc_ctxt()
2018 spin_lock_init(&dlm->spinlock); in dlm_alloc_ctxt()
2019 spin_lock_init(&dlm->master_lock); in dlm_alloc_ctxt()
2020 spin_lock_init(&dlm->ast_lock); in dlm_alloc_ctxt()
2021 spin_lock_init(&dlm->track_lock); in dlm_alloc_ctxt()
2022 INIT_LIST_HEAD(&dlm->list); in dlm_alloc_ctxt()
2023 INIT_LIST_HEAD(&dlm->dirty_list); in dlm_alloc_ctxt()
2024 INIT_LIST_HEAD(&dlm->reco.resources); in dlm_alloc_ctxt()
2025 INIT_LIST_HEAD(&dlm->reco.node_data); in dlm_alloc_ctxt()
2026 INIT_LIST_HEAD(&dlm->purge_list); in dlm_alloc_ctxt()
2027 INIT_LIST_HEAD(&dlm->dlm_domain_handlers); in dlm_alloc_ctxt()
2028 INIT_LIST_HEAD(&dlm->tracking_list); in dlm_alloc_ctxt()
2029 dlm->reco.state = 0; in dlm_alloc_ctxt()
2031 INIT_LIST_HEAD(&dlm->pending_asts); in dlm_alloc_ctxt()
2032 INIT_LIST_HEAD(&dlm->pending_basts); in dlm_alloc_ctxt()
2035 dlm->recovery_map, &(dlm->recovery_map[0])); in dlm_alloc_ctxt()
2037 memset(dlm->recovery_map, 0, sizeof(dlm->recovery_map)); in dlm_alloc_ctxt()
2038 memset(dlm->live_nodes_map, 0, sizeof(dlm->live_nodes_map)); in dlm_alloc_ctxt()
2039 memset(dlm->domain_map, 0, sizeof(dlm->domain_map)); in dlm_alloc_ctxt()
2041 dlm->dlm_thread_task = NULL; in dlm_alloc_ctxt()
2042 dlm->dlm_reco_thread_task = NULL; in dlm_alloc_ctxt()
2043 dlm->dlm_worker = NULL; in dlm_alloc_ctxt()
2044 init_waitqueue_head(&dlm->dlm_thread_wq); in dlm_alloc_ctxt()
2045 init_waitqueue_head(&dlm->dlm_reco_thread_wq); in dlm_alloc_ctxt()
2046 init_waitqueue_head(&dlm->reco.event); in dlm_alloc_ctxt()
2047 init_waitqueue_head(&dlm->ast_wq); in dlm_alloc_ctxt()
2048 init_waitqueue_head(&dlm->migration_wq); in dlm_alloc_ctxt()
2049 INIT_LIST_HEAD(&dlm->mle_hb_events); in dlm_alloc_ctxt()
2051 dlm->joining_node = DLM_LOCK_RES_OWNER_UNKNOWN; in dlm_alloc_ctxt()
2052 init_waitqueue_head(&dlm->dlm_join_events); in dlm_alloc_ctxt()
2054 dlm->migrate_done = 0; in dlm_alloc_ctxt()
2056 dlm->reco.new_master = O2NM_INVALID_NODE_NUM; in dlm_alloc_ctxt()
2057 dlm->reco.dead_node = O2NM_INVALID_NODE_NUM; in dlm_alloc_ctxt()
2059 atomic_set(&dlm->res_tot_count, 0); in dlm_alloc_ctxt()
2060 atomic_set(&dlm->res_cur_count, 0); in dlm_alloc_ctxt()
2062 atomic_set(&dlm->mle_tot_count[i], 0); in dlm_alloc_ctxt()
2063 atomic_set(&dlm->mle_cur_count[i], 0); in dlm_alloc_ctxt()
2066 spin_lock_init(&dlm->work_lock); in dlm_alloc_ctxt()
2067 INIT_LIST_HEAD(&dlm->work_list); in dlm_alloc_ctxt()
2068 INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work); in dlm_alloc_ctxt()
2070 kref_init(&dlm->dlm_refs); in dlm_alloc_ctxt()
2071 dlm->dlm_state = DLM_CTXT_NEW; in dlm_alloc_ctxt()
2073 INIT_LIST_HEAD(&dlm->dlm_eviction_callbacks); in dlm_alloc_ctxt()
2076 kref_read(&dlm->dlm_refs)); in dlm_alloc_ctxt()
2079 if (ret < 0 && dlm) { in dlm_alloc_ctxt()
2080 if (dlm->master_hash) in dlm_alloc_ctxt()
2081 dlm_free_pagevec((void **)dlm->master_hash, in dlm_alloc_ctxt()
2084 if (dlm->lockres_hash) in dlm_alloc_ctxt()
2085 dlm_free_pagevec((void **)dlm->lockres_hash, in dlm_alloc_ctxt()
2088 kfree(dlm->name); in dlm_alloc_ctxt()
2089 kfree(dlm); in dlm_alloc_ctxt()
2090 dlm = NULL; in dlm_alloc_ctxt()
2092 return dlm; in dlm_alloc_ctxt()
2130 struct dlm_ctxt *dlm = NULL; in dlm_register_domain() local
2142 dlm = NULL; in dlm_register_domain()
2151 dlm = __dlm_lookup_domain(domain); in dlm_register_domain()
2152 if (dlm) { in dlm_register_domain()
2153 if (dlm->dlm_state != DLM_CTXT_JOINED) { in dlm_register_domain()
2163 if (dlm_protocol_compare(&dlm->fs_locking_proto, fs_proto)) { in dlm_register_domain()
2173 __dlm_get(dlm); in dlm_register_domain()
2174 dlm->num_joins++; in dlm_register_domain()
2196 dlm = new_ctxt; in dlm_register_domain()
2200 list_add_tail(&dlm->list, &dlm_domains); in dlm_register_domain()
2207 dlm->dlm_locking_proto = dlm_protocol; in dlm_register_domain()
2208 dlm->fs_locking_proto = *fs_proto; in dlm_register_domain()
2210 ret = dlm_join_domain(dlm); in dlm_register_domain()
2213 dlm_put(dlm); in dlm_register_domain()
2218 *fs_proto = dlm->fs_locking_proto; in dlm_register_domain()
2226 dlm = ERR_PTR(ret); in dlm_register_domain()
2228 return dlm; in dlm_register_domain()
2296 void dlm_fire_domain_eviction_callbacks(struct dlm_ctxt *dlm, in dlm_fire_domain_eviction_callbacks() argument
2302 list_for_each_entry(cb, &dlm->dlm_eviction_callbacks, ec_item) { in dlm_fire_domain_eviction_callbacks()
2318 void dlm_register_eviction_cb(struct dlm_ctxt *dlm, in dlm_register_eviction_cb() argument
2322 list_add_tail(&cb->ec_item, &dlm->dlm_eviction_callbacks); in dlm_register_eviction_cb()