Lines Matching refs:dlm

143 static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm);
145 void __dlm_unhash_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_unhash_lockres() argument
150 mlog(0, "%s: Unhash res %.*s\n", dlm->name, res->lockname.len, in __dlm_unhash_lockres()
156 void __dlm_insert_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_insert_lockres() argument
160 assert_spin_locked(&dlm->spinlock); in __dlm_insert_lockres()
162 bucket = dlm_lockres_hash(dlm, res->lockname.hash); in __dlm_insert_lockres()
169 mlog(0, "%s: Hash res %.*s\n", dlm->name, res->lockname.len, in __dlm_insert_lockres()
173 struct dlm_lock_resource * __dlm_lookup_lockres_full(struct dlm_ctxt *dlm, in __dlm_lookup_lockres_full() argument
183 assert_spin_locked(&dlm->spinlock); in __dlm_lookup_lockres_full()
185 bucket = dlm_lockres_hash(dlm, hash); in __dlm_lookup_lockres_full()
206 struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm, in __dlm_lookup_lockres() argument
215 assert_spin_locked(&dlm->spinlock); in __dlm_lookup_lockres()
217 res = __dlm_lookup_lockres_full(dlm, name, len, hash); in __dlm_lookup_lockres()
231 struct dlm_lock_resource * dlm_lookup_lockres(struct dlm_ctxt *dlm, in dlm_lookup_lockres() argument
238 spin_lock(&dlm->spinlock); in dlm_lookup_lockres()
239 res = __dlm_lookup_lockres(dlm, name, len, hash); in dlm_lookup_lockres()
240 spin_unlock(&dlm->spinlock); in dlm_lookup_lockres()
290 static void dlm_free_ctxt_mem(struct dlm_ctxt *dlm) in dlm_free_ctxt_mem() argument
292 dlm_destroy_debugfs_subroot(dlm); in dlm_free_ctxt_mem()
294 if (dlm->lockres_hash) in dlm_free_ctxt_mem()
295 dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); in dlm_free_ctxt_mem()
297 if (dlm->master_hash) in dlm_free_ctxt_mem()
298 dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES); in dlm_free_ctxt_mem()
300 kfree(dlm->name); in dlm_free_ctxt_mem()
301 kfree(dlm); in dlm_free_ctxt_mem()
309 struct dlm_ctxt *dlm; in dlm_ctxt_release() local
311 dlm = container_of(kref, struct dlm_ctxt, dlm_refs); in dlm_ctxt_release()
313 BUG_ON(dlm->num_joins); in dlm_ctxt_release()
314 BUG_ON(dlm->dlm_state == DLM_CTXT_JOINED); in dlm_ctxt_release()
317 list_del_init(&dlm->list); in dlm_ctxt_release()
321 mlog(0, "freeing memory from domain %s\n", dlm->name); in dlm_ctxt_release()
325 dlm_free_ctxt_mem(dlm); in dlm_ctxt_release()
330 void dlm_put(struct dlm_ctxt *dlm) in dlm_put() argument
333 kref_put(&dlm->dlm_refs, dlm_ctxt_release); in dlm_put()
337 static void __dlm_get(struct dlm_ctxt *dlm) in __dlm_get() argument
339 kref_get(&dlm->dlm_refs); in __dlm_get()
345 struct dlm_ctxt *dlm_grab(struct dlm_ctxt *dlm) in dlm_grab() argument
353 if (target == dlm) { in dlm_grab()
365 int dlm_domain_fully_joined(struct dlm_ctxt *dlm) in dlm_domain_fully_joined() argument
370 ret = (dlm->dlm_state == DLM_CTXT_JOINED) || in dlm_domain_fully_joined()
371 (dlm->dlm_state == DLM_CTXT_IN_SHUTDOWN); in dlm_domain_fully_joined()
377 static void dlm_destroy_dlm_worker(struct dlm_ctxt *dlm) in dlm_destroy_dlm_worker() argument
379 if (dlm->dlm_worker) { in dlm_destroy_dlm_worker()
380 destroy_workqueue(dlm->dlm_worker); in dlm_destroy_dlm_worker()
381 dlm->dlm_worker = NULL; in dlm_destroy_dlm_worker()
385 static void dlm_complete_dlm_shutdown(struct dlm_ctxt *dlm) in dlm_complete_dlm_shutdown() argument
387 dlm_unregister_domain_handlers(dlm); in dlm_complete_dlm_shutdown()
388 dlm_complete_thread(dlm); in dlm_complete_dlm_shutdown()
389 dlm_complete_recovery_thread(dlm); in dlm_complete_dlm_shutdown()
390 dlm_destroy_dlm_worker(dlm); in dlm_complete_dlm_shutdown()
396 list_del_init(&dlm->list); in dlm_complete_dlm_shutdown()
403 static int dlm_migrate_all_locks(struct dlm_ctxt *dlm) in dlm_migrate_all_locks() argument
411 mlog(0, "Migrating locks from domain %s\n", dlm->name); in dlm_migrate_all_locks()
414 spin_lock(&dlm->spinlock); in dlm_migrate_all_locks()
418 bucket = dlm_lockres_hash(dlm, i); in dlm_migrate_all_locks()
427 dropped = dlm_empty_lockres(dlm, res); in dlm_migrate_all_locks()
431 __dlm_lockres_calc_usage(dlm, res); in dlm_migrate_all_locks()
439 cond_resched_lock(&dlm->spinlock); in dlm_migrate_all_locks()
443 cond_resched_lock(&dlm->spinlock); in dlm_migrate_all_locks()
448 if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { in dlm_migrate_all_locks()
450 "need to be migrated after dlm recovery\n", dlm->name); in dlm_migrate_all_locks()
454 "all lock resources\n", dlm->name); in dlm_migrate_all_locks()
455 dlm->migrate_done = 1; in dlm_migrate_all_locks()
459 spin_unlock(&dlm->spinlock); in dlm_migrate_all_locks()
460 wake_up(&dlm->dlm_thread_wq); in dlm_migrate_all_locks()
466 dlm->name, num); in dlm_migrate_all_locks()
469 mlog(0, "DONE Migrating locks from domain %s\n", dlm->name); in dlm_migrate_all_locks()
473 static int dlm_no_joining_node(struct dlm_ctxt *dlm) in dlm_no_joining_node() argument
477 spin_lock(&dlm->spinlock); in dlm_no_joining_node()
478 ret = dlm->joining_node == DLM_LOCK_RES_OWNER_UNKNOWN; in dlm_no_joining_node()
479 spin_unlock(&dlm->spinlock); in dlm_no_joining_node()
487 struct dlm_ctxt *dlm = data; in dlm_begin_exit_domain_handler() local
491 if (!dlm_grab(dlm)) in dlm_begin_exit_domain_handler()
495 mlog(0, "%s: Node %u sent a begin exit domain message\n", dlm->name, node); in dlm_begin_exit_domain_handler()
497 spin_lock(&dlm->spinlock); in dlm_begin_exit_domain_handler()
498 set_bit(node, dlm->exit_domain_map); in dlm_begin_exit_domain_handler()
499 spin_unlock(&dlm->spinlock); in dlm_begin_exit_domain_handler()
501 dlm_put(dlm); in dlm_begin_exit_domain_handler()
506 static void dlm_mark_domain_leaving(struct dlm_ctxt *dlm) in dlm_mark_domain_leaving() argument
512 spin_lock(&dlm->spinlock); in dlm_mark_domain_leaving()
514 if (dlm->joining_node != DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_mark_domain_leaving()
516 dlm->joining_node); in dlm_mark_domain_leaving()
517 spin_unlock(&dlm->spinlock); in dlm_mark_domain_leaving()
520 wait_event(dlm->dlm_join_events, dlm_no_joining_node(dlm)); in dlm_mark_domain_leaving()
524 dlm->dlm_state = DLM_CTXT_LEAVING; in dlm_mark_domain_leaving()
525 spin_unlock(&dlm->spinlock); in dlm_mark_domain_leaving()
529 static void __dlm_print_nodes(struct dlm_ctxt *dlm) in __dlm_print_nodes() argument
533 assert_spin_locked(&dlm->spinlock); in __dlm_print_nodes()
536 while ((node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, in __dlm_print_nodes()
547 struct dlm_ctxt *dlm = data; in dlm_exit_domain_handler() local
553 if (!dlm_grab(dlm)) in dlm_exit_domain_handler()
558 spin_lock(&dlm->spinlock); in dlm_exit_domain_handler()
559 clear_bit(node, dlm->domain_map); in dlm_exit_domain_handler()
560 clear_bit(node, dlm->exit_domain_map); in dlm_exit_domain_handler()
561 printk(KERN_NOTICE "o2dlm: Node %u leaves domain %s ", node, dlm->name); in dlm_exit_domain_handler()
562 __dlm_print_nodes(dlm); in dlm_exit_domain_handler()
565 dlm_hb_event_notify_attached(dlm, node, 0); in dlm_exit_domain_handler()
567 spin_unlock(&dlm->spinlock); in dlm_exit_domain_handler()
569 dlm_put(dlm); in dlm_exit_domain_handler()
574 static int dlm_send_one_domain_exit(struct dlm_ctxt *dlm, u32 msg_type, in dlm_send_one_domain_exit() argument
580 mlog(0, "%s: Sending domain exit message %u to node %u\n", dlm->name, in dlm_send_one_domain_exit()
584 leave_msg.node_idx = dlm->node_num; in dlm_send_one_domain_exit()
586 status = o2net_send_message(msg_type, dlm->key, &leave_msg, in dlm_send_one_domain_exit()
591 dlm->name); in dlm_send_one_domain_exit()
596 static void dlm_begin_exit_domain(struct dlm_ctxt *dlm) in dlm_begin_exit_domain() argument
601 if (dlm->dlm_locking_proto.pv_major == 1 && in dlm_begin_exit_domain()
602 dlm->dlm_locking_proto.pv_minor < 2) in dlm_begin_exit_domain()
610 spin_lock(&dlm->spinlock); in dlm_begin_exit_domain()
612 node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, node + 1); in dlm_begin_exit_domain()
615 if (node == dlm->node_num) in dlm_begin_exit_domain()
618 spin_unlock(&dlm->spinlock); in dlm_begin_exit_domain()
619 dlm_send_one_domain_exit(dlm, DLM_BEGIN_EXIT_DOMAIN_MSG, node); in dlm_begin_exit_domain()
620 spin_lock(&dlm->spinlock); in dlm_begin_exit_domain()
622 spin_unlock(&dlm->spinlock); in dlm_begin_exit_domain()
625 static void dlm_leave_domain(struct dlm_ctxt *dlm) in dlm_leave_domain() argument
634 spin_lock(&dlm->spinlock); in dlm_leave_domain()
636 clear_bit(dlm->node_num, dlm->domain_map); in dlm_leave_domain()
637 while ((node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, in dlm_leave_domain()
645 spin_unlock(&dlm->spinlock); in dlm_leave_domain()
649 status = dlm_send_one_domain_exit(dlm, DLM_EXIT_DOMAIN_MSG, in dlm_leave_domain()
664 spin_lock(&dlm->spinlock); in dlm_leave_domain()
668 clear_bit(node, dlm->domain_map); in dlm_leave_domain()
670 spin_unlock(&dlm->spinlock); in dlm_leave_domain()
673 void dlm_unregister_domain(struct dlm_ctxt *dlm) in dlm_unregister_domain() argument
679 BUG_ON(dlm->dlm_state != DLM_CTXT_JOINED); in dlm_unregister_domain()
680 BUG_ON(!dlm->num_joins); in dlm_unregister_domain()
682 dlm->num_joins--; in dlm_unregister_domain()
683 if (!dlm->num_joins) { in dlm_unregister_domain()
690 dlm->dlm_state = DLM_CTXT_IN_SHUTDOWN; in dlm_unregister_domain()
696 mlog(0, "shutting down domain %s\n", dlm->name); in dlm_unregister_domain()
697 dlm_begin_exit_domain(dlm); in dlm_unregister_domain()
700 dlm_kick_thread(dlm, NULL); in dlm_unregister_domain()
702 while (dlm_migrate_all_locks(dlm)) { in dlm_unregister_domain()
705 mlog(0, "%s: more migration to do\n", dlm->name); in dlm_unregister_domain()
709 if (!list_empty(&dlm->tracking_list)) { in dlm_unregister_domain()
712 list_for_each_entry(res, &dlm->tracking_list, tracking) in dlm_unregister_domain()
716 dlm_mark_domain_leaving(dlm); in dlm_unregister_domain()
717 dlm_leave_domain(dlm); in dlm_unregister_domain()
718 printk(KERN_NOTICE "o2dlm: Leaving domain %s\n", dlm->name); in dlm_unregister_domain()
719 dlm_force_free_mles(dlm); in dlm_unregister_domain()
720 dlm_complete_dlm_shutdown(dlm); in dlm_unregister_domain()
722 dlm_put(dlm); in dlm_unregister_domain()
796 struct dlm_ctxt *dlm = NULL; in dlm_query_join_handler() local
821 dlm = __dlm_lookup_domain_full(query->domain, query->name_len); in dlm_query_join_handler()
822 if (!dlm) in dlm_query_join_handler()
832 if (test_bit(nodenum, dlm->domain_map)) { in dlm_query_join_handler()
848 if (dlm->dlm_state != DLM_CTXT_LEAVING) { in dlm_query_join_handler()
850 spin_lock(&dlm->spinlock); in dlm_query_join_handler()
852 if (dlm->dlm_state == DLM_CTXT_NEW && in dlm_query_join_handler()
853 dlm->joining_node == DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_query_join_handler()
858 } else if (dlm->joining_node != DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_query_join_handler()
861 } else if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { in dlm_query_join_handler()
865 } else if (test_bit(bit, dlm->recovery_map)) { in dlm_query_join_handler()
869 } else if (test_bit(bit, dlm->domain_map)) { in dlm_query_join_handler()
882 &dlm->dlm_locking_proto, in dlm_query_join_handler()
886 &dlm->fs_locking_proto, in dlm_query_join_handler()
893 __dlm_set_joining_node(dlm, query->node_idx); in dlm_query_join_handler()
897 spin_unlock(&dlm->spinlock); in dlm_query_join_handler()
913 struct dlm_ctxt *dlm = NULL; in dlm_assert_joined_handler() local
921 dlm = __dlm_lookup_domain_full(assert->domain, assert->name_len); in dlm_assert_joined_handler()
923 if (dlm) { in dlm_assert_joined_handler()
924 spin_lock(&dlm->spinlock); in dlm_assert_joined_handler()
929 BUG_ON(dlm->joining_node != assert->node_idx); in dlm_assert_joined_handler()
931 if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { in dlm_assert_joined_handler()
933 spin_unlock(&dlm->spinlock); in dlm_assert_joined_handler()
938 set_bit(assert->node_idx, dlm->domain_map); in dlm_assert_joined_handler()
939 clear_bit(assert->node_idx, dlm->exit_domain_map); in dlm_assert_joined_handler()
940 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_assert_joined_handler()
943 assert->node_idx, dlm->name); in dlm_assert_joined_handler()
944 __dlm_print_nodes(dlm); in dlm_assert_joined_handler()
947 dlm_hb_event_notify_attached(dlm, assert->node_idx, 1); in dlm_assert_joined_handler()
949 spin_unlock(&dlm->spinlock); in dlm_assert_joined_handler()
956 static int dlm_match_regions(struct dlm_ctxt *dlm, in dlm_match_regions() argument
969 qr->qr_domain, qr->qr_node, dlm->node_num); in dlm_match_regions()
978 qr->qr_domain, dlm->node_num, qr->qr_node); in dlm_match_regions()
1009 dlm->node_num, qr->qr_node); in dlm_match_regions()
1032 qr->qr_node, dlm->node_num); in dlm_match_regions()
1042 static int dlm_send_regions(struct dlm_ctxt *dlm, unsigned long *node_map) in dlm_send_regions() argument
1058 qr->qr_node = dlm->node_num; in dlm_send_regions()
1059 qr->qr_namelen = strlen(dlm->name); in dlm_send_regions()
1060 memcpy(qr->qr_domain, dlm->name, qr->qr_namelen); in dlm_send_regions()
1073 if (i == dlm->node_num) in dlm_send_regions()
1099 struct dlm_ctxt *dlm = NULL; in dlm_query_region_handler() local
1116 dlm = __dlm_lookup_domain_full(qr->qr_domain, qr->qr_namelen); in dlm_query_region_handler()
1117 if (!dlm) { in dlm_query_region_handler()
1123 spin_lock(&dlm->spinlock); in dlm_query_region_handler()
1124 if (dlm->joining_node != qr->qr_node) { in dlm_query_region_handler()
1127 dlm->joining_node); in dlm_query_region_handler()
1132 if (dlm->dlm_locking_proto.pv_major == 1 && in dlm_query_region_handler()
1133 dlm->dlm_locking_proto.pv_minor == 0) { in dlm_query_region_handler()
1136 qr->qr_domain, dlm->dlm_locking_proto.pv_major, in dlm_query_region_handler()
1137 dlm->dlm_locking_proto.pv_minor); in dlm_query_region_handler()
1141 status = dlm_match_regions(dlm, qr, local, sizeof(qr->qr_regions)); in dlm_query_region_handler()
1144 spin_unlock(&dlm->spinlock); in dlm_query_region_handler()
1154 static int dlm_match_nodes(struct dlm_ctxt *dlm, struct dlm_query_nodeinfo *qn) in dlm_match_nodes() argument
1196 qn->qn_nodenum, dlm->node_num); in dlm_match_nodes()
1203 dlm->node_num, qn->qn_nodenum); in dlm_match_nodes()
1214 static int dlm_send_nodeinfo(struct dlm_ctxt *dlm, unsigned long *node_map) in dlm_send_nodeinfo() argument
1243 qn->qn_nodenum = dlm->node_num; in dlm_send_nodeinfo()
1245 qn->qn_namelen = strlen(dlm->name); in dlm_send_nodeinfo()
1246 memcpy(qn->qn_domain, dlm->name, qn->qn_namelen); in dlm_send_nodeinfo()
1251 if (i == dlm->node_num) in dlm_send_nodeinfo()
1276 struct dlm_ctxt *dlm = NULL; in dlm_query_nodeinfo_handler() local
1285 dlm = __dlm_lookup_domain_full(qn->qn_domain, qn->qn_namelen); in dlm_query_nodeinfo_handler()
1286 if (!dlm) { in dlm_query_nodeinfo_handler()
1292 spin_lock(&dlm->spinlock); in dlm_query_nodeinfo_handler()
1294 if (dlm->joining_node != qn->qn_nodenum) { in dlm_query_nodeinfo_handler()
1297 dlm->joining_node); in dlm_query_nodeinfo_handler()
1302 if (dlm->dlm_locking_proto.pv_major == 1 && in dlm_query_nodeinfo_handler()
1303 dlm->dlm_locking_proto.pv_minor == 0) { in dlm_query_nodeinfo_handler()
1306 qn->qn_domain, dlm->dlm_locking_proto.pv_major, in dlm_query_nodeinfo_handler()
1307 dlm->dlm_locking_proto.pv_minor); in dlm_query_nodeinfo_handler()
1311 status = dlm_match_nodes(dlm, qn); in dlm_query_nodeinfo_handler()
1315 spin_unlock(&dlm->spinlock); in dlm_query_nodeinfo_handler()
1325 struct dlm_ctxt *dlm = NULL; in dlm_cancel_join_handler() local
1333 dlm = __dlm_lookup_domain_full(cancel->domain, cancel->name_len); in dlm_cancel_join_handler()
1335 if (dlm) { in dlm_cancel_join_handler()
1336 spin_lock(&dlm->spinlock); in dlm_cancel_join_handler()
1340 BUG_ON(dlm->joining_node != cancel->node_idx); in dlm_cancel_join_handler()
1341 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_cancel_join_handler()
1343 spin_unlock(&dlm->spinlock); in dlm_cancel_join_handler()
1350 static int dlm_send_one_join_cancel(struct dlm_ctxt *dlm, in dlm_send_one_join_cancel() argument
1357 cancel_msg.node_idx = dlm->node_num; in dlm_send_one_join_cancel()
1358 cancel_msg.name_len = strlen(dlm->name); in dlm_send_one_join_cancel()
1359 memcpy(cancel_msg.domain, dlm->name, cancel_msg.name_len); in dlm_send_one_join_cancel()
1376 static int dlm_send_join_cancels(struct dlm_ctxt *dlm, in dlm_send_join_cancels() argument
1395 if (node == dlm->node_num) in dlm_send_join_cancels()
1398 tmpstat = dlm_send_one_join_cancel(dlm, node); in dlm_send_join_cancels()
1412 static int dlm_request_join(struct dlm_ctxt *dlm, in dlm_request_join() argument
1424 join_msg.node_idx = dlm->node_num; in dlm_request_join()
1425 join_msg.name_len = strlen(dlm->name); in dlm_request_join()
1426 memcpy(join_msg.domain, dlm->name, join_msg.name_len); in dlm_request_join()
1427 join_msg.dlm_proto = dlm->dlm_locking_proto; in dlm_request_join()
1428 join_msg.fs_proto = dlm->fs_locking_proto; in dlm_request_join()
1431 byte_copymap(join_msg.node_map, dlm->live_nodes_map, O2NM_MAX_NODES); in dlm_request_join()
1462 dlm->dlm_locking_proto.pv_major, in dlm_request_join()
1463 dlm->dlm_locking_proto.pv_minor, in dlm_request_join()
1464 dlm->fs_locking_proto.pv_major, in dlm_request_join()
1465 dlm->fs_locking_proto.pv_minor, in dlm_request_join()
1471 dlm->dlm_locking_proto.pv_minor = packet.dlm_minor; in dlm_request_join()
1472 dlm->fs_locking_proto.pv_minor = packet.fs_minor; in dlm_request_join()
1477 dlm->dlm_locking_proto.pv_major, in dlm_request_join()
1478 dlm->dlm_locking_proto.pv_minor, in dlm_request_join()
1479 dlm->fs_locking_proto.pv_major, in dlm_request_join()
1480 dlm->fs_locking_proto.pv_minor); in dlm_request_join()
1499 static int dlm_send_one_join_assert(struct dlm_ctxt *dlm, in dlm_send_one_join_assert() argument
1509 assert_msg.node_idx = dlm->node_num; in dlm_send_one_join_assert()
1510 assert_msg.name_len = strlen(dlm->name); in dlm_send_one_join_assert()
1511 memcpy(assert_msg.domain, dlm->name, assert_msg.name_len); in dlm_send_one_join_assert()
1526 static void dlm_send_join_asserts(struct dlm_ctxt *dlm, in dlm_send_join_asserts() argument
1535 if (node == dlm->node_num) in dlm_send_join_asserts()
1542 status = dlm_send_one_join_assert(dlm, node); in dlm_send_join_asserts()
1544 spin_lock(&dlm->spinlock); in dlm_send_join_asserts()
1545 live = test_bit(node, dlm->live_nodes_map); in dlm_send_join_asserts()
1546 spin_unlock(&dlm->spinlock); in dlm_send_join_asserts()
1565 static int dlm_should_restart_join(struct dlm_ctxt *dlm, in dlm_should_restart_join() argument
1576 spin_lock(&dlm->spinlock); in dlm_should_restart_join()
1579 ret = memcmp(ctxt->live_map, dlm->live_nodes_map, in dlm_should_restart_join()
1580 sizeof(dlm->live_nodes_map)); in dlm_should_restart_join()
1581 spin_unlock(&dlm->spinlock); in dlm_should_restart_join()
1589 static int dlm_try_to_join_domain(struct dlm_ctxt *dlm) in dlm_try_to_join_domain() argument
1595 mlog(0, "%p", dlm); in dlm_try_to_join_domain()
1607 o2hb_fill_node_map(dlm->live_nodes_map, sizeof(dlm->live_nodes_map)); in dlm_try_to_join_domain()
1609 spin_lock(&dlm->spinlock); in dlm_try_to_join_domain()
1610 memcpy(ctxt->live_map, dlm->live_nodes_map, sizeof(ctxt->live_map)); in dlm_try_to_join_domain()
1612 __dlm_set_joining_node(dlm, dlm->node_num); in dlm_try_to_join_domain()
1614 spin_unlock(&dlm->spinlock); in dlm_try_to_join_domain()
1619 if (node == dlm->node_num) in dlm_try_to_join_domain()
1622 status = dlm_request_join(dlm, node, &response); in dlm_try_to_join_domain()
1633 if (dlm_should_restart_join(dlm, ctxt, response)) { in dlm_try_to_join_domain()
1645 spin_lock(&dlm->spinlock); in dlm_try_to_join_domain()
1646 memcpy(dlm->domain_map, ctxt->yes_resp_map, in dlm_try_to_join_domain()
1648 set_bit(dlm->node_num, dlm->domain_map); in dlm_try_to_join_domain()
1649 spin_unlock(&dlm->spinlock); in dlm_try_to_join_domain()
1652 if (dlm->dlm_locking_proto.pv_major > 1 || in dlm_try_to_join_domain()
1653 dlm->dlm_locking_proto.pv_minor > 0) { in dlm_try_to_join_domain()
1654 status = dlm_send_nodeinfo(dlm, ctxt->yes_resp_map); in dlm_try_to_join_domain()
1659 status = dlm_send_regions(dlm, ctxt->yes_resp_map); in dlm_try_to_join_domain()
1666 dlm_send_join_asserts(dlm, ctxt->yes_resp_map); in dlm_try_to_join_domain()
1673 dlm->dlm_state = DLM_CTXT_JOINED; in dlm_try_to_join_domain()
1674 dlm->num_joins++; in dlm_try_to_join_domain()
1678 spin_lock(&dlm->spinlock); in dlm_try_to_join_domain()
1679 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_try_to_join_domain()
1681 printk(KERN_NOTICE "o2dlm: Joining domain %s ", dlm->name); in dlm_try_to_join_domain()
1682 __dlm_print_nodes(dlm); in dlm_try_to_join_domain()
1684 spin_unlock(&dlm->spinlock); in dlm_try_to_join_domain()
1689 tmpstat = dlm_send_join_cancels(dlm, in dlm_try_to_join_domain()
1702 static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm) in dlm_unregister_domain_handlers() argument
1704 o2hb_unregister_callback(dlm->name, &dlm->dlm_hb_up); in dlm_unregister_domain_handlers()
1705 o2hb_unregister_callback(dlm->name, &dlm->dlm_hb_down); in dlm_unregister_domain_handlers()
1706 o2net_unregister_handler_list(&dlm->dlm_domain_handlers); in dlm_unregister_domain_handlers()
1709 static int dlm_register_domain_handlers(struct dlm_ctxt *dlm) in dlm_register_domain_handlers() argument
1715 o2hb_setup_callback(&dlm->dlm_hb_down, O2HB_NODE_DOWN_CB, in dlm_register_domain_handlers()
1716 dlm_hb_node_down_cb, dlm, DLM_HB_NODE_DOWN_PRI); in dlm_register_domain_handlers()
1717 o2hb_setup_callback(&dlm->dlm_hb_up, O2HB_NODE_UP_CB, in dlm_register_domain_handlers()
1718 dlm_hb_node_up_cb, dlm, DLM_HB_NODE_UP_PRI); in dlm_register_domain_handlers()
1720 status = o2hb_register_callback(dlm->name, &dlm->dlm_hb_down); in dlm_register_domain_handlers()
1724 status = o2hb_register_callback(dlm->name, &dlm->dlm_hb_up); in dlm_register_domain_handlers()
1728 status = o2net_register_handler(DLM_MASTER_REQUEST_MSG, dlm->key, in dlm_register_domain_handlers()
1731 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1735 status = o2net_register_handler(DLM_ASSERT_MASTER_MSG, dlm->key, in dlm_register_domain_handlers()
1738 dlm, dlm_assert_master_post_handler, in dlm_register_domain_handlers()
1739 &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1743 status = o2net_register_handler(DLM_CREATE_LOCK_MSG, dlm->key, in dlm_register_domain_handlers()
1746 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1750 status = o2net_register_handler(DLM_CONVERT_LOCK_MSG, dlm->key, in dlm_register_domain_handlers()
1753 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1757 status = o2net_register_handler(DLM_UNLOCK_LOCK_MSG, dlm->key, in dlm_register_domain_handlers()
1760 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1764 status = o2net_register_handler(DLM_PROXY_AST_MSG, dlm->key, in dlm_register_domain_handlers()
1767 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1771 status = o2net_register_handler(DLM_EXIT_DOMAIN_MSG, dlm->key, in dlm_register_domain_handlers()
1774 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1778 status = o2net_register_handler(DLM_DEREF_LOCKRES_MSG, dlm->key, in dlm_register_domain_handlers()
1781 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1785 status = o2net_register_handler(DLM_MIGRATE_REQUEST_MSG, dlm->key, in dlm_register_domain_handlers()
1788 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1792 status = o2net_register_handler(DLM_MIG_LOCKRES_MSG, dlm->key, in dlm_register_domain_handlers()
1795 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1799 status = o2net_register_handler(DLM_MASTER_REQUERY_MSG, dlm->key, in dlm_register_domain_handlers()
1802 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1806 status = o2net_register_handler(DLM_LOCK_REQUEST_MSG, dlm->key, in dlm_register_domain_handlers()
1809 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1813 status = o2net_register_handler(DLM_RECO_DATA_DONE_MSG, dlm->key, in dlm_register_domain_handlers()
1816 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1820 status = o2net_register_handler(DLM_BEGIN_RECO_MSG, dlm->key, in dlm_register_domain_handlers()
1823 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1827 status = o2net_register_handler(DLM_FINALIZE_RECO_MSG, dlm->key, in dlm_register_domain_handlers()
1830 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1834 status = o2net_register_handler(DLM_BEGIN_EXIT_DOMAIN_MSG, dlm->key, in dlm_register_domain_handlers()
1837 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1841 status = o2net_register_handler(DLM_DEREF_LOCKRES_DONE, dlm->key, in dlm_register_domain_handlers()
1844 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1847 dlm_unregister_domain_handlers(dlm); in dlm_register_domain_handlers()
1852 static int dlm_join_domain(struct dlm_ctxt *dlm) in dlm_join_domain() argument
1859 BUG_ON(!dlm); in dlm_join_domain()
1861 mlog(0, "Join domain %s\n", dlm->name); in dlm_join_domain()
1863 status = dlm_register_domain_handlers(dlm); in dlm_join_domain()
1869 status = dlm_launch_thread(dlm); in dlm_join_domain()
1875 status = dlm_launch_recovery_thread(dlm); in dlm_join_domain()
1881 dlm_debug_init(dlm); in dlm_join_domain()
1883 snprintf(wq_name, O2NM_MAX_NAME_LEN, "dlm_wq-%s", dlm->name); in dlm_join_domain()
1884 dlm->dlm_worker = alloc_workqueue(wq_name, WQ_MEM_RECLAIM, 0); in dlm_join_domain()
1885 if (!dlm->dlm_worker) { in dlm_join_domain()
1892 status = dlm_try_to_join_domain(dlm); in dlm_join_domain()
1907 "%s after %u msecs\n", dlm->name, in dlm_join_domain()
1937 dlm_unregister_domain_handlers(dlm); in dlm_join_domain()
1938 dlm_complete_thread(dlm); in dlm_join_domain()
1939 dlm_complete_recovery_thread(dlm); in dlm_join_domain()
1940 dlm_destroy_dlm_worker(dlm); in dlm_join_domain()
1951 struct dlm_ctxt *dlm = NULL; in dlm_alloc_ctxt() local
1953 dlm = kzalloc(sizeof(*dlm), GFP_KERNEL); in dlm_alloc_ctxt()
1954 if (!dlm) { in dlm_alloc_ctxt()
1960 dlm->name = kstrdup(domain, GFP_KERNEL); in dlm_alloc_ctxt()
1961 if (dlm->name == NULL) { in dlm_alloc_ctxt()
1967 dlm->lockres_hash = (struct hlist_head **)dlm_alloc_pagevec(DLM_HASH_PAGES); in dlm_alloc_ctxt()
1968 if (!dlm->lockres_hash) { in dlm_alloc_ctxt()
1975 INIT_HLIST_HEAD(dlm_lockres_hash(dlm, i)); in dlm_alloc_ctxt()
1977 dlm->master_hash = (struct hlist_head **) in dlm_alloc_ctxt()
1979 if (!dlm->master_hash) { in dlm_alloc_ctxt()
1986 INIT_HLIST_HEAD(dlm_master_hash(dlm, i)); in dlm_alloc_ctxt()
1988 dlm->key = key; in dlm_alloc_ctxt()
1989 dlm->node_num = o2nm_this_node(); in dlm_alloc_ctxt()
1991 dlm_create_debugfs_subroot(dlm); in dlm_alloc_ctxt()
1993 spin_lock_init(&dlm->spinlock); in dlm_alloc_ctxt()
1994 spin_lock_init(&dlm->master_lock); in dlm_alloc_ctxt()
1995 spin_lock_init(&dlm->ast_lock); in dlm_alloc_ctxt()
1996 spin_lock_init(&dlm->track_lock); in dlm_alloc_ctxt()
1997 INIT_LIST_HEAD(&dlm->list); in dlm_alloc_ctxt()
1998 INIT_LIST_HEAD(&dlm->dirty_list); in dlm_alloc_ctxt()
1999 INIT_LIST_HEAD(&dlm->reco.resources); in dlm_alloc_ctxt()
2000 INIT_LIST_HEAD(&dlm->reco.node_data); in dlm_alloc_ctxt()
2001 INIT_LIST_HEAD(&dlm->purge_list); in dlm_alloc_ctxt()
2002 INIT_LIST_HEAD(&dlm->dlm_domain_handlers); in dlm_alloc_ctxt()
2003 INIT_LIST_HEAD(&dlm->tracking_list); in dlm_alloc_ctxt()
2004 dlm->reco.state = 0; in dlm_alloc_ctxt()
2006 INIT_LIST_HEAD(&dlm->pending_asts); in dlm_alloc_ctxt()
2007 INIT_LIST_HEAD(&dlm->pending_basts); in dlm_alloc_ctxt()
2010 dlm->recovery_map, &(dlm->recovery_map[0])); in dlm_alloc_ctxt()
2012 memset(dlm->recovery_map, 0, sizeof(dlm->recovery_map)); in dlm_alloc_ctxt()
2013 memset(dlm->live_nodes_map, 0, sizeof(dlm->live_nodes_map)); in dlm_alloc_ctxt()
2014 memset(dlm->domain_map, 0, sizeof(dlm->domain_map)); in dlm_alloc_ctxt()
2016 dlm->dlm_thread_task = NULL; in dlm_alloc_ctxt()
2017 dlm->dlm_reco_thread_task = NULL; in dlm_alloc_ctxt()
2018 dlm->dlm_worker = NULL; in dlm_alloc_ctxt()
2019 init_waitqueue_head(&dlm->dlm_thread_wq); in dlm_alloc_ctxt()
2020 init_waitqueue_head(&dlm->dlm_reco_thread_wq); in dlm_alloc_ctxt()
2021 init_waitqueue_head(&dlm->reco.event); in dlm_alloc_ctxt()
2022 init_waitqueue_head(&dlm->ast_wq); in dlm_alloc_ctxt()
2023 init_waitqueue_head(&dlm->migration_wq); in dlm_alloc_ctxt()
2024 INIT_LIST_HEAD(&dlm->mle_hb_events); in dlm_alloc_ctxt()
2026 dlm->joining_node = DLM_LOCK_RES_OWNER_UNKNOWN; in dlm_alloc_ctxt()
2027 init_waitqueue_head(&dlm->dlm_join_events); in dlm_alloc_ctxt()
2029 dlm->migrate_done = 0; in dlm_alloc_ctxt()
2031 dlm->reco.new_master = O2NM_INVALID_NODE_NUM; in dlm_alloc_ctxt()
2032 dlm->reco.dead_node = O2NM_INVALID_NODE_NUM; in dlm_alloc_ctxt()
2034 atomic_set(&dlm->res_tot_count, 0); in dlm_alloc_ctxt()
2035 atomic_set(&dlm->res_cur_count, 0); in dlm_alloc_ctxt()
2037 atomic_set(&dlm->mle_tot_count[i], 0); in dlm_alloc_ctxt()
2038 atomic_set(&dlm->mle_cur_count[i], 0); in dlm_alloc_ctxt()
2041 spin_lock_init(&dlm->work_lock); in dlm_alloc_ctxt()
2042 INIT_LIST_HEAD(&dlm->work_list); in dlm_alloc_ctxt()
2043 INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work); in dlm_alloc_ctxt()
2045 kref_init(&dlm->dlm_refs); in dlm_alloc_ctxt()
2046 dlm->dlm_state = DLM_CTXT_NEW; in dlm_alloc_ctxt()
2048 INIT_LIST_HEAD(&dlm->dlm_eviction_callbacks); in dlm_alloc_ctxt()
2051 kref_read(&dlm->dlm_refs)); in dlm_alloc_ctxt()
2055 if (ret < 0 && dlm) { in dlm_alloc_ctxt()
2056 if (dlm->master_hash) in dlm_alloc_ctxt()
2057 dlm_free_pagevec((void **)dlm->master_hash, in dlm_alloc_ctxt()
2060 if (dlm->lockres_hash) in dlm_alloc_ctxt()
2061 dlm_free_pagevec((void **)dlm->lockres_hash, in dlm_alloc_ctxt()
2064 kfree(dlm->name); in dlm_alloc_ctxt()
2065 kfree(dlm); in dlm_alloc_ctxt()
2066 dlm = NULL; in dlm_alloc_ctxt()
2068 return dlm; in dlm_alloc_ctxt()
2106 struct dlm_ctxt *dlm = NULL; in dlm_register_domain() local
2118 dlm = NULL; in dlm_register_domain()
2127 dlm = __dlm_lookup_domain(domain); in dlm_register_domain()
2128 if (dlm) { in dlm_register_domain()
2129 if (dlm->dlm_state != DLM_CTXT_JOINED) { in dlm_register_domain()
2139 if (dlm_protocol_compare(&dlm->fs_locking_proto, fs_proto)) { in dlm_register_domain()
2149 __dlm_get(dlm); in dlm_register_domain()
2150 dlm->num_joins++; in dlm_register_domain()
2172 dlm = new_ctxt; in dlm_register_domain()
2176 list_add_tail(&dlm->list, &dlm_domains); in dlm_register_domain()
2183 dlm->dlm_locking_proto = dlm_protocol; in dlm_register_domain()
2184 dlm->fs_locking_proto = *fs_proto; in dlm_register_domain()
2186 ret = dlm_join_domain(dlm); in dlm_register_domain()
2189 dlm_put(dlm); in dlm_register_domain()
2194 *fs_proto = dlm->fs_locking_proto; in dlm_register_domain()
2202 dlm = ERR_PTR(ret); in dlm_register_domain()
2204 return dlm; in dlm_register_domain()
2272 void dlm_fire_domain_eviction_callbacks(struct dlm_ctxt *dlm, in dlm_fire_domain_eviction_callbacks() argument
2278 list_for_each_entry(cb, &dlm->dlm_eviction_callbacks, ec_item) { in dlm_fire_domain_eviction_callbacks()
2294 void dlm_register_eviction_cb(struct dlm_ctxt *dlm, in dlm_register_eviction_cb() argument
2298 list_add_tail(&cb->ec_item, &dlm->dlm_eviction_callbacks); in dlm_register_eviction_cb()