diff mbox series

[v4,07/11] dm: Introduce dm_report_zones()

Message ID 20210525022539.119661-8-damien.lemoal@wdc.com (mailing list archive)
State Superseded, archived
Delegated to: Mike Snitzer
Headers show
Series dm: Improve zoned block device support | expand

Commit Message

Damien Le Moal May 25, 2021, 2:25 a.m. UTC
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@wdc.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Hannes Reinecke <hare@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(-)

Comments

Himanshu Madhani May 25, 2021, 7:11 p.m. UTC | #1
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@wdc.com>
> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> Reviewed-by: Hannes Reinecke <hare@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@oracle.com>
diff mbox series

Patch

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 */
 
 /*