ocfs2: fix leaks on failure exits in module_init
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 18 Mar 2012 02:03:58 +0000 (22:03 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 21 Mar 2012 01:29:49 +0000 (21:29 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/ocfs2/super.c

index 337687c..68f4541 100644 (file)
@@ -1624,21 +1624,17 @@ static int __init ocfs2_init(void)
                init_waitqueue_head(&ocfs2__ioend_wq[i]);
 
        status = init_ocfs2_uptodate_cache();
-       if (status < 0) {
-               mlog_errno(status);
-               goto leave;
-       }
+       if (status < 0)
+               goto out1;
 
        status = ocfs2_initialize_mem_caches();
-       if (status < 0) {
-               mlog_errno(status);
-               goto leave;
-       }
+       if (status < 0)
+               goto out2;
 
        ocfs2_wq = create_singlethread_workqueue("ocfs2_wq");
        if (!ocfs2_wq) {
                status = -ENOMEM;
-               goto leave;
+               goto out3;
        }
 
        ocfs2_debugfs_root = debugfs_create_dir("ocfs2", NULL);
@@ -1650,17 +1646,23 @@ static int __init ocfs2_init(void)
        ocfs2_set_locking_protocol();
 
        status = register_quota_format(&ocfs2_quota_format);
-leave:
-       if (status < 0) {
-               ocfs2_free_mem_caches();
-               exit_ocfs2_uptodate_cache();
-               mlog_errno(status);
-       }
+       if (status < 0)
+               goto out4;
+       status = register_filesystem(&ocfs2_fs_type);
+       if (!status)
+               return 0;
 
-       if (status >= 0) {
-               return register_filesystem(&ocfs2_fs_type);
-       } else
-               return -1;
+       unregister_quota_format(&ocfs2_quota_format);
+out4:
+       destroy_workqueue(ocfs2_wq);
+       debugfs_remove(ocfs2_debugfs_root);
+out3:
+       ocfs2_free_mem_caches();
+out2:
+       exit_ocfs2_uptodate_cache();
+out1:
+       mlog_errno(status);
+       return status;
 }
 
 static void __exit ocfs2_exit(void)