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 configfs entry release_recover for lockspace members

A new configfs entry is added for a lockspace member:
/config/dlm/<cluster>/spaces/<space>/nodes/<node>/release_recover

release_recover can be set to 1 by userspace (dlm_controld process)
prior to removing the lockspace member (rmdir of the <node>).
This tells the kernel to handle the removed member as if it had failed,
i.e. recovery steps for a failed node should be perfomed, as opposed
to the recovery steps for a node doing a controlled leave.

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
de7b4869 5665374c

+69 -4
+62 -2
fs/dlm/config.c
··· 26 26 /* 27 27 * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/nodeid (refers to <node>) 28 28 * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/weight 29 + * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/release_recover 29 30 * /config/dlm/<cluster>/comms/<comm>/nodeid (refers to <comm>) 30 31 * /config/dlm/<cluster>/comms/<comm>/local 31 32 * /config/dlm/<cluster>/comms/<comm>/addr (write only) ··· 268 267 enum { 269 268 NODE_ATTR_NODEID = 0, 270 269 NODE_ATTR_WEIGHT, 270 + NODE_ATTR_RELEASE_RECOVER, 271 271 }; 272 272 273 273 struct dlm_clusters { ··· 282 280 struct dlm_space { 283 281 struct config_group group; 284 282 struct list_head members; 283 + struct list_head members_gone; 284 + int members_gone_count; 285 285 struct mutex members_lock; 286 286 int members_count; 287 287 struct dlm_nodes *nds; ··· 314 310 int weight; 315 311 int new; 316 312 int comm_seq; /* copy of cm->seq when nd->nodeid is set */ 313 + unsigned int release_recover; 314 + }; 315 + 316 + struct dlm_member_gone { 317 + int nodeid; 318 + unsigned int release_recover; 319 + 320 + struct list_head list; /* space->members_gone */ 317 321 }; 318 322 319 323 static struct configfs_group_operations clusters_ops = { ··· 492 480 configfs_add_default_group(&nds->ns_group, &sp->group); 493 481 494 482 INIT_LIST_HEAD(&sp->members); 483 + INIT_LIST_HEAD(&sp->members_gone); 495 484 mutex_init(&sp->members_lock); 496 485 sp->members_count = 0; 497 486 sp->nds = nds; ··· 600 587 { 601 588 struct dlm_space *sp = config_item_to_space(g->cg_item.ci_parent); 602 589 struct dlm_node *nd = config_item_to_node(i); 590 + struct dlm_member_gone *mb_gone; 591 + 592 + mb_gone = kzalloc(sizeof(*mb_gone), GFP_KERNEL); 593 + if (!mb_gone) 594 + return; 603 595 604 596 mutex_lock(&sp->members_lock); 605 597 list_del(&nd->list); 606 598 sp->members_count--; 599 + 600 + mb_gone->nodeid = nd->nodeid; 601 + mb_gone->release_recover = nd->release_recover; 602 + list_add(&mb_gone->list, &sp->members_gone); 603 + sp->members_gone_count++; 607 604 mutex_unlock(&sp->members_lock); 608 605 609 606 config_item_put(i); ··· 838 815 return len; 839 816 } 840 817 818 + static ssize_t node_release_recover_show(struct config_item *item, char *buf) 819 + { 820 + struct dlm_node *n = config_item_to_node(item); 821 + 822 + return sprintf(buf, "%u\n", n->release_recover); 823 + } 824 + 825 + static ssize_t node_release_recover_store(struct config_item *item, 826 + const char *buf, size_t len) 827 + { 828 + struct dlm_node *n = config_item_to_node(item); 829 + int rc; 830 + 831 + rc = kstrtouint(buf, 0, &n->release_recover); 832 + if (rc) 833 + return rc; 834 + 835 + return len; 836 + } 837 + 841 838 CONFIGFS_ATTR(node_, nodeid); 842 839 CONFIGFS_ATTR(node_, weight); 840 + CONFIGFS_ATTR(node_, release_recover); 843 841 844 842 static struct configfs_attribute *node_attrs[] = { 845 843 [NODE_ATTR_NODEID] = &node_attr_nodeid, 846 844 [NODE_ATTR_WEIGHT] = &node_attr_weight, 845 + [NODE_ATTR_RELEASE_RECOVER] = &node_attr_release_recover, 847 846 NULL, 848 847 }; 849 848 ··· 927 882 int dlm_config_nodes(char *lsname, struct dlm_config_node **nodes_out, 928 883 int *count_out) 929 884 { 885 + struct dlm_member_gone *mb_gone, *mb_safe; 886 + struct dlm_config_node *nodes, *node; 930 887 struct dlm_space *sp; 931 888 struct dlm_node *nd; 932 - struct dlm_config_node *nodes, *node; 933 889 int rv, count; 934 890 935 891 sp = get_space(lsname); ··· 944 898 goto out; 945 899 } 946 900 947 - count = sp->members_count; 901 + count = sp->members_count + sp->members_gone_count; 948 902 949 903 nodes = kcalloc(count, sizeof(struct dlm_config_node), GFP_NOFS); 950 904 if (!nodes) { ··· 961 915 node++; 962 916 963 917 nd->new = 0; 918 + } 919 + 920 + /* we delay the remove on nodes until here as configfs does 921 + * not support addtional attributes for rmdir(). 922 + */ 923 + list_for_each_entry_safe(mb_gone, mb_safe, &sp->members_gone, list) { 924 + node->nodeid = mb_gone->nodeid; 925 + node->release_recover = mb_gone->release_recover; 926 + node->gone = true; 927 + node++; 928 + 929 + list_del(&mb_gone->list); 930 + sp->members_gone_count--; 931 + kfree(mb_gone); 964 932 } 965 933 966 934 *count_out = count;
+2
fs/dlm/config.h
··· 17 17 struct dlm_config_node { 18 18 int nodeid; 19 19 int weight; 20 + bool gone; 20 21 int new; 21 22 uint32_t comm_seq; 23 + unsigned int release_recover; 22 24 }; 23 25 24 26 extern const struct rhashtable_params dlm_rhash_rsb_params;
+5 -2
fs/dlm/member.c
··· 569 569 570 570 list_for_each_entry_safe(memb, safe, &ls->ls_nodes, list) { 571 571 node = find_config_node(rv, memb->nodeid); 572 - if (node && !node->new) 572 + if (node && !node->new && !node->gone) 573 573 continue; 574 574 575 - if (!node) { 575 + if (node->gone) { 576 576 log_rinfo(ls, "remove member %d", memb->nodeid); 577 577 } else { 578 578 /* removed and re-added */ ··· 591 591 592 592 for (i = 0; i < rv->nodes_count; i++) { 593 593 node = &rv->nodes[i]; 594 + if (node->gone) 595 + continue; 596 + 594 597 if (dlm_is_member(ls, node->nodeid)) 595 598 continue; 596 599 error = dlm_add_member(ls, node);