From: Alexander Aring <[email protected]>

[ Upstream commit fcef0e6c27ce109d2c617aa12f0bfd9f7ff47d38 ]

This patch fixes the error path handling in lowcomms_start(). We need to
cleanup some static allocated data structure and cleanup possible
workqueue if these have started.

Signed-off-by: Alexander Aring <[email protected]>
Signed-off-by: David Teigland <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
---
 fs/dlm/lowcomms.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 7e6736c70e11..d2a0ea0acca3 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -1600,10 +1600,15 @@ static void process_send_sockets(struct work_struct 
*work)
 
 static void work_stop(void)
 {
-       if (recv_workqueue)
+       if (recv_workqueue) {
                destroy_workqueue(recv_workqueue);
-       if (send_workqueue)
+               recv_workqueue = NULL;
+       }
+
+       if (send_workqueue) {
                destroy_workqueue(send_workqueue);
+               send_workqueue = NULL;
+       }
 }
 
 static int work_start(void)
@@ -1620,6 +1625,7 @@ static int work_start(void)
        if (!send_workqueue) {
                log_print("can't start dlm_send");
                destroy_workqueue(recv_workqueue);
+               recv_workqueue = NULL;
                return -ENOMEM;
        }
 
@@ -1751,7 +1757,7 @@ int dlm_lowcomms_start(void)
 
        error = work_start();
        if (error)
-               goto fail;
+               goto fail_local;
 
        dlm_allow_conn = 1;
 
@@ -1768,6 +1774,9 @@ int dlm_lowcomms_start(void)
 fail_unlisten:
        dlm_allow_conn = 0;
        dlm_close_sock(&listen_con.sock);
+       work_stop();
+fail_local:
+       deinit_local();
 fail:
        return error;
 }
-- 
2.30.2

Reply via email to