]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: zoned: use filesystem size not disk size for reclaim decision
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Tue, 20 May 2025 07:20:47 +0000 (09:20 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Aug 2025 16:36:30 +0000 (18:36 +0200)
commit 55f7c65b2f69c7e4cb7aa7c1654a228ccf734fd8 upstream.

When deciding if a zoned filesystem is reaching the threshold to reclaim
data block groups, look at the size of the filesystem not to potentially
total available size of all drives in the filesystem.

Especially if a filesystem was created with mkfs' -b option, constraining
it to only a portion of the block device, the numbers won't match and
potentially garbage collection is kicking in too late.

Fixes: 3687fcb0752a ("btrfs: zoned: make auto-reclaim less aggressive")
CC: stable@vger.kernel.org # 6.1+
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Tested-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/btrfs/zoned.c

index 4a3e02b49f2957ed7f4cca4335d4b136801e1383..7e4250c73b67a3156d2cc4a741fd69c07d47c66b 100644 (file)
@@ -2477,8 +2477,8 @@ bool btrfs_zoned_should_reclaim(const struct btrfs_fs_info *fs_info)
 {
        struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;
        struct btrfs_device *device;
+       u64 total = btrfs_super_total_bytes(fs_info->super_copy);
        u64 used = 0;
-       u64 total = 0;
        u64 factor;
 
        ASSERT(btrfs_is_zoned(fs_info));
@@ -2491,7 +2491,6 @@ bool btrfs_zoned_should_reclaim(const struct btrfs_fs_info *fs_info)
                if (!device->bdev)
                        continue;
 
-               total += device->disk_total_bytes;
                used += device->bytes_used;
        }
        mutex_unlock(&fs_devices->device_list_mutex);