Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

dlm: add new flag DLM_RELEASE_RECOVER for dlm_lockspace_release

When dlm_lockspace_release() is passed DLM_RELEASE_RECOVER, it
tells the dlm to handle the release/leave as if the node had failed,
i.e. perform recovery steps for a failed node, like recover_slot().

When DLM_RELEASE_RECOVER is set:
- dlm_release_lockspace() includes RELEASE_RECOVER=1 in the OFFLINE
uevent sent to userspace.
- userspace/dlm_controld sends a message to all lockspace members
indicating that the subsequent node removal should be handled as
if the node had failed.
- when dlm_controld on all nodes receives the new message, it sets
the release_recover configfs entry to 1 for the node.
- when the dlm/kernel next performs recovery and removes the node,
it will see that release_recover has been set, and will perform
recovery steps for the node as if it had failed, e.g. the
recover_slot() callback is called to notify the fs.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>

authored by

Alexander Aring and committed by
David Teigland
6f4f4ca5 de7b4869

+16 -5
+1 -1
fs/dlm/lockspace.c
··· 738 738 739 739 if (release_option != DLM_RELEASE_NO_EVENT && 740 740 dlm_user_daemon_available()) 741 - do_uevent(ls, 0, 0); 741 + do_uevent(ls, 0, (release_option == DLM_RELEASE_RECOVER)); 742 742 743 743 dlm_recoverd_stop(ls); 744 744
+10 -4
fs/dlm/member.c
··· 478 478 ls->ls_ops->recover_prep(ls->ls_ops_arg); 479 479 } 480 480 481 - static void dlm_lsop_recover_slot(struct dlm_ls *ls, struct dlm_member *memb) 481 + static void dlm_lsop_recover_slot(struct dlm_ls *ls, struct dlm_member *memb, 482 + unsigned int release_recover) 482 483 { 483 484 struct dlm_slot slot; 484 485 uint32_t seq; ··· 496 495 497 496 error = dlm_comm_seq(memb->nodeid, &seq, false); 498 497 499 - if (!error && seq == memb->comm_seq) 498 + if (!release_recover && !error && seq == memb->comm_seq) 500 499 return; 501 500 502 501 slot.nodeid = memb->nodeid; ··· 553 552 struct dlm_member *memb, *safe; 554 553 struct dlm_config_node *node; 555 554 int i, error, neg = 0, low = -1; 555 + unsigned int release_recover; 556 556 557 557 /* previously removed members that we've not finished removing need to 558 558 * count as a negative change so the "neg" recovery steps will happen ··· 574 572 if (node && !node->new && !node->gone) 575 573 continue; 576 574 575 + release_recover = 0; 576 + 577 577 if (node->gone) { 578 - log_rinfo(ls, "remove member %d", memb->nodeid); 578 + release_recover = node->release_recover; 579 + log_rinfo(ls, "remove member %d%s", memb->nodeid, 580 + release_recover ? " (release_recover)" : ""); 579 581 } else { 580 582 /* removed and re-added */ 581 583 log_rinfo(ls, "remove member %d comm_seq %u %u", ··· 590 584 list_move(&memb->list, &ls->ls_nodes_gone); 591 585 remove_remote_member(memb->nodeid); 592 586 ls->ls_num_nodes--; 593 - dlm_lsop_recover_slot(ls, memb); 587 + dlm_lsop_recover_slot(ls, memb, release_recover); 594 588 } 595 589 596 590 /* add new members to ls_nodes */
+5
include/linux/dlm.h
··· 103 103 * a leave event to the cluster manager, so other nodes will 104 104 * not be notified that the node should be removed from the 105 105 * list of lockspace members. 106 + * 107 + * DLM_RELEASE_RECOVER like DLM_RELEASE_NORMAL, but the remaining 108 + * nodes will handle the removal of the node as if the node 109 + * had failed, e.g. the recover_slot() callback would be used. 106 110 */ 107 111 #define DLM_RELEASE_NO_LOCKS 0 108 112 #define DLM_RELEASE_UNUSED 1 109 113 #define DLM_RELEASE_NORMAL 2 110 114 #define DLM_RELEASE_NO_EVENT 3 115 + #define DLM_RELEASE_RECOVER 4 111 116 112 117 /* 113 118 * dlm_release_lockspace