]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: zoned: requeue to unused block group list if zone finish failed
authorNaohiro Aota <naohiro.aota@wdc.com>
Sun, 29 Jun 2025 14:18:29 +0000 (23:18 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Aug 2025 16:36:30 +0000 (18:36 +0200)
commit 62be7afcc13b2727bdc6a4c91aefed6b452e6ecc upstream.

btrfs_zone_finish() can fail for several reason. If it is -EAGAIN, we need
to try it again later. So, put the block group to the retry list properly.

Failing to do so will keep the removable block group intact until remount
and can causes unnecessary ENOSPC.

Fixes: 74e91b12b115 ("btrfs: zoned: zone finish unused block group")
CC: stable@vger.kernel.org # 6.1+
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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/btrfs/block-group.c

index a8129f1ce78c7b05d5e25a77be77bcb264d9a436..a8b8fe409b4c671a2b01ee8c675118075061d520 100644 (file)
@@ -1619,8 +1619,10 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info)
                ret = btrfs_zone_finish(block_group);
                if (ret < 0) {
                        btrfs_dec_block_group_ro(block_group);
-                       if (ret == -EAGAIN)
+                       if (ret == -EAGAIN) {
+                               btrfs_link_bg_list(block_group, &retry_list);
                                ret = 0;
+                       }
                        goto next;
                }