dm: fix various targets to dm_register_target after module __init resources created
[pandora-kernel.git] / drivers / md / dm-snap.c
index 6674ebf..5d6b533 100644 (file)
@@ -2293,24 +2293,6 @@ static int __init dm_snapshot_init(void)
                return r;
        }
 
-       r = dm_register_target(&snapshot_target);
-       if (r < 0) {
-               DMERR("snapshot target register failed %d", r);
-               goto bad_register_snapshot_target;
-       }
-
-       r = dm_register_target(&origin_target);
-       if (r < 0) {
-               DMERR("Origin target register failed %d", r);
-               goto bad_register_origin_target;
-       }
-
-       r = dm_register_target(&merge_target);
-       if (r < 0) {
-               DMERR("Merge target register failed %d", r);
-               goto bad_register_merge_target;
-       }
-
        r = init_origin_hash();
        if (r) {
                DMERR("init_origin_hash failed.");
@@ -2338,8 +2320,32 @@ static int __init dm_snapshot_init(void)
                goto bad_tracked_chunk_cache;
        }
 
+       r = dm_register_target(&snapshot_target);
+       if (r < 0) {
+               DMERR("snapshot target register failed %d", r);
+               goto bad_register_snapshot_target;
+       }
+
+       r = dm_register_target(&origin_target);
+       if (r < 0) {
+               DMERR("Origin target register failed %d", r);
+               goto bad_register_origin_target;
+       }
+
+       r = dm_register_target(&merge_target);
+       if (r < 0) {
+               DMERR("Merge target register failed %d", r);
+               goto bad_register_merge_target;
+       }
+
        return 0;
 
+bad_register_merge_target:
+       dm_unregister_target(&origin_target);
+bad_register_origin_target:
+       dm_unregister_target(&snapshot_target);
+bad_register_snapshot_target:
+       kmem_cache_destroy(tracked_chunk_cache);
 bad_tracked_chunk_cache:
        kmem_cache_destroy(pending_cache);
 bad_pending_cache:
@@ -2347,12 +2353,6 @@ bad_pending_cache:
 bad_exception_cache:
        exit_origin_hash();
 bad_origin_hash:
-       dm_unregister_target(&merge_target);
-bad_register_merge_target:
-       dm_unregister_target(&origin_target);
-bad_register_origin_target:
-       dm_unregister_target(&snapshot_target);
-bad_register_snapshot_target:
        dm_exception_store_exit();
 
        return r;