Btrfs: Return value checking in module init
authorWyatt Banks <wyatt@banksresearch.com>
Mon, 19 Nov 2007 15:22:33 +0000 (10:22 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:58 +0000 (11:03 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent_map.c
fs/btrfs/extent_map.h
fs/btrfs/super.c

index b3ff63c4bf2af19b584050e3565a592f8bda2ba2..f91f28efdb59c59bd569139ae712fbef83bc0c15 100644 (file)
@@ -42,18 +42,30 @@ struct extent_page_data {
        struct extent_map_tree *tree;
        get_extent_t *get_extent;
 };
-
-void __init extent_map_init(void)
+int __init extent_map_init(void)
 {
        extent_map_cache = btrfs_cache_create("extent_map",
                                            sizeof(struct extent_map), 0,
                                            NULL);
+       if (!extent_map_cache)
+               return -ENOMEM;
        extent_state_cache = btrfs_cache_create("extent_state",
                                            sizeof(struct extent_state), 0,
                                            NULL);
+       if (!extent_state_cache)
+               goto free_map_cache;
        extent_buffer_cache = btrfs_cache_create("extent_buffers",
                                            sizeof(struct extent_buffer), 0,
                                            NULL);
+       if (!extent_buffer_cache)
+               goto free_state_cache;
+       return 0;
+
+free_state_cache:
+       kmem_cache_destroy(extent_state_cache);
+free_map_cache:
+       kmem_cache_destroy(extent_map_cache);
+       return -ENOMEM;
 }
 
 void __exit extent_map_exit(void)
index fbd23a72f53b6dd6a1eb9f654ef1f080f1658e2c..24ddc8c9346146a2a2f64e06848a05bb04511ea7 100644 (file)
@@ -110,7 +110,7 @@ struct extent_map *alloc_extent_map(gfp_t mask);
 void free_extent_map(struct extent_map *em);
 int extent_read_full_page(struct extent_map_tree *tree, struct page *page,
                          get_extent_t *get_extent);
-void __init extent_map_init(void);
+int __init extent_map_init(void);
 void __exit extent_map_exit(void);
 
 int test_range_bit(struct extent_map_tree *tree, u64 start, u64 end,
index c46bc39117982ac2ed96a8dbef5c660cbcf7334d..ffa02872c4d6d205037e84303177d8391fb2267e 100644 (file)
@@ -347,9 +347,24 @@ static int __init init_btrfs_fs(void)
        btrfs_init_transaction_sys();
        err = btrfs_init_cachep();
        if (err)
-               return err;
-       extent_map_init();
-       return register_filesystem(&btrfs_fs_type);
+               goto free_transaction_sys;
+       err = extent_map_init();
+       if (err)
+               goto free_cachep;
+
+       err = register_filesystem(&btrfs_fs_type);
+       if (err)
+               goto free_extent_map;
+       return 0;
+
+free_extent_map:
+       extent_map_exit();
+free_cachep:
+       btrfs_destroy_cachep();
+free_transaction_sys:
+       btrfs_exit_transaction_sys();
+       btrfs_exit_sysfs();
+       return err;
 }
 
 static void __exit exit_btrfs_fs(void)