ocfs2/dlm: refactor error handling in dlm_alloc_ctxt
authorJoseph Qi <joseph.qi@huawei.com>
Thu, 9 Oct 2014 22:24:54 +0000 (15:24 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 10 Oct 2014 02:25:46 +0000 (22:25 -0400)
Refactoring error handling in dlm_alloc_ctxt to simplify code.

Signed-off-by: Joseph Qi <joseph.qi@huawei.com>
Reviewed-by: Alex Chen <alex.chen@huawei.com>
Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Joel Becker <jlbec@evilplan.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/ocfs2/dlm/dlmdomain.c

index 3fcf205ee900acb87eaa5f74f7c28949ee95bec4..257a6dfe3f13da9e3fded7454f6b38cdccd414e9 100644 (file)
@@ -1975,24 +1975,22 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
 
        dlm = kzalloc(sizeof(*dlm), GFP_KERNEL);
        if (!dlm) {
-               mlog_errno(-ENOMEM);
+               ret = -ENOMEM;
+               mlog_errno(ret);
                goto leave;
        }
 
        dlm->name = kstrdup(domain, GFP_KERNEL);
        if (dlm->name == NULL) {
-               mlog_errno(-ENOMEM);
-               kfree(dlm);
-               dlm = NULL;
+               ret = -ENOMEM;
+               mlog_errno(ret);
                goto leave;
        }
 
        dlm->lockres_hash = (struct hlist_head **)dlm_alloc_pagevec(DLM_HASH_PAGES);
        if (!dlm->lockres_hash) {
-               mlog_errno(-ENOMEM);
-               kfree(dlm->name);
-               kfree(dlm);
-               dlm = NULL;
+               ret = -ENOMEM;
+               mlog_errno(ret);
                goto leave;
        }
 
@@ -2002,11 +2000,8 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
        dlm->master_hash = (struct hlist_head **)
                                dlm_alloc_pagevec(DLM_HASH_PAGES);
        if (!dlm->master_hash) {
-               mlog_errno(-ENOMEM);
-               dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES);
-               kfree(dlm->name);
-               kfree(dlm);
-               dlm = NULL;
+               ret = -ENOMEM;
+               mlog_errno(ret);
                goto leave;
        }
 
@@ -2017,14 +2012,8 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
        dlm->node_num = o2nm_this_node();
 
        ret = dlm_create_debugfs_subroot(dlm);
-       if (ret < 0) {
-               dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES);
-               dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES);
-               kfree(dlm->name);
-               kfree(dlm);
-               dlm = NULL;
+       if (ret < 0)
                goto leave;
-       }
 
        spin_lock_init(&dlm->spinlock);
        spin_lock_init(&dlm->master_lock);
@@ -2085,6 +2074,19 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
                  atomic_read(&dlm->dlm_refs.refcount));
 
 leave:
+       if (ret < 0 && dlm) {
+               if (dlm->master_hash)
+                       dlm_free_pagevec((void **)dlm->master_hash,
+                                       DLM_HASH_PAGES);
+
+               if (dlm->lockres_hash)
+                       dlm_free_pagevec((void **)dlm->lockres_hash,
+                                       DLM_HASH_PAGES);
+
+               kfree(dlm->name);
+               kfree(dlm);
+               dlm = NULL;
+       }
        return dlm;
 }