summaryrefslogtreecommitdiffstats
path: root/0001-btrfs-fix-block-group-leak-when-removing-fails.patch
diff options
context:
space:
mode:
Diffstat (limited to '0001-btrfs-fix-block-group-leak-when-removing-fails.patch')
-rw-r--r--0001-btrfs-fix-block-group-leak-when-removing-fails.patch94
1 files changed, 0 insertions, 94 deletions
diff --git a/0001-btrfs-fix-block-group-leak-when-removing-fails.patch b/0001-btrfs-fix-block-group-leak-when-removing-fails.patch
deleted file mode 100644
index 71c60cc30..000000000
--- a/0001-btrfs-fix-block-group-leak-when-removing-fails.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From f6033c5e333238f299c3ae03fac8cc1365b23b77 Mon Sep 17 00:00:00 2001
-From: Xiyu Yang <xiyuyang19@fudan.edu.cn>
-Date: Tue, 21 Apr 2020 10:54:11 +0800
-Subject: [PATCH] btrfs: fix block group leak when removing fails
-
-btrfs_remove_block_group() invokes btrfs_lookup_block_group(), which
-returns a local reference of the block group that contains the given
-bytenr to "block_group" with increased refcount.
-
-When btrfs_remove_block_group() returns, "block_group" becomes invalid,
-so the refcount should be decreased to keep refcount balanced.
-
-The reference counting issue happens in several exception handling paths
-of btrfs_remove_block_group(). When those error scenarios occur such as
-btrfs_alloc_path() returns NULL, the function forgets to decrease its
-refcnt increased by btrfs_lookup_block_group() and will cause a refcnt
-leak.
-
-Fix this issue by jumping to "out_put_group" label and calling
-btrfs_put_block_group() when those error scenarios occur.
-
-CC: stable@vger.kernel.org # 4.4+
-Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
-Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
-Reviewed-by: David Sterba <dsterba@suse.com>
-Signed-off-by: David Sterba <dsterba@suse.com>
----
- fs/btrfs/block-group.c | 16 ++++++++++------
- 1 file changed, 10 insertions(+), 6 deletions(-)
-
-diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
-index af9e9a008724..696f47103cfc 100644
---- a/fs/btrfs/block-group.c
-+++ b/fs/btrfs/block-group.c
-@@ -916,7 +916,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
- path = btrfs_alloc_path();
- if (!path) {
- ret = -ENOMEM;
-- goto out;
-+ goto out_put_group;
- }
-
- /*
-@@ -954,7 +954,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
- ret = btrfs_orphan_add(trans, BTRFS_I(inode));
- if (ret) {
- btrfs_add_delayed_iput(inode);
-- goto out;
-+ goto out_put_group;
- }
- clear_nlink(inode);
- /* One for the block groups ref */
-@@ -977,13 +977,13 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
-
- ret = btrfs_search_slot(trans, tree_root, &key, path, -1, 1);
- if (ret < 0)
-- goto out;
-+ goto out_put_group;
- if (ret > 0)
- btrfs_release_path(path);
- if (ret == 0) {
- ret = btrfs_del_item(trans, tree_root, path);
- if (ret)
-- goto out;
-+ goto out_put_group;
- btrfs_release_path(path);
- }
-
-@@ -1102,9 +1102,9 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
-
- ret = remove_block_group_free_space(trans, block_group);
- if (ret)
-- goto out;
-+ goto out_put_group;
-
-- btrfs_put_block_group(block_group);
-+ /* Once for the block groups rbtree */
- btrfs_put_block_group(block_group);
-
- ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
-@@ -1127,6 +1127,10 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
- /* once for the tree */
- free_extent_map(em);
- }
-+
-+out_put_group:
-+ /* Once for the lookup reference */
-+ btrfs_put_block_group(block_group);
- out:
- if (remove_rsv)
- btrfs_delayed_refs_rsv_release(fs_info, 1);
---
-2.26.2
-