• Home
  • Raw
  • Download

Lines Matching refs:dlm

145 static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm);
147 void __dlm_unhash_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_unhash_lockres() argument
152 mlog(0, "%s: Unhash res %.*s\n", dlm->name, res->lockname.len, in __dlm_unhash_lockres()
158 void __dlm_insert_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_insert_lockres() argument
162 assert_spin_locked(&dlm->spinlock); in __dlm_insert_lockres()
164 bucket = dlm_lockres_hash(dlm, res->lockname.hash); in __dlm_insert_lockres()
171 mlog(0, "%s: Hash res %.*s\n", dlm->name, res->lockname.len, in __dlm_insert_lockres()
175 struct dlm_lock_resource * __dlm_lookup_lockres_full(struct dlm_ctxt *dlm, in __dlm_lookup_lockres_full() argument
185 assert_spin_locked(&dlm->spinlock); in __dlm_lookup_lockres_full()
187 bucket = dlm_lockres_hash(dlm, hash); in __dlm_lookup_lockres_full()
208 struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm, in __dlm_lookup_lockres() argument
217 assert_spin_locked(&dlm->spinlock); in __dlm_lookup_lockres()
219 res = __dlm_lookup_lockres_full(dlm, name, len, hash); in __dlm_lookup_lockres()
233 struct dlm_lock_resource * dlm_lookup_lockres(struct dlm_ctxt *dlm, in dlm_lookup_lockres() argument
240 spin_lock(&dlm->spinlock); in dlm_lookup_lockres()
241 res = __dlm_lookup_lockres(dlm, name, len, hash); in dlm_lookup_lockres()
242 spin_unlock(&dlm->spinlock); in dlm_lookup_lockres()
292 static void dlm_free_ctxt_mem(struct dlm_ctxt *dlm) in dlm_free_ctxt_mem() argument
294 dlm_destroy_debugfs_subroot(dlm); in dlm_free_ctxt_mem()
296 if (dlm->lockres_hash) in dlm_free_ctxt_mem()
297 dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); in dlm_free_ctxt_mem()
299 if (dlm->master_hash) in dlm_free_ctxt_mem()
300 dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES); in dlm_free_ctxt_mem()
302 kfree(dlm->name); in dlm_free_ctxt_mem()
303 kfree(dlm); in dlm_free_ctxt_mem()
311 struct dlm_ctxt *dlm; in dlm_ctxt_release() local
313 dlm = container_of(kref, struct dlm_ctxt, dlm_refs); in dlm_ctxt_release()
315 BUG_ON(dlm->num_joins); in dlm_ctxt_release()
316 BUG_ON(dlm->dlm_state == DLM_CTXT_JOINED); in dlm_ctxt_release()
319 list_del_init(&dlm->list); in dlm_ctxt_release()
323 mlog(0, "freeing memory from domain %s\n", dlm->name); in dlm_ctxt_release()
327 dlm_free_ctxt_mem(dlm); in dlm_ctxt_release()
332 void dlm_put(struct dlm_ctxt *dlm) in dlm_put() argument
335 kref_put(&dlm->dlm_refs, dlm_ctxt_release); in dlm_put()
339 static void __dlm_get(struct dlm_ctxt *dlm) in __dlm_get() argument
341 kref_get(&dlm->dlm_refs); in __dlm_get()
347 struct dlm_ctxt *dlm_grab(struct dlm_ctxt *dlm) in dlm_grab() argument
355 if (target == dlm) { in dlm_grab()
367 int dlm_domain_fully_joined(struct dlm_ctxt *dlm) in dlm_domain_fully_joined() argument
372 ret = (dlm->dlm_state == DLM_CTXT_JOINED) || in dlm_domain_fully_joined()
373 (dlm->dlm_state == DLM_CTXT_IN_SHUTDOWN); in dlm_domain_fully_joined()
379 static void dlm_destroy_dlm_worker(struct dlm_ctxt *dlm) in dlm_destroy_dlm_worker() argument
381 if (dlm->dlm_worker) { in dlm_destroy_dlm_worker()
382 destroy_workqueue(dlm->dlm_worker); in dlm_destroy_dlm_worker()
383 dlm->dlm_worker = NULL; in dlm_destroy_dlm_worker()
387 static void dlm_complete_dlm_shutdown(struct dlm_ctxt *dlm) in dlm_complete_dlm_shutdown() argument
389 dlm_unregister_domain_handlers(dlm); in dlm_complete_dlm_shutdown()
390 dlm_complete_thread(dlm); in dlm_complete_dlm_shutdown()
391 dlm_complete_recovery_thread(dlm); in dlm_complete_dlm_shutdown()
392 dlm_destroy_dlm_worker(dlm); in dlm_complete_dlm_shutdown()
398 list_del_init(&dlm->list); in dlm_complete_dlm_shutdown()
405 static int dlm_migrate_all_locks(struct dlm_ctxt *dlm) in dlm_migrate_all_locks() argument
413 mlog(0, "Migrating locks from domain %s\n", dlm->name); in dlm_migrate_all_locks()
416 spin_lock(&dlm->spinlock); in dlm_migrate_all_locks()
420 bucket = dlm_lockres_hash(dlm, i); in dlm_migrate_all_locks()
429 dropped = dlm_empty_lockres(dlm, res); in dlm_migrate_all_locks()
433 __dlm_lockres_calc_usage(dlm, res); in dlm_migrate_all_locks()
441 cond_resched_lock(&dlm->spinlock); in dlm_migrate_all_locks()
445 cond_resched_lock(&dlm->spinlock); in dlm_migrate_all_locks()
450 if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { in dlm_migrate_all_locks()
452 "need to be migrated after dlm recovery\n", dlm->name); in dlm_migrate_all_locks()
456 "all lock resources\n", dlm->name); in dlm_migrate_all_locks()
457 dlm->migrate_done = 1; in dlm_migrate_all_locks()
461 spin_unlock(&dlm->spinlock); in dlm_migrate_all_locks()
462 wake_up(&dlm->dlm_thread_wq); in dlm_migrate_all_locks()
468 dlm->name, num); in dlm_migrate_all_locks()
471 mlog(0, "DONE Migrating locks from domain %s\n", dlm->name); in dlm_migrate_all_locks()
475 static int dlm_no_joining_node(struct dlm_ctxt *dlm) in dlm_no_joining_node() argument
479 spin_lock(&dlm->spinlock); in dlm_no_joining_node()
480 ret = dlm->joining_node == DLM_LOCK_RES_OWNER_UNKNOWN; in dlm_no_joining_node()
481 spin_unlock(&dlm->spinlock); in dlm_no_joining_node()
489 struct dlm_ctxt *dlm = data; in dlm_begin_exit_domain_handler() local
493 if (!dlm_grab(dlm)) in dlm_begin_exit_domain_handler()
497 mlog(0, "%s: Node %u sent a begin exit domain message\n", dlm->name, node); in dlm_begin_exit_domain_handler()
499 spin_lock(&dlm->spinlock); in dlm_begin_exit_domain_handler()
500 set_bit(node, dlm->exit_domain_map); in dlm_begin_exit_domain_handler()
501 spin_unlock(&dlm->spinlock); in dlm_begin_exit_domain_handler()
503 dlm_put(dlm); in dlm_begin_exit_domain_handler()
508 static void dlm_mark_domain_leaving(struct dlm_ctxt *dlm) in dlm_mark_domain_leaving() argument
514 spin_lock(&dlm->spinlock); in dlm_mark_domain_leaving()
516 if (dlm->joining_node != DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_mark_domain_leaving()
518 dlm->joining_node); in dlm_mark_domain_leaving()
519 spin_unlock(&dlm->spinlock); in dlm_mark_domain_leaving()
522 wait_event(dlm->dlm_join_events, dlm_no_joining_node(dlm)); in dlm_mark_domain_leaving()
526 dlm->dlm_state = DLM_CTXT_LEAVING; in dlm_mark_domain_leaving()
527 spin_unlock(&dlm->spinlock); in dlm_mark_domain_leaving()
531 static void __dlm_print_nodes(struct dlm_ctxt *dlm) in __dlm_print_nodes() argument
535 assert_spin_locked(&dlm->spinlock); in __dlm_print_nodes()
538 while ((node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, in __dlm_print_nodes()
549 struct dlm_ctxt *dlm = data; in dlm_exit_domain_handler() local
555 if (!dlm_grab(dlm)) in dlm_exit_domain_handler()
560 spin_lock(&dlm->spinlock); in dlm_exit_domain_handler()
561 clear_bit(node, dlm->domain_map); in dlm_exit_domain_handler()
562 clear_bit(node, dlm->exit_domain_map); in dlm_exit_domain_handler()
563 printk(KERN_NOTICE "o2dlm: Node %u leaves domain %s ", node, dlm->name); in dlm_exit_domain_handler()
564 __dlm_print_nodes(dlm); in dlm_exit_domain_handler()
567 dlm_hb_event_notify_attached(dlm, node, 0); in dlm_exit_domain_handler()
569 spin_unlock(&dlm->spinlock); in dlm_exit_domain_handler()
571 dlm_put(dlm); in dlm_exit_domain_handler()
576 static int dlm_send_one_domain_exit(struct dlm_ctxt *dlm, u32 msg_type, in dlm_send_one_domain_exit() argument
582 mlog(0, "%s: Sending domain exit message %u to node %u\n", dlm->name, in dlm_send_one_domain_exit()
586 leave_msg.node_idx = dlm->node_num; in dlm_send_one_domain_exit()
588 status = o2net_send_message(msg_type, dlm->key, &leave_msg, in dlm_send_one_domain_exit()
593 dlm->name); in dlm_send_one_domain_exit()
598 static void dlm_begin_exit_domain(struct dlm_ctxt *dlm) in dlm_begin_exit_domain() argument
603 if (dlm->dlm_locking_proto.pv_major == 1 && in dlm_begin_exit_domain()
604 dlm->dlm_locking_proto.pv_minor < 2) in dlm_begin_exit_domain()
612 spin_lock(&dlm->spinlock); in dlm_begin_exit_domain()
614 node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, node + 1); in dlm_begin_exit_domain()
617 if (node == dlm->node_num) in dlm_begin_exit_domain()
620 spin_unlock(&dlm->spinlock); in dlm_begin_exit_domain()
621 dlm_send_one_domain_exit(dlm, DLM_BEGIN_EXIT_DOMAIN_MSG, node); in dlm_begin_exit_domain()
622 spin_lock(&dlm->spinlock); in dlm_begin_exit_domain()
624 spin_unlock(&dlm->spinlock); in dlm_begin_exit_domain()
627 static void dlm_leave_domain(struct dlm_ctxt *dlm) in dlm_leave_domain() argument
636 spin_lock(&dlm->spinlock); in dlm_leave_domain()
638 clear_bit(dlm->node_num, dlm->domain_map); in dlm_leave_domain()
639 while ((node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, in dlm_leave_domain()
647 spin_unlock(&dlm->spinlock); in dlm_leave_domain()
651 status = dlm_send_one_domain_exit(dlm, DLM_EXIT_DOMAIN_MSG, in dlm_leave_domain()
666 spin_lock(&dlm->spinlock); in dlm_leave_domain()
670 clear_bit(node, dlm->domain_map); in dlm_leave_domain()
672 spin_unlock(&dlm->spinlock); in dlm_leave_domain()
675 void dlm_unregister_domain(struct dlm_ctxt *dlm) in dlm_unregister_domain() argument
681 BUG_ON(dlm->dlm_state != DLM_CTXT_JOINED); in dlm_unregister_domain()
682 BUG_ON(!dlm->num_joins); in dlm_unregister_domain()
684 dlm->num_joins--; in dlm_unregister_domain()
685 if (!dlm->num_joins) { in dlm_unregister_domain()
692 dlm->dlm_state = DLM_CTXT_IN_SHUTDOWN; in dlm_unregister_domain()
698 mlog(0, "shutting down domain %s\n", dlm->name); in dlm_unregister_domain()
699 dlm_begin_exit_domain(dlm); in dlm_unregister_domain()
702 dlm_kick_thread(dlm, NULL); in dlm_unregister_domain()
704 while (dlm_migrate_all_locks(dlm)) { in dlm_unregister_domain()
707 mlog(0, "%s: more migration to do\n", dlm->name); in dlm_unregister_domain()
711 if (!list_empty(&dlm->tracking_list)) { in dlm_unregister_domain()
714 list_for_each_entry(res, &dlm->tracking_list, tracking) in dlm_unregister_domain()
718 dlm_mark_domain_leaving(dlm); in dlm_unregister_domain()
719 dlm_leave_domain(dlm); in dlm_unregister_domain()
720 printk(KERN_NOTICE "o2dlm: Leaving domain %s\n", dlm->name); in dlm_unregister_domain()
721 dlm_force_free_mles(dlm); in dlm_unregister_domain()
722 dlm_complete_dlm_shutdown(dlm); in dlm_unregister_domain()
724 dlm_put(dlm); in dlm_unregister_domain()
798 struct dlm_ctxt *dlm = NULL; in dlm_query_join_handler() local
823 dlm = __dlm_lookup_domain_full(query->domain, query->name_len); in dlm_query_join_handler()
824 if (!dlm) in dlm_query_join_handler()
834 if (test_bit(nodenum, dlm->domain_map)) { in dlm_query_join_handler()
850 if (dlm->dlm_state != DLM_CTXT_LEAVING) { in dlm_query_join_handler()
852 spin_lock(&dlm->spinlock); in dlm_query_join_handler()
854 if (dlm->dlm_state == DLM_CTXT_NEW && in dlm_query_join_handler()
855 dlm->joining_node == DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_query_join_handler()
860 } else if (dlm->joining_node != DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_query_join_handler()
863 } else if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { in dlm_query_join_handler()
867 } else if (test_bit(bit, dlm->recovery_map)) { in dlm_query_join_handler()
871 } else if (test_bit(bit, dlm->domain_map)) { in dlm_query_join_handler()
884 &dlm->dlm_locking_proto, in dlm_query_join_handler()
888 &dlm->fs_locking_proto, in dlm_query_join_handler()
895 __dlm_set_joining_node(dlm, query->node_idx); in dlm_query_join_handler()
899 spin_unlock(&dlm->spinlock); in dlm_query_join_handler()
915 struct dlm_ctxt *dlm = NULL; in dlm_assert_joined_handler() local
923 dlm = __dlm_lookup_domain_full(assert->domain, assert->name_len); in dlm_assert_joined_handler()
925 if (dlm) { in dlm_assert_joined_handler()
926 spin_lock(&dlm->spinlock); in dlm_assert_joined_handler()
931 BUG_ON(dlm->joining_node != assert->node_idx); in dlm_assert_joined_handler()
933 if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { in dlm_assert_joined_handler()
935 spin_unlock(&dlm->spinlock); in dlm_assert_joined_handler()
940 set_bit(assert->node_idx, dlm->domain_map); in dlm_assert_joined_handler()
941 clear_bit(assert->node_idx, dlm->exit_domain_map); in dlm_assert_joined_handler()
942 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_assert_joined_handler()
945 assert->node_idx, dlm->name); in dlm_assert_joined_handler()
946 __dlm_print_nodes(dlm); in dlm_assert_joined_handler()
949 dlm_hb_event_notify_attached(dlm, assert->node_idx, 1); in dlm_assert_joined_handler()
951 spin_unlock(&dlm->spinlock); in dlm_assert_joined_handler()
958 static int dlm_match_regions(struct dlm_ctxt *dlm, in dlm_match_regions() argument
971 qr->qr_domain, qr->qr_node, dlm->node_num); in dlm_match_regions()
980 qr->qr_domain, dlm->node_num, qr->qr_node); in dlm_match_regions()
1011 dlm->node_num, qr->qr_node); in dlm_match_regions()
1034 qr->qr_node, dlm->node_num); in dlm_match_regions()
1044 static int dlm_send_regions(struct dlm_ctxt *dlm, unsigned long *node_map) in dlm_send_regions() argument
1060 qr->qr_node = dlm->node_num; in dlm_send_regions()
1061 qr->qr_namelen = strlen(dlm->name); in dlm_send_regions()
1062 memcpy(qr->qr_domain, dlm->name, qr->qr_namelen); in dlm_send_regions()
1075 if (i == dlm->node_num) in dlm_send_regions()
1101 struct dlm_ctxt *dlm = NULL; in dlm_query_region_handler() local
1118 dlm = __dlm_lookup_domain_full(qr->qr_domain, qr->qr_namelen); in dlm_query_region_handler()
1119 if (!dlm) { in dlm_query_region_handler()
1125 spin_lock(&dlm->spinlock); in dlm_query_region_handler()
1126 if (dlm->joining_node != qr->qr_node) { in dlm_query_region_handler()
1129 dlm->joining_node); in dlm_query_region_handler()
1134 if (dlm->dlm_locking_proto.pv_major == 1 && in dlm_query_region_handler()
1135 dlm->dlm_locking_proto.pv_minor == 0) { in dlm_query_region_handler()
1138 qr->qr_domain, dlm->dlm_locking_proto.pv_major, in dlm_query_region_handler()
1139 dlm->dlm_locking_proto.pv_minor); in dlm_query_region_handler()
1143 status = dlm_match_regions(dlm, qr, local, sizeof(qr->qr_regions)); in dlm_query_region_handler()
1146 spin_unlock(&dlm->spinlock); in dlm_query_region_handler()
1156 static int dlm_match_nodes(struct dlm_ctxt *dlm, struct dlm_query_nodeinfo *qn) in dlm_match_nodes() argument
1198 qn->qn_nodenum, dlm->node_num); in dlm_match_nodes()
1205 dlm->node_num, qn->qn_nodenum); in dlm_match_nodes()
1216 static int dlm_send_nodeinfo(struct dlm_ctxt *dlm, unsigned long *node_map) in dlm_send_nodeinfo() argument
1245 qn->qn_nodenum = dlm->node_num; in dlm_send_nodeinfo()
1247 qn->qn_namelen = strlen(dlm->name); in dlm_send_nodeinfo()
1248 memcpy(qn->qn_domain, dlm->name, qn->qn_namelen); in dlm_send_nodeinfo()
1253 if (i == dlm->node_num) in dlm_send_nodeinfo()
1278 struct dlm_ctxt *dlm = NULL; in dlm_query_nodeinfo_handler() local
1287 dlm = __dlm_lookup_domain_full(qn->qn_domain, qn->qn_namelen); in dlm_query_nodeinfo_handler()
1288 if (!dlm) { in dlm_query_nodeinfo_handler()
1294 spin_lock(&dlm->spinlock); in dlm_query_nodeinfo_handler()
1296 if (dlm->joining_node != qn->qn_nodenum) { in dlm_query_nodeinfo_handler()
1299 dlm->joining_node); in dlm_query_nodeinfo_handler()
1304 if (dlm->dlm_locking_proto.pv_major == 1 && in dlm_query_nodeinfo_handler()
1305 dlm->dlm_locking_proto.pv_minor == 0) { in dlm_query_nodeinfo_handler()
1308 qn->qn_domain, dlm->dlm_locking_proto.pv_major, in dlm_query_nodeinfo_handler()
1309 dlm->dlm_locking_proto.pv_minor); in dlm_query_nodeinfo_handler()
1313 status = dlm_match_nodes(dlm, qn); in dlm_query_nodeinfo_handler()
1317 spin_unlock(&dlm->spinlock); in dlm_query_nodeinfo_handler()
1327 struct dlm_ctxt *dlm = NULL; in dlm_cancel_join_handler() local
1335 dlm = __dlm_lookup_domain_full(cancel->domain, cancel->name_len); in dlm_cancel_join_handler()
1337 if (dlm) { in dlm_cancel_join_handler()
1338 spin_lock(&dlm->spinlock); in dlm_cancel_join_handler()
1342 BUG_ON(dlm->joining_node != cancel->node_idx); in dlm_cancel_join_handler()
1343 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_cancel_join_handler()
1345 spin_unlock(&dlm->spinlock); in dlm_cancel_join_handler()
1352 static int dlm_send_one_join_cancel(struct dlm_ctxt *dlm, in dlm_send_one_join_cancel() argument
1359 cancel_msg.node_idx = dlm->node_num; in dlm_send_one_join_cancel()
1360 cancel_msg.name_len = strlen(dlm->name); in dlm_send_one_join_cancel()
1361 memcpy(cancel_msg.domain, dlm->name, cancel_msg.name_len); in dlm_send_one_join_cancel()
1378 static int dlm_send_join_cancels(struct dlm_ctxt *dlm, in dlm_send_join_cancels() argument
1397 if (node == dlm->node_num) in dlm_send_join_cancels()
1400 tmpstat = dlm_send_one_join_cancel(dlm, node); in dlm_send_join_cancels()
1414 static int dlm_request_join(struct dlm_ctxt *dlm, in dlm_request_join() argument
1426 join_msg.node_idx = dlm->node_num; in dlm_request_join()
1427 join_msg.name_len = strlen(dlm->name); in dlm_request_join()
1428 memcpy(join_msg.domain, dlm->name, join_msg.name_len); in dlm_request_join()
1429 join_msg.dlm_proto = dlm->dlm_locking_proto; in dlm_request_join()
1430 join_msg.fs_proto = dlm->fs_locking_proto; in dlm_request_join()
1433 byte_copymap(join_msg.node_map, dlm->live_nodes_map, O2NM_MAX_NODES); in dlm_request_join()
1464 dlm->dlm_locking_proto.pv_major, in dlm_request_join()
1465 dlm->dlm_locking_proto.pv_minor, in dlm_request_join()
1466 dlm->fs_locking_proto.pv_major, in dlm_request_join()
1467 dlm->fs_locking_proto.pv_minor, in dlm_request_join()
1473 dlm->dlm_locking_proto.pv_minor = packet.dlm_minor; in dlm_request_join()
1474 dlm->fs_locking_proto.pv_minor = packet.fs_minor; in dlm_request_join()
1479 dlm->dlm_locking_proto.pv_major, in dlm_request_join()
1480 dlm->dlm_locking_proto.pv_minor, in dlm_request_join()
1481 dlm->fs_locking_proto.pv_major, in dlm_request_join()
1482 dlm->fs_locking_proto.pv_minor); in dlm_request_join()
1501 static int dlm_send_one_join_assert(struct dlm_ctxt *dlm, in dlm_send_one_join_assert() argument
1511 assert_msg.node_idx = dlm->node_num; in dlm_send_one_join_assert()
1512 assert_msg.name_len = strlen(dlm->name); in dlm_send_one_join_assert()
1513 memcpy(assert_msg.domain, dlm->name, assert_msg.name_len); in dlm_send_one_join_assert()
1528 static void dlm_send_join_asserts(struct dlm_ctxt *dlm, in dlm_send_join_asserts() argument
1537 if (node == dlm->node_num) in dlm_send_join_asserts()
1544 status = dlm_send_one_join_assert(dlm, node); in dlm_send_join_asserts()
1546 spin_lock(&dlm->spinlock); in dlm_send_join_asserts()
1547 live = test_bit(node, dlm->live_nodes_map); in dlm_send_join_asserts()
1548 spin_unlock(&dlm->spinlock); in dlm_send_join_asserts()
1567 static int dlm_should_restart_join(struct dlm_ctxt *dlm, in dlm_should_restart_join() argument
1578 spin_lock(&dlm->spinlock); in dlm_should_restart_join()
1581 ret = memcmp(ctxt->live_map, dlm->live_nodes_map, in dlm_should_restart_join()
1582 sizeof(dlm->live_nodes_map)); in dlm_should_restart_join()
1583 spin_unlock(&dlm->spinlock); in dlm_should_restart_join()
1591 static int dlm_try_to_join_domain(struct dlm_ctxt *dlm) in dlm_try_to_join_domain() argument
1597 mlog(0, "%p", dlm); in dlm_try_to_join_domain()
1609 o2hb_fill_node_map(dlm->live_nodes_map, sizeof(dlm->live_nodes_map)); in dlm_try_to_join_domain()
1611 spin_lock(&dlm->spinlock); in dlm_try_to_join_domain()
1612 memcpy(ctxt->live_map, dlm->live_nodes_map, sizeof(ctxt->live_map)); in dlm_try_to_join_domain()
1614 __dlm_set_joining_node(dlm, dlm->node_num); in dlm_try_to_join_domain()
1616 spin_unlock(&dlm->spinlock); in dlm_try_to_join_domain()
1621 if (node == dlm->node_num) in dlm_try_to_join_domain()
1624 status = dlm_request_join(dlm, node, &response); in dlm_try_to_join_domain()
1635 if (dlm_should_restart_join(dlm, ctxt, response)) { in dlm_try_to_join_domain()
1647 spin_lock(&dlm->spinlock); in dlm_try_to_join_domain()
1648 memcpy(dlm->domain_map, ctxt->yes_resp_map, in dlm_try_to_join_domain()
1650 set_bit(dlm->node_num, dlm->domain_map); in dlm_try_to_join_domain()
1651 spin_unlock(&dlm->spinlock); in dlm_try_to_join_domain()
1654 if (dlm->dlm_locking_proto.pv_major > 1 || in dlm_try_to_join_domain()
1655 dlm->dlm_locking_proto.pv_minor > 0) { in dlm_try_to_join_domain()
1656 status = dlm_send_nodeinfo(dlm, ctxt->yes_resp_map); in dlm_try_to_join_domain()
1661 status = dlm_send_regions(dlm, ctxt->yes_resp_map); in dlm_try_to_join_domain()
1668 dlm_send_join_asserts(dlm, ctxt->yes_resp_map); in dlm_try_to_join_domain()
1675 dlm->dlm_state = DLM_CTXT_JOINED; in dlm_try_to_join_domain()
1676 dlm->num_joins++; in dlm_try_to_join_domain()
1680 spin_lock(&dlm->spinlock); in dlm_try_to_join_domain()
1681 __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_try_to_join_domain()
1683 printk(KERN_NOTICE "o2dlm: Joining domain %s ", dlm->name); in dlm_try_to_join_domain()
1684 __dlm_print_nodes(dlm); in dlm_try_to_join_domain()
1686 spin_unlock(&dlm->spinlock); in dlm_try_to_join_domain()
1691 tmpstat = dlm_send_join_cancels(dlm, in dlm_try_to_join_domain()
1704 static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm) in dlm_unregister_domain_handlers() argument
1706 o2hb_unregister_callback(dlm->name, &dlm->dlm_hb_up); in dlm_unregister_domain_handlers()
1707 o2hb_unregister_callback(dlm->name, &dlm->dlm_hb_down); in dlm_unregister_domain_handlers()
1708 o2net_unregister_handler_list(&dlm->dlm_domain_handlers); in dlm_unregister_domain_handlers()
1711 static int dlm_register_domain_handlers(struct dlm_ctxt *dlm) in dlm_register_domain_handlers() argument
1717 o2hb_setup_callback(&dlm->dlm_hb_down, O2HB_NODE_DOWN_CB, in dlm_register_domain_handlers()
1718 dlm_hb_node_down_cb, dlm, DLM_HB_NODE_DOWN_PRI); in dlm_register_domain_handlers()
1719 o2hb_setup_callback(&dlm->dlm_hb_up, O2HB_NODE_UP_CB, in dlm_register_domain_handlers()
1720 dlm_hb_node_up_cb, dlm, DLM_HB_NODE_UP_PRI); in dlm_register_domain_handlers()
1722 status = o2hb_register_callback(dlm->name, &dlm->dlm_hb_down); in dlm_register_domain_handlers()
1726 status = o2hb_register_callback(dlm->name, &dlm->dlm_hb_up); in dlm_register_domain_handlers()
1730 status = o2net_register_handler(DLM_MASTER_REQUEST_MSG, dlm->key, in dlm_register_domain_handlers()
1733 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1737 status = o2net_register_handler(DLM_ASSERT_MASTER_MSG, dlm->key, in dlm_register_domain_handlers()
1740 dlm, dlm_assert_master_post_handler, in dlm_register_domain_handlers()
1741 &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1745 status = o2net_register_handler(DLM_CREATE_LOCK_MSG, dlm->key, in dlm_register_domain_handlers()
1748 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1752 status = o2net_register_handler(DLM_CONVERT_LOCK_MSG, dlm->key, in dlm_register_domain_handlers()
1755 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1759 status = o2net_register_handler(DLM_UNLOCK_LOCK_MSG, dlm->key, in dlm_register_domain_handlers()
1762 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1766 status = o2net_register_handler(DLM_PROXY_AST_MSG, dlm->key, in dlm_register_domain_handlers()
1769 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1773 status = o2net_register_handler(DLM_EXIT_DOMAIN_MSG, dlm->key, in dlm_register_domain_handlers()
1776 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1780 status = o2net_register_handler(DLM_DEREF_LOCKRES_MSG, dlm->key, in dlm_register_domain_handlers()
1783 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1787 status = o2net_register_handler(DLM_MIGRATE_REQUEST_MSG, dlm->key, in dlm_register_domain_handlers()
1790 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1794 status = o2net_register_handler(DLM_MIG_LOCKRES_MSG, dlm->key, in dlm_register_domain_handlers()
1797 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1801 status = o2net_register_handler(DLM_MASTER_REQUERY_MSG, dlm->key, in dlm_register_domain_handlers()
1804 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1808 status = o2net_register_handler(DLM_LOCK_REQUEST_MSG, dlm->key, in dlm_register_domain_handlers()
1811 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1815 status = o2net_register_handler(DLM_RECO_DATA_DONE_MSG, dlm->key, in dlm_register_domain_handlers()
1818 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1822 status = o2net_register_handler(DLM_BEGIN_RECO_MSG, dlm->key, in dlm_register_domain_handlers()
1825 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1829 status = o2net_register_handler(DLM_FINALIZE_RECO_MSG, dlm->key, in dlm_register_domain_handlers()
1832 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1836 status = o2net_register_handler(DLM_BEGIN_EXIT_DOMAIN_MSG, dlm->key, in dlm_register_domain_handlers()
1839 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1843 status = o2net_register_handler(DLM_DEREF_LOCKRES_DONE, dlm->key, in dlm_register_domain_handlers()
1846 dlm, NULL, &dlm->dlm_domain_handlers); in dlm_register_domain_handlers()
1849 dlm_unregister_domain_handlers(dlm); in dlm_register_domain_handlers()
1854 static int dlm_join_domain(struct dlm_ctxt *dlm) in dlm_join_domain() argument
1861 BUG_ON(!dlm); in dlm_join_domain()
1863 mlog(0, "Join domain %s\n", dlm->name); in dlm_join_domain()
1865 status = dlm_register_domain_handlers(dlm); in dlm_join_domain()
1871 status = dlm_launch_thread(dlm); in dlm_join_domain()
1877 status = dlm_launch_recovery_thread(dlm); in dlm_join_domain()
1883 dlm_debug_init(dlm); in dlm_join_domain()
1885 snprintf(wq_name, O2NM_MAX_NAME_LEN, "dlm_wq-%s", dlm->name); in dlm_join_domain()
1886 dlm->dlm_worker = alloc_workqueue(wq_name, WQ_MEM_RECLAIM, 0); in dlm_join_domain()
1887 if (!dlm->dlm_worker) { in dlm_join_domain()
1894 status = dlm_try_to_join_domain(dlm); in dlm_join_domain()
1909 "%s after %u msecs\n", dlm->name, in dlm_join_domain()
1939 dlm_unregister_domain_handlers(dlm); in dlm_join_domain()
1940 dlm_complete_thread(dlm); in dlm_join_domain()
1941 dlm_complete_recovery_thread(dlm); in dlm_join_domain()
1942 dlm_destroy_dlm_worker(dlm); in dlm_join_domain()
1953 struct dlm_ctxt *dlm = NULL; in dlm_alloc_ctxt() local
1955 dlm = kzalloc(sizeof(*dlm), GFP_KERNEL); in dlm_alloc_ctxt()
1956 if (!dlm) { in dlm_alloc_ctxt()
1962 dlm->name = kstrdup(domain, GFP_KERNEL); in dlm_alloc_ctxt()
1963 if (dlm->name == NULL) { in dlm_alloc_ctxt()
1969 dlm->lockres_hash = (struct hlist_head **)dlm_alloc_pagevec(DLM_HASH_PAGES); in dlm_alloc_ctxt()
1970 if (!dlm->lockres_hash) { in dlm_alloc_ctxt()
1977 INIT_HLIST_HEAD(dlm_lockres_hash(dlm, i)); in dlm_alloc_ctxt()
1979 dlm->master_hash = (struct hlist_head **) in dlm_alloc_ctxt()
1981 if (!dlm->master_hash) { in dlm_alloc_ctxt()
1988 INIT_HLIST_HEAD(dlm_master_hash(dlm, i)); in dlm_alloc_ctxt()
1990 dlm->key = key; in dlm_alloc_ctxt()
1991 dlm->node_num = o2nm_this_node(); in dlm_alloc_ctxt()
1993 dlm_create_debugfs_subroot(dlm); in dlm_alloc_ctxt()
1995 spin_lock_init(&dlm->spinlock); in dlm_alloc_ctxt()
1996 spin_lock_init(&dlm->master_lock); in dlm_alloc_ctxt()
1997 spin_lock_init(&dlm->ast_lock); in dlm_alloc_ctxt()
1998 spin_lock_init(&dlm->track_lock); in dlm_alloc_ctxt()
1999 INIT_LIST_HEAD(&dlm->list); in dlm_alloc_ctxt()
2000 INIT_LIST_HEAD(&dlm->dirty_list); in dlm_alloc_ctxt()
2001 INIT_LIST_HEAD(&dlm->reco.resources); in dlm_alloc_ctxt()
2002 INIT_LIST_HEAD(&dlm->reco.node_data); in dlm_alloc_ctxt()
2003 INIT_LIST_HEAD(&dlm->purge_list); in dlm_alloc_ctxt()
2004 INIT_LIST_HEAD(&dlm->dlm_domain_handlers); in dlm_alloc_ctxt()
2005 INIT_LIST_HEAD(&dlm->tracking_list); in dlm_alloc_ctxt()
2006 dlm->reco.state = 0; in dlm_alloc_ctxt()
2008 INIT_LIST_HEAD(&dlm->pending_asts); in dlm_alloc_ctxt()
2009 INIT_LIST_HEAD(&dlm->pending_basts); in dlm_alloc_ctxt()
2012 dlm->recovery_map, &(dlm->recovery_map[0])); in dlm_alloc_ctxt()
2014 memset(dlm->recovery_map, 0, sizeof(dlm->recovery_map)); in dlm_alloc_ctxt()
2015 memset(dlm->live_nodes_map, 0, sizeof(dlm->live_nodes_map)); in dlm_alloc_ctxt()
2016 memset(dlm->domain_map, 0, sizeof(dlm->domain_map)); in dlm_alloc_ctxt()
2018 dlm->dlm_thread_task = NULL; in dlm_alloc_ctxt()
2019 dlm->dlm_reco_thread_task = NULL; in dlm_alloc_ctxt()
2020 dlm->dlm_worker = NULL; in dlm_alloc_ctxt()
2021 init_waitqueue_head(&dlm->dlm_thread_wq); in dlm_alloc_ctxt()
2022 init_waitqueue_head(&dlm->dlm_reco_thread_wq); in dlm_alloc_ctxt()
2023 init_waitqueue_head(&dlm->reco.event); in dlm_alloc_ctxt()
2024 init_waitqueue_head(&dlm->ast_wq); in dlm_alloc_ctxt()
2025 init_waitqueue_head(&dlm->migration_wq); in dlm_alloc_ctxt()
2026 INIT_LIST_HEAD(&dlm->mle_hb_events); in dlm_alloc_ctxt()
2028 dlm->joining_node = DLM_LOCK_RES_OWNER_UNKNOWN; in dlm_alloc_ctxt()
2029 init_waitqueue_head(&dlm->dlm_join_events); in dlm_alloc_ctxt()
2031 dlm->migrate_done = 0; in dlm_alloc_ctxt()
2033 dlm->reco.new_master = O2NM_INVALID_NODE_NUM; in dlm_alloc_ctxt()
2034 dlm->reco.dead_node = O2NM_INVALID_NODE_NUM; in dlm_alloc_ctxt()
2036 atomic_set(&dlm->res_tot_count, 0); in dlm_alloc_ctxt()
2037 atomic_set(&dlm->res_cur_count, 0); in dlm_alloc_ctxt()
2039 atomic_set(&dlm->mle_tot_count[i], 0); in dlm_alloc_ctxt()
2040 atomic_set(&dlm->mle_cur_count[i], 0); in dlm_alloc_ctxt()
2043 spin_lock_init(&dlm->work_lock); in dlm_alloc_ctxt()
2044 INIT_LIST_HEAD(&dlm->work_list); in dlm_alloc_ctxt()
2045 INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work); in dlm_alloc_ctxt()
2047 kref_init(&dlm->dlm_refs); in dlm_alloc_ctxt()
2048 dlm->dlm_state = DLM_CTXT_NEW; in dlm_alloc_ctxt()
2050 INIT_LIST_HEAD(&dlm->dlm_eviction_callbacks); in dlm_alloc_ctxt()
2053 kref_read(&dlm->dlm_refs)); in dlm_alloc_ctxt()
2057 if (ret < 0 && dlm) { in dlm_alloc_ctxt()
2058 if (dlm->master_hash) in dlm_alloc_ctxt()
2059 dlm_free_pagevec((void **)dlm->master_hash, in dlm_alloc_ctxt()
2062 if (dlm->lockres_hash) in dlm_alloc_ctxt()
2063 dlm_free_pagevec((void **)dlm->lockres_hash, in dlm_alloc_ctxt()
2066 kfree(dlm->name); in dlm_alloc_ctxt()
2067 kfree(dlm); in dlm_alloc_ctxt()
2068 dlm = NULL; in dlm_alloc_ctxt()
2070 return dlm; in dlm_alloc_ctxt()
2108 struct dlm_ctxt *dlm = NULL; in dlm_register_domain() local
2120 dlm = NULL; in dlm_register_domain()
2129 dlm = __dlm_lookup_domain(domain); in dlm_register_domain()
2130 if (dlm) { in dlm_register_domain()
2131 if (dlm->dlm_state != DLM_CTXT_JOINED) { in dlm_register_domain()
2141 if (dlm_protocol_compare(&dlm->fs_locking_proto, fs_proto)) { in dlm_register_domain()
2151 __dlm_get(dlm); in dlm_register_domain()
2152 dlm->num_joins++; in dlm_register_domain()
2174 dlm = new_ctxt; in dlm_register_domain()
2178 list_add_tail(&dlm->list, &dlm_domains); in dlm_register_domain()
2185 dlm->dlm_locking_proto = dlm_protocol; in dlm_register_domain()
2186 dlm->fs_locking_proto = *fs_proto; in dlm_register_domain()
2188 ret = dlm_join_domain(dlm); in dlm_register_domain()
2191 dlm_put(dlm); in dlm_register_domain()
2196 *fs_proto = dlm->fs_locking_proto; in dlm_register_domain()
2204 dlm = ERR_PTR(ret); in dlm_register_domain()
2206 return dlm; in dlm_register_domain()
2274 void dlm_fire_domain_eviction_callbacks(struct dlm_ctxt *dlm, in dlm_fire_domain_eviction_callbacks() argument
2280 list_for_each_entry(cb, &dlm->dlm_eviction_callbacks, ec_item) { in dlm_fire_domain_eviction_callbacks()
2296 void dlm_register_eviction_cb(struct dlm_ctxt *dlm, in dlm_register_eviction_cb() argument
2300 list_add_tail(&cb->ec_item, &dlm->dlm_eviction_callbacks); in dlm_register_eviction_cb()