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

2021-05-26 Thread Himanshu Madhani




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 
Reviewed-by: Johannes Thumshirn 
Reviewed-by: Hannes Reinecke 
---
  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 

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

2021-05-24 Thread Damien Le Moal
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 
Reviewed-by: Johannes Thumshirn 
Reviewed-by: Hannes Reinecke 
---
 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