FAILED: patch "[PATCH] btrfs: fix double free in create_space_info_sub_group() error" failed to apply to 6.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x a7449edf96143f192606ec8647e3167e1ecbd728
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026051234-decidable-catalyst-a4ae@gregkh' --subject-prefix 'PATCH 6.18.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a7449edf96143f192606ec8647e3167e1ecbd728 Mon Sep 17 00:00:00 2001
From: Guangshuo Li <[email protected]>
Date: Wed, 1 Apr 2026 19:02:19 +0800
Subject: [PATCH] btrfs: fix double free in create_space_info_sub_group() error
path
When kobject_init_and_add() fails, the call chain is:
create_space_info_sub_group()
-> btrfs_sysfs_add_space_info_type()
-> kobject_init_and_add()
-> failure
-> kobject_put(&sub_group->kobj)
-> space_info_release()
-> kfree(sub_group)
Then control returns to create_space_info_sub_group(), where:
btrfs_sysfs_add_space_info_type() returns error
-> kfree(sub_group)
Thus, sub_group is freed twice.
Keep parent->sub_group[index] = NULL for the failure path, but after btrfs_sysfs_add_space_info_type() has called kobject_put(), let the kobject release callback handle the cleanup.
fs/btrfs/space-info.c +1 -3
@@ -287,10 +287,8 @@ static int create_space_info_sub_group(struct btrfs_space_info *parent, u64 flag sub_group->subgroup_id = id; ret =btrfs_sysfs_add_space_info_type (sub_group); -if (ret) { -kfree (sub_group); +if (ret) parent->sub_group[index] =NULL ; - }return ret; }
Sasha Levin
maintainerPATCH 1/2 btrfs: remove fs_info argument from btrfs_sysfs_add_space_info_type()
From: Filipe Manana <[email protected]>
[ Upstream commit 771af6ff72e0ed0eb8bf97e5ae4fa5094e0c5d1d ]
We don't need it since we can grab fs_info from the given space_info. So remove the fs_info argument.
Stable-dep-of: a7449edf9614 ("btrfs: fix double free in create_space_info_sub_group() error path")
--- fs/btrfs/space-info.c | 4 ++-- fs/btrfs/sysfs.c | 5 ++--- fs/btrfs/sysfs.h | 3 +-- 3 files changed, 5 insertions(+), 7 deletions(-)
fs/btrfs/space-info.c +2 -2
@@ -275,7 +275,7 @@ static int create_space_info_sub_group(struct btrfs_space_info *parent, u64 flag sub_group->parent = parent; sub_group->subgroup_id = id; - ret =btrfs_sysfs_add_space_info_type (fs_info, sub_group); + ret =btrfs_sysfs_add_space_info_type (sub_group);if (ret) {kfree (sub_group); parent->sub_group[index] =NULL ;
@@ -309,7 +309,7 @@ static int create_space_info(struct btrfs_fs_info *info, u64 flags) goto out_free; } - ret =btrfs_sysfs_add_space_info_type (info, space_info); + ret =btrfs_sysfs_add_space_info_type (space_info);if (ret)return ret;
fs/btrfs/sysfs.c +2 -3
@@ -1981,13 +1981,12 @@ static const char *alloc_name(struct btrfs_space_info *space_info)* Create a sysfs entry for a space info type at path * /sys/fs/btrfs/UUID/allocation/TYPE */ -int btrfs_sysfs_add_space_info_type (struct btrfs_fs_info *fs_info, -struct btrfs_space_info *space_info) +int btrfs_sysfs_add_space_info_type (struct btrfs_space_info *space_info) {int ret; ret =kobject_init_and_add (&space_info->kobj, &space_info_ktype, - fs_info->space_info_kobj,"%s" , + space_info->fs_info->space_info_kobj,"%s" ,alloc_name (space_info));if (ret) {kobject_put (&space_info->kobj);
fs/btrfs/sysfs.h +1 -2
@@ -37,8 +37,7 @@ void __cold btrfs_exit_sysfs(void);int btrfs_sysfs_add_mounted (struct btrfs_fs_info *fs_info);void btrfs_sysfs_remove_mounted (struct btrfs_fs_info *fs_info);void btrfs_sysfs_add_block_group_type (struct btrfs_block_group *cache); -int btrfs_sysfs_add_space_info_type (struct btrfs_fs_info *fs_info, -struct btrfs_space_info *space_info); +int btrfs_sysfs_add_space_info_type (struct btrfs_space_info *space_info);void btrfs_sysfs_remove_space_info (struct btrfs_space_info *space_info);void btrfs_sysfs_update_devid (struct btrfs_device *device);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 btrfs: fix double free in create_space_info_sub_group() error path
From: Guangshuo Li <[email protected]>
[ Upstream commit a7449edf96143f192606ec8647e3167e1ecbd728 ]
When kobject_init_and_add() fails, the call chain is:
create_space_info_sub_group()
-> btrfs_sysfs_add_space_info_type()
-> kobject_init_and_add()
-> failure
-> kobject_put(&sub_group->kobj)
-> space_info_release()
-> kfree(sub_group)
Then control returns to create_space_info_sub_group(), where:
btrfs_sysfs_add_space_info_type() returns error
-> kfree(sub_group)
Thus, sub_group is freed twice.
Keep parent->sub_group[index] = NULL for the failure path, but after btrfs_sysfs_add_space_info_type() has called kobject_put(), let the kobject release callback handle the cleanup.
--- fs/btrfs/space-info.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
fs/btrfs/space-info.c +1 -3
@@ -276,10 +276,8 @@ static int create_space_info_sub_group(struct btrfs_space_info *parent, u64 flag sub_group->subgroup_id = id; ret =btrfs_sysfs_add_space_info_type (sub_group); -if (ret) { -kfree (sub_group); +if (ret) parent->sub_group[index] =NULL ; - }return ret; }
Signature · 1 line
2.53.0