summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/extent_map.c16
-rw-r--r--fs/btrfs/extent_map.h2
-rw-r--r--fs/btrfs/super.c21
3 files changed, 33 insertions, 6 deletions
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
index b3ff63c4bf2a..f91f28efdb59 100644
--- a/fs/btrfs/extent_map.c
+++ b/fs/btrfs/extent_map.c
@@ -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)
diff --git a/fs/btrfs/extent_map.h b/fs/btrfs/extent_map.h
index fbd23a72f53b..24ddc8c93461 100644
--- a/fs/btrfs/extent_map.h
+++ b/fs/btrfs/extent_map.h
@@ -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,
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index c46bc3911798..ffa02872c4d6 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -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)
OpenPOWER on IntegriCloud