Re: [PATCH v9 12/13] dm: introduce DM_EMULATED_ZONES target type

From: Damien Le Moal
Date: Wed Aug 10 2022 - 13:18:01 EST


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