From: Markus Elfring <[email protected]>
Date: Sat, 1 Oct 2016 15:40:32 +0200

A few resource release functions were called in some cases
by the join() function during error handling
even if the passed data structure member contained a null pointer.

* Adjust jump targets according to the Linux coding style convention.

* Delete a repeated check which became unnecessary with this refactoring.

Signed-off-by: Markus Elfring <[email protected]>
---
 drivers/md/md-cluster.c | 47 ++++++++++++++++++++++++++---------------------
 1 file changed, 26 insertions(+), 21 deletions(-)

diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
index e1ebcc4..36bb962 100644
--- a/drivers/md/md-cluster.c
+++ b/drivers/md/md-cluster.c
@@ -837,39 +837,39 @@ static int join(struct mddev *mddev, int nodes)
                                DLM_LSFL_FS, LVB_SIZE,
                                &md_ls_ops, mddev, &ops_rv, &cinfo->lockspace);
        if (ret)
-               goto err;
+               goto free_cluster_info;
        wait_for_completion(&cinfo->completion);
        if (nodes < cinfo->slot_number) {
                pr_err("md-cluster: Slot allotted(%d) is greater than available 
slots(%d).",
                        cinfo->slot_number, nodes);
                ret = -ERANGE;
-               goto err;
+               goto release_lockspace;
        }
        /* Initiate the communication resources */
        ret = -ENOMEM;
        cinfo->recv_thread = md_register_thread(recv_daemon, mddev, 
"cluster_recv");
        if (!cinfo->recv_thread)
-               goto err;
+               goto release_lockspace;
        cinfo->message_lockres = lockres_init(mddev, "message", NULL, 1);
        if (!cinfo->message_lockres)
-               goto err;
+               goto unregister_recv;
        cinfo->token_lockres = lockres_init(mddev, "token", NULL, 0);
        if (!cinfo->token_lockres)
-               goto err;
+               goto free_message;
        cinfo->no_new_dev_lockres = lockres_init(mddev, "no-new-dev", NULL, 0);
        if (!cinfo->no_new_dev_lockres)
-               goto err;
+               goto free_token;
 
        ret = dlm_lock_sync(cinfo->token_lockres, DLM_LOCK_EX);
        if (ret) {
                ret = -EAGAIN;
                pr_err("md-cluster: can't join cluster to avoid lock issue\n");
-               goto err;
+               goto free_no_new_dev;
        }
        cinfo->ack_lockres = lockres_init(mddev, "ack", ack_bast, 0);
        if (!cinfo->ack_lockres) {
                ret = -ENOMEM;
-               goto err;
+               goto free_no_new_dev;
        }
        /* get sync CR lock on ACK. */
        if (dlm_lock_sync(cinfo->ack_lockres, DLM_LOCK_CR))
@@ -886,34 +886,39 @@ static int join(struct mddev *mddev, int nodes)
        cinfo->bitmap_lockres = lockres_init(mddev, str, NULL, 1);
        if (!cinfo->bitmap_lockres) {
                ret = -ENOMEM;
-               goto err;
+               goto free_ack;
        }
        if (dlm_lock_sync(cinfo->bitmap_lockres, DLM_LOCK_PW)) {
                pr_err("Failed to get bitmap lock\n");
                ret = -EINVAL;
-               goto err;
+               goto free_bitmap;
        }
 
        cinfo->resync_lockres = lockres_init(mddev, "resync", NULL, 0);
        if (!cinfo->resync_lockres) {
                ret = -ENOMEM;
-               goto err;
+               goto free_bitmap;
        }
 
        return 0;
-err:
-       md_unregister_thread(&cinfo->recovery_thread);
-       md_unregister_thread(&cinfo->recv_thread);
-       lockres_free(cinfo->message_lockres);
-       lockres_free(cinfo->token_lockres);
+free_bitmap:
+       lockres_free(cinfo->bitmap_lockres);
+free_ack:
        lockres_free(cinfo->ack_lockres);
+free_no_new_dev:
        lockres_free(cinfo->no_new_dev_lockres);
-       lockres_free(cinfo->resync_lockres);
-       lockres_free(cinfo->bitmap_lockres);
-       if (cinfo->lockspace)
-               dlm_release_lockspace(cinfo->lockspace, 2);
-       mddev->cluster_info = NULL;
+free_token:
+       lockres_free(cinfo->token_lockres);
+free_message:
+       lockres_free(cinfo->message_lockres);
+unregister_recv:
+       md_unregister_thread(&cinfo->recv_thread);
+release_lockspace:
+       dlm_release_lockspace(cinfo->lockspace, 2);
+free_cluster_info:
        kfree(cinfo);
+       md_unregister_thread(&cinfo->recovery_thread);
+       mddev->cluster_info = NULL;
        return ret;
 }
 
-- 
2.10.0

Reply via email to