]> www.infradead.org Git - users/hch/misc.git/commitdiff
btrfs: zoned: calculate max_extent_size properly on non-zoned setup
authorChristoph Hellwig <hch@lst.de>
Fri, 13 Dec 2024 06:43:43 +0000 (07:43 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 6 Jan 2025 15:32:35 +0000 (16:32 +0100)
Since commit 559218d43ec9 ("block: pre-calculate max_zone_append_sectors"),
queue_limits's max_zone_append_sectors is default to be 0 and it is only
updated when there is a zoned device. So, we have
lim->max_zone_append_sectors = 0 when there is no zoned device in the
filesystem.

That leads to fs_info->max_zone_append_size and thus
fs_info->max_extent_size to be 0, which is wrong and can for example
lead to a divide by zero in count_max_extents().

Fix this by only capping fs_info->max_extent_size to
fs_info->max_zone_append_size when it is non-zero.

Based on a patch from Naohiro Aota <naohiro.aota@wdc.com>, from which
much of this commit message is stolen as well.

Reported-by: Shinichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Fixes: 559218d43ec9 ("block: pre-calculate max_zone_append_sectors")
Tested-by: Shinichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Naohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/zoned.c

index cb32966380f5758e660e78f90cc7ca3feb5e94dc..5f9d3be1234ab25854a2b8f312ab9f0f9135e4f4 100644 (file)
@@ -745,8 +745,9 @@ int btrfs_check_zoned_mode(struct btrfs_fs_info *fs_info)
                     (u64)lim->max_segments << PAGE_SHIFT),
                fs_info->sectorsize);
        fs_info->fs_devices->chunk_alloc_policy = BTRFS_CHUNK_ALLOC_ZONED;
-       if (fs_info->max_zone_append_size < fs_info->max_extent_size)
-               fs_info->max_extent_size = fs_info->max_zone_append_size;
+
+       fs_info->max_extent_size = min_not_zero(fs_info->max_extent_size,
+                                               fs_info->max_zone_append_size);
 
        /*
         * Check mount options here, because we might change fs_info->zoned