Linux Kernels

Btrfs: Return value checking in module init

This change “Btrfs: Return value checking in module init” (commit 2f4cbe6) in Linux kernel is authored by Wyatt Banks <wyatt [at] banksresearch.com> on Mon Nov 19 10:22:33 2007 -0500.

Description of "Btrfs: Return value checking in module init"

The change “Btrfs: Return value checking in module init” introduces changes as follows.

Btrfs: Return value checking in module init

Signed-off-by: Chris Mason <chris.mason@oracle.com>

Linux kernel releases containing commit 2f4cbe6

The Linux kernel releases containing this commit are as follows.

Linux kernel code changes from "Btrfs: Return value checking in module init"

There are 39 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 fs/btrfs/extent_map.c | 16 ++++++++++++++--
 fs/btrfs/extent_map.h |  2 +-
 fs/btrfs/super.c      | 21 ++++++++++++++++++---
 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)

The commit for this change in Linux stable tree is 2f4cbe6 (patch).

Last modified: 2020/01/11 09:37