fs: dlm: use listen sock as dlm running indicator
authorAlexander Aring <aahringo@redhat.com>
Thu, 17 Nov 2022 22:11:49 +0000 (17:11 -0500)
committerDavid Teigland <teigland@redhat.com>
Mon, 21 Nov 2022 15:45:49 +0000 (09:45 -0600)
This patch will switch from dlm_allow_conn to check if dlm lowcomms is
running or not to if we actually have a listen socket set or not. The
list socket will be set and unset in lowcomms start and shutdown
functionality. To synchronize with data_ready() callback we will set the
socket callback to NULL while socket lock is held.

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/lowcomms.h

index ac8b62106ce0e00e44a2f2b38ab6a8bd9e3fb403..20b60709eccf0b775387f9f9dc29e661e4f98ebd 100644 (file)
@@ -183,7 +183,7 @@ static int dlm_check_protocol_and_dlm_running(unsigned int x)
                return -EINVAL;
        }
 
-       if (dlm_allow_conn)
+       if (dlm_lowcomms_is_running())
                return -EBUSY;
 
        return 0;
@@ -194,7 +194,7 @@ static int dlm_check_zero_and_dlm_running(unsigned int x)
        if (!x)
                return -EINVAL;
 
-       if (dlm_allow_conn)
+       if (dlm_lowcomms_is_running())
                return -EBUSY;
 
        return 0;
index d3302b10b37e0f3946d33eb5cae3cafa3157cc6c..d9001d40aa6e89b464e251daa80d806f30475e1f 100644 (file)
@@ -176,7 +176,6 @@ static DEFINE_SPINLOCK(dlm_node_addrs_spin);
 static struct listen_connection listen_con;
 static struct sockaddr_storage *dlm_local_addr[DLM_MAX_ADDR_COUNT];
 static int dlm_local_count;
-int dlm_allow_conn;
 
 /* Work queues */
 static struct workqueue_struct *recv_workqueue;
@@ -191,6 +190,11 @@ static const struct dlm_proto_ops *dlm_proto_ops;
 static void process_recv_sockets(struct work_struct *work);
 static void process_send_sockets(struct work_struct *work);
 
+bool dlm_lowcomms_is_running(void)
+{
+       return !!listen_con.sock;
+}
+
 static void writequeue_entry_ctor(void *data)
 {
        struct writequeue_entry *entry = data;
@@ -511,9 +515,6 @@ static void lowcomms_data_ready(struct sock *sk)
 
 static void lowcomms_listen_data_ready(struct sock *sk)
 {
-       if (!dlm_allow_conn)
-               return;
-
        queue_work(recv_workqueue, &listen_con.rwork);
 }
 
@@ -1689,10 +1690,7 @@ void dlm_lowcomms_shutdown(void)
 {
        int idx;
 
-       /* Set all the flags to prevent any
-        * socket activity.
-        */
-       dlm_allow_conn = 0;
+       restore_callbacks(listen_con.sock);
 
        if (recv_workqueue)
                flush_workqueue(recv_workqueue);
@@ -1995,8 +1993,6 @@ int dlm_lowcomms_start(void)
        if (error)
                goto fail_local;
 
-       dlm_allow_conn = 1;
-
        /* Start listening */
        switch (dlm_config.ci_protocol) {
        case DLM_PROTO_TCP:
@@ -2021,7 +2017,6 @@ int dlm_lowcomms_start(void)
 fail_listen:
        dlm_proto_ops = NULL;
 fail_proto_ops:
-       dlm_allow_conn = 0;
        work_stop();
 fail_local:
        deinit_local();
index bbce7a18416dc3cf9b769424cf52f0fb08a1e968..acaf1b0b3885bda9292453c348f5a6c60c0db732 100644 (file)
@@ -29,8 +29,8 @@ static inline int nodeid_hash(int nodeid)
        return nodeid & (CONN_HASH_SIZE-1);
 }
 
-/* switch to check if dlm is running */
-extern int dlm_allow_conn;
+/* check if dlm is running */
+bool dlm_lowcomms_is_running(void);
 
 int dlm_lowcomms_start(void);
 void dlm_lowcomms_shutdown(void);