Commit 82c0efd3 authored by Anand Jain's avatar Anand Jain Committed by David Sterba
Browse files

btrfs: merge module cleanup sequence to one helper



The module exit function exit_btrfs_fs() is duplicating a section of code
in init_btrfs_fs(). Add a helper to remove the duplicated code. Due
to the init/exit section requirements the function must be inline and
not a plain static as it could cause section mismatch.

Signed-off-by: default avatarAnand Jain <anand.jain@oracle.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 02bc3927
Loading
Loading
Loading
Loading
+10 −18
Original line number Diff line number Diff line
@@ -2837,7 +2837,7 @@ static const struct init_sequence mod_init_seq[] = {

static bool mod_init_result[ARRAY_SIZE(mod_init_seq)];

static void __exit exit_btrfs_fs(void)
static __always_inline void btrfs_exit_btrfs_fs(void)
{
	int i;

@@ -2850,6 +2850,11 @@ static void __exit exit_btrfs_fs(void)
	}
}

static void __exit exit_btrfs_fs(void)
{
	btrfs_exit_btrfs_fs();
}

static int __init init_btrfs_fs(void)
{
	int ret;
@@ -2858,26 +2863,13 @@ static int __init init_btrfs_fs(void)
	for (i = 0; i < ARRAY_SIZE(mod_init_seq); i++) {
		ASSERT(!mod_init_result[i]);
		ret = mod_init_seq[i].init_func();
		if (ret < 0)
			goto error;
		if (ret < 0) {
			btrfs_exit_btrfs_fs();
			return ret;
		}
		mod_init_result[i] = true;
	}
	return 0;

error:
	/*
	 * If we call exit_btrfs_fs() it would cause section mismatch.
	 * As init_btrfs_fs() belongs to .init.text, while exit_btrfs_fs()
	 * belongs to .exit.text.
	 */
	for (i = ARRAY_SIZE(mod_init_seq) - 1; i >= 0; i--) {
		if (!mod_init_result[i])
			continue;
		if (mod_init_seq[i].exit_func)
			mod_init_seq[i].exit_func();
		mod_init_result[i] = false;
	}
	return ret;
}

late_initcall(init_btrfs_fs);