Message ID | 20220826074215.159686-1-shinichiro.kawasaki@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] btrfs: zoned: set pseudo max append zone limit in zone emulation mode | expand |
Looks good,
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
On Fri, Aug 26, 2022 at 04:42:15PM +0900, Shin'ichiro Kawasaki wrote: > The commit 7d7672bc5d10 ("btrfs: convert count_max_extents() to use > fs_info->max_extent_size") introduced a division by > fs_info->max_extent_size. This max_extent_size is initialized with max > zone append limit size of the device btrfs runs on. However, in zone > emulation mode, the device is not zoned then its zone append limit is > zero. This resulted in zero value of fs_info->max_extent_size and caused > zero division error. > > Fix the error by setting non-zero pseudo value to max append zone limit > in zone emulation mode. Set the pseudo value based on max_segments as > suggested in the commit c2ae7b772ef4 ("btrfs: zoned: revive > max_zone_append_bytes"). > > Fixes: 7d7672bc5d10 ("btrfs: convert count_max_extents() to use fs_info->max_extent_size") > Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com> > --- > Changes from v1: > * Improved comment description as suggested > * Added missing type cast to u64 > > fs/btrfs/zoned.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) Looks good as well. Reviewed-by: Naohiro Aota <naohiro.aota@wdc.com>
On Fri, Aug 26, 2022 at 04:42:15PM +0900, Shin'ichiro Kawasaki wrote: > The commit 7d7672bc5d10 ("btrfs: convert count_max_extents() to use > fs_info->max_extent_size") introduced a division by > fs_info->max_extent_size. This max_extent_size is initialized with max > zone append limit size of the device btrfs runs on. However, in zone > emulation mode, the device is not zoned then its zone append limit is > zero. This resulted in zero value of fs_info->max_extent_size and caused > zero division error. > > Fix the error by setting non-zero pseudo value to max append zone limit > in zone emulation mode. Set the pseudo value based on max_segments as > suggested in the commit c2ae7b772ef4 ("btrfs: zoned: revive > max_zone_append_bytes"). > > Fixes: 7d7672bc5d10 ("btrfs: convert count_max_extents() to use fs_info->max_extent_size") > Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com> Added to misc-next, thanks.
diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c index b150b07ba1a7..9a920dfa7b83 100644 --- a/fs/btrfs/zoned.c +++ b/fs/btrfs/zoned.c @@ -421,10 +421,19 @@ int btrfs_get_dev_zone_info(struct btrfs_device *device, bool populate_cache) * since btrfs adds the pages one by one to a bio, and btrfs cannot * increase the metadata reservation even if it increases the number of * extents, it is safe to stick with the limit. + * + * With the zoned emulation, we can have non-zoned device on the zoned + * mode. In this case, we don't have a valid max zone append size. So, + * use max_segments * PAGE_SIZE as the pseudo max_zone_append_size. */ - zone_info->max_zone_append_size = - min_t(u64, (u64)bdev_max_zone_append_sectors(bdev) << SECTOR_SHIFT, - (u64)bdev_max_segments(bdev) << PAGE_SHIFT); + if (bdev_is_zoned(bdev)) { + zone_info->max_zone_append_size = min_t(u64, + (u64)bdev_max_zone_append_sectors(bdev) << SECTOR_SHIFT, + (u64)bdev_max_segments(bdev) << PAGE_SHIFT); + } else { + zone_info->max_zone_append_size = + (u64)bdev_max_segments(bdev) << PAGE_SHIFT; + } if (!IS_ALIGNED(nr_sectors, zone_sectors)) zone_info->nr_zones++;
The commit 7d7672bc5d10 ("btrfs: convert count_max_extents() to use fs_info->max_extent_size") introduced a division by fs_info->max_extent_size. This max_extent_size is initialized with max zone append limit size of the device btrfs runs on. However, in zone emulation mode, the device is not zoned then its zone append limit is zero. This resulted in zero value of fs_info->max_extent_size and caused zero division error. Fix the error by setting non-zero pseudo value to max append zone limit in zone emulation mode. Set the pseudo value based on max_segments as suggested in the commit c2ae7b772ef4 ("btrfs: zoned: revive max_zone_append_bytes"). Fixes: 7d7672bc5d10 ("btrfs: convert count_max_extents() to use fs_info->max_extent_size") Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com> --- Changes from v1: * Improved comment description as suggested * Added missing type cast to u64 fs/btrfs/zoned.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)