]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/ecryptfs/main.c
ecryptfs: fix error handling
[linux-2.6-omap-h63xx.git] / fs / ecryptfs / main.c
index 00686f1c59976a01188b9729a2a408219a87ef9f..49545951912f44ce21e6f1206a3231bc691f621a 100644 (file)
@@ -799,13 +799,6 @@ out:
 
 static void do_sysfs_unregistration(void)
 {
-       int rc;
-
-       rc = ecryptfs_destroy_crypto();
-       if (rc) {
-               printk(KERN_ERR "Failure whilst attempting to destroy crypto; "
-                      "rc = [%d]\n", rc);
-       }
        sysfs_remove_file(&ecryptfs_subsys.kobj,
                          &sysfs_attr_version.attr);
        sysfs_remove_file(&ecryptfs_subsys.kobj,
@@ -836,43 +829,49 @@ static int __init ecryptfs_init(void)
        rc = register_filesystem(&ecryptfs_fs_type);
        if (rc) {
                printk(KERN_ERR "Failed to register filesystem\n");
-               ecryptfs_free_kmem_caches();
-               goto out;
+               goto out_free_kmem_caches;
        }
        kobj_set_kset_s(&ecryptfs_subsys, fs_subsys);
        rc = do_sysfs_registration();
        if (rc) {
                printk(KERN_ERR "sysfs registration failed\n");
-               unregister_filesystem(&ecryptfs_fs_type);
-               ecryptfs_free_kmem_caches();
-               goto out;
+               goto out_unregister_filesystem;
        }
        rc = ecryptfs_init_messaging(ecryptfs_transport);
        if (rc) {
                ecryptfs_printk(KERN_ERR, "Failure occured while attempting to "
                                "initialize the eCryptfs netlink socket\n");
-               do_sysfs_unregistration();
-               unregister_filesystem(&ecryptfs_fs_type);
-               ecryptfs_free_kmem_caches();
-               goto out;
+               goto out_do_sysfs_unregistration;
        }
        rc = ecryptfs_init_crypto();
        if (rc) {
                printk(KERN_ERR "Failure whilst attempting to init crypto; "
                       "rc = [%d]\n", rc);
-               do_sysfs_unregistration();
-               unregister_filesystem(&ecryptfs_fs_type);
-               ecryptfs_free_kmem_caches();
-               goto out;
+               goto out_release_messaging;
        }
+       goto out;
+out_release_messaging:
+       ecryptfs_release_messaging(ecryptfs_transport);
+out_do_sysfs_unregistration:
+       do_sysfs_unregistration();
+out_unregister_filesystem:
+       unregister_filesystem(&ecryptfs_fs_type);
+out_free_kmem_caches:
+       ecryptfs_free_kmem_caches();
 out:
        return rc;
 }
 
 static void __exit ecryptfs_exit(void)
 {
-       do_sysfs_unregistration();
+       int rc;
+
+       rc = ecryptfs_destroy_crypto();
+       if (rc)
+               printk(KERN_ERR "Failure whilst attempting to destroy crypto; "
+                      "rc = [%d]\n", rc);
        ecryptfs_release_messaging(ecryptfs_transport);
+       do_sysfs_unregistration();
        unregister_filesystem(&ecryptfs_fs_type);
        ecryptfs_free_kmem_caches();
 }