summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorNaohiro Aota <naota@elisp.net>2023-06-06 14:36:34 +0900
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-08-23 17:52:28 +0200
commit01eca70ef8cf499d0cb6d1bbd691558e7792cf17 (patch)
treed2e8facc13ad938051baff9532c78b855e6e4aaf /fs
parent485ec8f8e1d8ae12aa1daa5ad345ba8940ad2db7 (diff)
downloadlinux-stable-01eca70ef8cf499d0cb6d1bbd691558e7792cf17.tar.gz
linux-stable-01eca70ef8cf499d0cb6d1bbd691558e7792cf17.tar.bz2
linux-stable-01eca70ef8cf499d0cb6d1bbd691558e7792cf17.zip
btrfs: move out now unused BG from the reclaim list
[ Upstream commit a9f189716cf15913c453299d72f69c51a9b0f86b ] An unused block group is easy to remove to free up space and should be reclaimed fast. Such block group can often already be a target of the reclaim process. As we check list_empty(&bg->bg_list), we keep it in the reclaim list. That block group is never reclaimed until the file system is filled e.g. up to 75%. Instead, we can move unused block group to the unused list and delete it fast. Fixes: 18bb8bbf13c1 ("btrfs: zoned: automatically reclaim zones") CC: stable@vger.kernel.org # 5.15+ Reviewed-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com> Signed-off-by: David Sterba <dsterba@suse.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/block-group.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index 3495bc775afa..9f5a971bfed4 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -1528,11 +1528,14 @@ void btrfs_mark_bg_unused(struct btrfs_block_group *bg)
{
struct btrfs_fs_info *fs_info = bg->fs_info;
+ trace_btrfs_add_unused_block_group(bg);
spin_lock(&fs_info->unused_bgs_lock);
if (list_empty(&bg->bg_list)) {
btrfs_get_block_group(bg);
- trace_btrfs_add_unused_block_group(bg);
list_add_tail(&bg->bg_list, &fs_info->unused_bgs);
+ } else {
+ /* Pull out the block group from the reclaim_bgs list. */
+ list_move_tail(&bg->bg_list, &fs_info->unused_bgs);
}
spin_unlock(&fs_info->unused_bgs_lock);
}