On 2022/08/03 2:48, Pankaj Raghav wrote: > Introduce a new target type DM_EMULATED_ZONES for targets with > a different zone number of sectors than the underlying device zone > number of sectors. "zone number of sectors" is strange. "number of sectors per zone (aka zone size)" is simpler and clear. > > This target type is introduced as the existing zoned targets assume > that the target and the underlying device have the same zone > number of sectors. The new target: dm-po2zone will use this new target > type as it emulates the zone boundary that is different from the > underlying zoned device. > > Signed-off-by: Pankaj Raghav <p.raghav@xxxxxxxxxxx> With that text fixed, looks OK to me. Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> > --- > drivers/md/dm-table.c | 13 ++++++++++--- > include/linux/device-mapper.h | 9 +++++++++ > 2 files changed, 19 insertions(+), 3 deletions(-) > > diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c > index 31eb1d29d136..b37991ea3ffb 100644 > --- a/drivers/md/dm-table.c > +++ b/drivers/md/dm-table.c > @@ -1614,13 +1614,20 @@ static bool dm_table_supports_zoned_model(struct dm_table *t, > return true; > } > > -static int device_not_matches_zone_sectors(struct dm_target *ti, struct dm_dev *dev, > +/* > + * Callback function to check for device zone sector across devices. If the > + * DM_TARGET_EMULATED_ZONES target feature flag is not set, then the target > + * should have the same zone sector as the underlying devices. > + */ > +static int check_valid_device_zone_sectors(struct dm_target *ti, struct dm_dev *dev, > sector_t start, sector_t len, void *data) > { > unsigned int *zone_sectors = data; > > - if (!bdev_is_zoned(dev->bdev)) > + if (!bdev_is_zoned(dev->bdev) || > + dm_target_supports_emulated_zones(ti->type)) > return 0; > + > return bdev_zone_sectors(dev->bdev) != *zone_sectors; > } > > @@ -1645,7 +1652,7 @@ static int validate_hardware_zoned_model(struct dm_table *t, > if (!zone_sectors) > return -EINVAL; > > - if (dm_table_any_dev_attr(t, device_not_matches_zone_sectors, &zone_sectors)) { > + if (dm_table_any_dev_attr(t, check_valid_device_zone_sectors, &zone_sectors)) { > DMERR("%s: zone sectors is not consistent across all zoned devices", > dm_device_name(t->md)); > return -EINVAL; > diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h > index 04c6acf7faaa..83e20de264c9 100644 > --- a/include/linux/device-mapper.h > +++ b/include/linux/device-mapper.h > @@ -294,6 +294,15 @@ struct target_type { > #define dm_target_supports_mixed_zoned_model(type) (false) > #endif > > +#ifdef CONFIG_BLK_DEV_ZONED > +#define DM_TARGET_EMULATED_ZONES 0x00000400 > +#define dm_target_supports_emulated_zones(type) \ > + ((type)->features & DM_TARGET_EMULATED_ZONES) > +#else > +#define DM_TARGET_EMULATED_ZONES 0x00000000 > +#define dm_target_supports_emulated_zones(type) (false) > +#endif > + > struct dm_target { > struct dm_table *table; > struct target_type *type; -- Damien Le Moal Western Digital Research