fs: dlm: filter ourself midcomms calls
authorAlexander Aring <aahringo@redhat.com>
Mon, 29 May 2023 21:44:37 +0000 (17:44 -0400)
committerDavid Teigland <teigland@redhat.com>
Wed, 14 Jun 2023 15:17:33 +0000 (10:17 -0500)
It makes no sense to call midcomms/lowcomms functionality for the local
node as socket functionality is only required for remote nodes. This
patch filters those calls in the upper layer of lockspace membership
handling instead of doing it in midcomms/lowcomms layer as they should
never be aware of local nodeid.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
fs/dlm/config.c
fs/dlm/lowcomms.c
fs/dlm/member.c
fs/dlm/midcomms.c

index 2beceff024e39dbaec0a2bbf2e2ca6bb29c9dc9a..4246cd425671b97d17d345dde716d06e0564973d 100644 (file)
@@ -532,7 +532,8 @@ static void drop_comm(struct config_group *g, struct config_item *i)
        struct dlm_comm *cm = config_item_to_comm(i);
        if (local_comm == cm)
                local_comm = NULL;
-       dlm_midcomms_close(cm->nodeid);
+       if (!cm->local)
+               dlm_midcomms_close(cm->nodeid);
        while (cm->addr_count--)
                kfree(cm->addr[cm->addr_count]);
        config_item_put(i);
index 5a7586633cbe8a4e829deacf3025c791b5db8bad..345a316ae54c2ce4d94466437be94c4c24362cbc 100644 (file)
@@ -546,9 +546,6 @@ int dlm_lowcomms_connect_node(int nodeid)
        struct connection *con;
        int idx;
 
-       if (nodeid == dlm_our_nodeid())
-               return 0;
-
        idx = srcu_read_lock(&connections_srcu);
        con = nodeid2con(nodeid, 0);
        if (WARN_ON_ONCE(!con)) {
index 923c01a8a0aa27aaa7ea3e77740481885efe9a81..77d202e4a02a4700137cc4ed0bf7b7ae219ce799 100644 (file)
@@ -307,6 +307,21 @@ static void add_ordered_member(struct dlm_ls *ls, struct dlm_member *new)
        }
 }
 
+static int add_remote_member(int nodeid)
+{
+       int error;
+
+       if (nodeid == dlm_our_nodeid())
+               return 0;
+
+       error = dlm_lowcomms_connect_node(nodeid);
+       if (error < 0)
+               return error;
+
+       dlm_midcomms_add_member(nodeid);
+       return 0;
+}
+
 static int dlm_add_member(struct dlm_ls *ls, struct dlm_config_node *node)
 {
        struct dlm_member *memb;
@@ -316,16 +331,16 @@ static int dlm_add_member(struct dlm_ls *ls, struct dlm_config_node *node)
        if (!memb)
                return -ENOMEM;
 
-       error = dlm_lowcomms_connect_node(node->nodeid);
+       memb->nodeid = node->nodeid;
+       memb->weight = node->weight;
+       memb->comm_seq = node->comm_seq;
+
+       error = add_remote_member(node->nodeid);
        if (error < 0) {
                kfree(memb);
                return error;
        }
 
-       memb->nodeid = node->nodeid;
-       memb->weight = node->weight;
-       memb->comm_seq = node->comm_seq;
-       dlm_midcomms_add_member(node->nodeid);
        add_ordered_member(ls, memb);
        ls->ls_num_nodes++;
        return 0;
@@ -370,11 +385,19 @@ static void clear_memb_list(struct list_head *head,
        }
 }
 
-static void clear_members_cb(int nodeid)
+static void remove_remote_member(int nodeid)
 {
+       if (nodeid == dlm_our_nodeid())
+               return;
+
        dlm_midcomms_remove_member(nodeid);
 }
 
+static void clear_members_cb(int nodeid)
+{
+       remove_remote_member(nodeid);
+}
+
 void dlm_clear_members(struct dlm_ls *ls)
 {
        clear_memb_list(&ls->ls_nodes, clear_members_cb);
@@ -562,7 +585,7 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
 
                neg++;
                list_move(&memb->list, &ls->ls_nodes_gone);
-               dlm_midcomms_remove_member(memb->nodeid);
+               remove_remote_member(memb->nodeid);
                ls->ls_num_nodes--;
                dlm_lsop_recover_slot(ls, memb);
        }
index 3df916a568baf3c805b979f2daae2a3f4b5001d3..9c66cb853d173f85506c1a1bb75f452d8d7d5ffd 100644 (file)
@@ -1280,9 +1280,6 @@ void dlm_midcomms_add_member(int nodeid)
        struct midcomms_node *node;
        int idx;
 
-       if (nodeid == dlm_our_nodeid())
-               return;
-
        idx = srcu_read_lock(&nodes_srcu);
        node = nodeid2node(nodeid, GFP_NOFS);
        if (!node) {
@@ -1328,9 +1325,6 @@ void dlm_midcomms_remove_member(int nodeid)
        struct midcomms_node *node;
        int idx;
 
-       if (nodeid == dlm_our_nodeid())
-               return;
-
        idx = srcu_read_lock(&nodes_srcu);
        node = nodeid2node(nodeid, 0);
        if (!node) {
@@ -1487,9 +1481,6 @@ int dlm_midcomms_close(int nodeid)
        struct midcomms_node *node;
        int idx, ret;
 
-       if (nodeid == dlm_our_nodeid())
-               return 0;
-
        idx = srcu_read_lock(&nodes_srcu);
        /* Abort pending close/remove operation */
        node = nodeid2node(nodeid, 0);