On Fri, Oct 30, 2020 at 10:51:13PM +0900, Naohiro Aota wrote: > --- a/fs/btrfs/ctree.h > +++ b/fs/btrfs/ctree.h > @@ -953,6 +953,8 @@ struct btrfs_fs_info { > u64 zone_size; > u64 zoned; > }; > + /* max size to emit ZONE_APPEND write command */ /* Max size ... */ > + u64 max_zone_append_size; > > #ifdef CONFIG_BTRFS_FS_REF_VERIFY > spinlock_t ref_verify_lock; > diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c > index e1cdff5af3a3..1b42e13b8227 100644 > --- a/fs/btrfs/zoned.c > +++ b/fs/btrfs/zoned.c > @@ -47,6 +47,7 @@ int btrfs_get_dev_zone_info(struct btrfs_device *device) > { > struct btrfs_zoned_device_info *zone_info = NULL; > struct block_device *bdev = device->bdev; > + struct request_queue *q = bdev_get_queue(bdev); No single letter variables (exception is 'i' for indexing) > sector_t nr_sectors = bdev->bd_part->nr_sects; > sector_t sector = 0; > struct blk_zone *zones = NULL; > @@ -70,6 +71,8 @@ int btrfs_get_dev_zone_info(struct btrfs_device *device) > ASSERT(is_power_of_2(zone_sectors)); > zone_info->zone_size = (u64)zone_sectors << SECTOR_SHIFT; > zone_info->zone_size_shift = ilog2(zone_info->zone_size); > + zone_info->max_zone_append_size = > + (u64)queue_max_zone_append_sectors(q) << SECTOR_SHIFT; > zone_info->nr_zones = nr_sectors >> ilog2(bdev_zone_sectors(bdev)); > if (!IS_ALIGNED(nr_sectors, zone_sectors)) > zone_info->nr_zones++; > @@ -182,7 +185,8 @@ int btrfs_check_zoned_mode(struct btrfs_fs_info *fs_info) > u64 hmzoned_devices = 0; > u64 nr_devices = 0; > u64 zone_size = 0; > - int incompat_zoned = btrfs_is_zoned(fs_info); > + u64 max_zone_append_size = 0; > + bool incompat_zoned = btrfs_is_zoned(fs_info); const bool > int ret = 0; > > /* Count zoned devices */ > @@ -195,15 +199,23 @@ int btrfs_check_zoned_mode(struct btrfs_fs_info *fs_info) > model = bdev_zoned_model(device->bdev); > if (model == BLK_ZONED_HM || > (model == BLK_ZONED_HA && incompat_zoned)) { > + struct btrfs_zoned_device_info *zone_info = > + device->zone_info; > + > hmzoned_devices++; I must have missed in some previous patch, 'hmzoned' should be zoned? > if (!zone_size) { > - zone_size = device->zone_info->zone_size; > - } else if (device->zone_info->zone_size != zone_size) { > + zone_size = zone_info->zone_size; > + } else if (zone_info->zone_size != zone_size) { > btrfs_err(fs_info, > "Zoned block devices must have equal zone sizes"); "zoned: devices must have equal zone sizes, have %u found %u" > ret = -EINVAL; > goto out; > } > + if (!max_zone_append_size || > + (zone_info->max_zone_append_size && > + zone_info->max_zone_append_size < max_zone_append_size)) > + max_zone_append_size = > + zone_info->max_zone_append_size; > } > nr_devices++; > }