[dm-devel] [PATCH v4 07/11] dm: Introduce dm_report_zones()

Himanshu Madhani himanshu.madhani at oracle.com
Tue May 25 19:11:53 UTC 2021



On 5/24/21 9:25 PM, Damien Le Moal wrote:
> To simplify the implementation of the report_zones operation of a zoned
> target, introduce the function dm_report_zones() to set a target
> mapping start sector in struct dm_report_zones_args and call
> blkdev_report_zones(). This new function is exported and the report
> zones callback function dm_report_zones_cb() is not.
> 
> dm-linear, dm-flakey and dm-crypt are modified to use dm_report_zones().
> 
> Signed-off-by: Damien Le Moal <damien.lemoal at wdc.com>
> Reviewed-by: Johannes Thumshirn <johannes.thumshirn at wdc.com>
> Reviewed-by: Hannes Reinecke <hare at suse.de>
> ---
>   drivers/md/dm-crypt.c         |  7 +++----
>   drivers/md/dm-flakey.c        |  7 +++----
>   drivers/md/dm-linear.c        |  7 +++----
>   drivers/md/dm-zone.c          | 23 ++++++++++++++++++++---
>   include/linux/device-mapper.h |  3 ++-
>   5 files changed, 31 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
> index b0ab080f2567..f410ceee51d7 100644
> --- a/drivers/md/dm-crypt.c
> +++ b/drivers/md/dm-crypt.c
> @@ -3138,11 +3138,10 @@ static int crypt_report_zones(struct dm_target *ti,
>   		struct dm_report_zones_args *args, unsigned int nr_zones)
>   {
>   	struct crypt_config *cc = ti->private;
> -	sector_t sector = cc->start + dm_target_offset(ti, args->next_sector);
>   
> -	args->start = cc->start;
> -	return blkdev_report_zones(cc->dev->bdev, sector, nr_zones,
> -				   dm_report_zones_cb, args);
> +	return dm_report_zones(cc->dev->bdev, cc->start,
> +			cc->start + dm_target_offset(ti, args->next_sector),
> +			args, nr_zones);
>   }
>   #else
>   #define crypt_report_zones NULL
> diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c
> index b7fee9936f05..5877220c01ed 100644
> --- a/drivers/md/dm-flakey.c
> +++ b/drivers/md/dm-flakey.c
> @@ -463,11 +463,10 @@ static int flakey_report_zones(struct dm_target *ti,
>   		struct dm_report_zones_args *args, unsigned int nr_zones)
>   {
>   	struct flakey_c *fc = ti->private;
> -	sector_t sector = flakey_map_sector(ti, args->next_sector);
>   
> -	args->start = fc->start;
> -	return blkdev_report_zones(fc->dev->bdev, sector, nr_zones,
> -				   dm_report_zones_cb, args);
> +	return dm_report_zones(fc->dev->bdev, fc->start,
> +			       flakey_map_sector(ti, args->next_sector),
> +			       args, nr_zones);
>   }
>   #else
>   #define flakey_report_zones NULL
> diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c
> index 92db0f5e7f28..c91f1e2e2f65 100644
> --- a/drivers/md/dm-linear.c
> +++ b/drivers/md/dm-linear.c
> @@ -140,11 +140,10 @@ static int linear_report_zones(struct dm_target *ti,
>   		struct dm_report_zones_args *args, unsigned int nr_zones)
>   {
>   	struct linear_c *lc = ti->private;
> -	sector_t sector = linear_map_sector(ti, args->next_sector);
>   
> -	args->start = lc->start;
> -	return blkdev_report_zones(lc->dev->bdev, sector, nr_zones,
> -				   dm_report_zones_cb, args);
> +	return dm_report_zones(lc->dev->bdev, lc->start,
> +			       linear_map_sector(ti, args->next_sector),
> +			       args, nr_zones);
>   }
>   #else
>   #define linear_report_zones NULL
> diff --git a/drivers/md/dm-zone.c b/drivers/md/dm-zone.c
> index 3243c42b7951..b42474043249 100644
> --- a/drivers/md/dm-zone.c
> +++ b/drivers/md/dm-zone.c
> @@ -56,7 +56,8 @@ int dm_blk_report_zones(struct gendisk *disk, sector_t sector,
>   	return ret;
>   }
>   
> -int dm_report_zones_cb(struct blk_zone *zone, unsigned int idx, void *data)
> +static int dm_report_zones_cb(struct blk_zone *zone, unsigned int idx,
> +			      void *data)
>   {
>   	struct dm_report_zones_args *args = data;
>   	sector_t sector_diff = args->tgt->begin - args->start;
> @@ -84,7 +85,24 @@ int dm_report_zones_cb(struct blk_zone *zone, unsigned int idx, void *data)
>   	args->next_sector = zone->start + zone->len;
>   	return args->orig_cb(zone, args->zone_idx++, args->orig_data);
>   }
> -EXPORT_SYMBOL_GPL(dm_report_zones_cb);
> +
> +/*
> + * Helper for drivers of zoned targets to implement struct target_type
> + * report_zones operation.
> + */
> +int dm_report_zones(struct block_device *bdev, sector_t start, sector_t sector,
> +		    struct dm_report_zones_args *args, unsigned int nr_zones)
> +{
> +	/*
> +	 * Set the target mapping start sector first so that
> +	 * dm_report_zones_cb() can correctly remap zone information.
> +	 */
> +	args->start = start;
> +
> +	return blkdev_report_zones(bdev, sector, nr_zones,
> +				   dm_report_zones_cb, args);
> +}
> +EXPORT_SYMBOL_GPL(dm_report_zones);
>   
>   void dm_set_zones_restrictions(struct dm_table *t, struct request_queue *q)
>   {
> @@ -99,4 +117,3 @@ void dm_set_zones_restrictions(struct dm_table *t, struct request_queue *q)
>   	WARN_ON_ONCE(queue_is_mq(q));
>   	q->nr_zones = blkdev_nr_zones(t->md->disk);
>   }
> -
> diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
> index ff700fb6ce1d..caea0a079d2d 100644
> --- a/include/linux/device-mapper.h
> +++ b/include/linux/device-mapper.h
> @@ -478,7 +478,8 @@ struct dm_report_zones_args {
>   	/* must be filled by ->report_zones before calling dm_report_zones_cb */
>   	sector_t start;
>   };
> -int dm_report_zones_cb(struct blk_zone *zone, unsigned int idx, void *data);
> +int dm_report_zones(struct block_device *bdev, sector_t start, sector_t sector,
> +		    struct dm_report_zones_args *args, unsigned int nr_zones);
>   #endif /* CONFIG_BLK_DEV_ZONED */
>   
>   /*
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani at oracle.com>

-- 
Himanshu Madhani                                Oracle Linux Engineering




More information about the dm-devel mailing list