On 2020/04/07 2:29, Hannes Reinecke wrote:
> Move fields from the device structure into the metadata structure
> and provide accessor functions.
> 
> Signed-off-by: Hannes Reinecke <[email protected]>

Looks OK.

Reviewed-by: Damien Le Moal <[email protected]>

> ---
>  drivers/md/dm-zoned-metadata.c | 88 +++++++++++++++++++++++-----------
>  drivers/md/dm-zoned-reclaim.c  |  8 ++--
>  drivers/md/dm-zoned-target.c   | 52 ++++++++++----------
>  drivers/md/dm-zoned.h          | 14 +++---
>  4 files changed, 97 insertions(+), 65 deletions(-)
> 
> diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c
> index 731aa4c99373..ae261bf6452c 100644
> --- a/drivers/md/dm-zoned-metadata.c
> +++ b/drivers/md/dm-zoned-metadata.c
> @@ -138,9 +138,16 @@ struct dmz_metadata {
>       unsigned int            zone_nr_bitmap_blocks;
>       unsigned int            zone_bits_per_mblk;
>  
> +     sector_t                zone_nr_blocks;
> +     sector_t                zone_nr_blocks_shift;
> +
> +     sector_t                zone_nr_sectors;
> +     sector_t                zone_nr_sectors_shift;
> +
>       unsigned int            nr_bitmap_blocks;
>       unsigned int            nr_map_blocks;
>  
> +     unsigned int            nr_zones;
>       unsigned int            nr_useable_zones;
>       unsigned int            nr_meta_blocks;
>       unsigned int            nr_meta_zones;
> @@ -195,12 +202,12 @@ unsigned int dmz_id(struct dmz_metadata *zmd, struct 
> dm_zone *zone)
>  
>  sector_t dmz_start_sect(struct dmz_metadata *zmd, struct dm_zone *zone)
>  {
> -     return (sector_t)dmz_id(zmd, zone) << zmd->dev->zone_nr_sectors_shift;
> +     return (sector_t)dmz_id(zmd, zone) << zmd->zone_nr_sectors_shift;
>  }
>  
>  sector_t dmz_start_block(struct dmz_metadata *zmd, struct dm_zone *zone)
>  {
> -     return (sector_t)dmz_id(zmd, zone) << zmd->dev->zone_nr_blocks_shift;
> +     return (sector_t)dmz_id(zmd, zone) << zmd->zone_nr_blocks_shift;
>  }
>  
>  struct dmz_dev *dmz_zone_to_dev(struct dmz_metadata *zmd, struct dm_zone 
> *zone)
> @@ -208,9 +215,29 @@ struct dmz_dev *dmz_zone_to_dev(struct dmz_metadata 
> *zmd, struct dm_zone *zone)
>       return &zmd->dev[0];
>  }
>  
> +unsigned int dmz_zone_nr_blocks(struct dmz_metadata *zmd)
> +{
> +     return zmd->zone_nr_blocks;
> +}
> +
> +unsigned int dmz_zone_nr_blocks_shift(struct dmz_metadata *zmd)
> +{
> +     return zmd->zone_nr_blocks_shift;
> +}
> +
> +unsigned int dmz_zone_nr_sectors(struct dmz_metadata *zmd)
> +{
> +     return zmd->zone_nr_sectors;
> +}
> +
> +unsigned int dmz_zone_nr_sectors_shift(struct dmz_metadata *zmd)
> +{
> +     return zmd->zone_nr_sectors_shift;
> +}
> +
>  unsigned int dmz_nr_zones(struct dmz_metadata *zmd)
>  {
> -     return zmd->dev->nr_zones;
> +     return zmd->nr_zones;
>  }
>  
>  unsigned int dmz_nr_chunks(struct dmz_metadata *zmd)
> @@ -887,8 +914,8 @@ static int dmz_check_sb(struct dmz_metadata *zmd, 
> unsigned int set)
>               return -ENXIO;
>       }
>  
> -     nr_meta_zones = (le32_to_cpu(sb->nr_meta_blocks) + dev->zone_nr_blocks 
> - 1)
> -             >> dev->zone_nr_blocks_shift;
> +     nr_meta_zones = (le32_to_cpu(sb->nr_meta_blocks) + zmd->zone_nr_blocks 
> - 1)
> +             >> zmd->zone_nr_blocks_shift;
>       if (!nr_meta_zones ||
>           nr_meta_zones >= zmd->nr_rnd_zones) {
>               dmz_dev_err(dev, "Invalid number of metadata blocks");
> @@ -937,7 +964,7 @@ static int dmz_read_sb(struct dmz_metadata *zmd, unsigned 
> int set)
>   */
>  static int dmz_lookup_secondary_sb(struct dmz_metadata *zmd)
>  {
> -     unsigned int zone_nr_blocks = zmd->dev->zone_nr_blocks;
> +     unsigned int zone_nr_blocks = zmd->zone_nr_blocks;
>       struct dmz_mblock *mblk;
>       int i;
>  
> @@ -1148,7 +1175,7 @@ static int dmz_init_zone(struct blk_zone *blkz, 
> unsigned int idx, void *data)
>       struct dmz_dev *dev = zmd->dev;
>  
>       /* Ignore the eventual last runt (smaller) zone */
> -     if (blkz->len != dev->zone_nr_sectors) {
> +     if (blkz->len != zmd->zone_nr_sectors) {
>               if (blkz->start + blkz->len == dev->capacity)
>                       return 0;
>               return -ENXIO;
> @@ -1213,19 +1240,24 @@ static int dmz_init_zones(struct dmz_metadata *zmd)
>       int ret;
>  
>       /* Init */
> -     zmd->zone_bitmap_size = dev->zone_nr_blocks >> 3;
> +     zmd->zone_nr_sectors = dev->zone_nr_sectors;
> +     zmd->zone_nr_sectors_shift = ilog2(zmd->zone_nr_sectors);
> +     zmd->zone_nr_blocks = dmz_sect2blk(zmd->zone_nr_sectors);
> +     zmd->zone_nr_blocks_shift = ilog2(zmd->zone_nr_blocks);
> +     zmd->zone_bitmap_size = zmd->zone_nr_blocks >> 3;
>       zmd->zone_nr_bitmap_blocks =
>               max_t(sector_t, 1, zmd->zone_bitmap_size >> DMZ_BLOCK_SHIFT);
> -     zmd->zone_bits_per_mblk = min_t(sector_t, dev->zone_nr_blocks,
> +     zmd->zone_bits_per_mblk = min_t(sector_t, zmd->zone_nr_blocks,
>                                       DMZ_BLOCK_SIZE_BITS);
>  
>       /* Allocate zone array */
> -     zmd->zones = kcalloc(dev->nr_zones, sizeof(struct dm_zone), GFP_KERNEL);
> +     zmd->nr_zones = dev->nr_zones;
> +     zmd->zones = kcalloc(zmd->nr_zones, sizeof(struct dm_zone), GFP_KERNEL);
>       if (!zmd->zones)
>               return -ENOMEM;
>  
>       dmz_dev_info(dev, "Using %zu B for zone information",
> -                  sizeof(struct dm_zone) * dev->nr_zones);
> +                  sizeof(struct dm_zone) * zmd->nr_zones);
>  
>       /*
>        * Get zone information and initialize zone descriptors.  At the same
> @@ -1344,7 +1376,7 @@ static int dmz_reset_zone(struct dmz_metadata *zmd, 
> struct dm_zone *zone)
>  
>               ret = blkdev_zone_mgmt(dev->bdev, REQ_OP_ZONE_RESET,
>                                      dmz_start_sect(zmd, zone),
> -                                    dev->zone_nr_sectors, GFP_NOIO);
> +                                    zmd->zone_nr_sectors, GFP_NOIO);
>               if (ret) {
>                       dmz_dev_err(dev, "Reset zone %u failed %d",
>                                   dmz_id(zmd, zone), ret);
> @@ -1398,7 +1430,7 @@ static int dmz_load_mapping(struct dmz_metadata *zmd)
>               if (dzone_id == DMZ_MAP_UNMAPPED)
>                       goto next;
>  
> -             if (dzone_id >= dev->nr_zones) {
> +             if (dzone_id >= zmd->nr_zones) {
>                       dmz_dev_err(dev, "Chunk %u mapping: invalid data zone 
> ID %u",
>                                   chunk, dzone_id);
>                       return -EIO;
> @@ -1419,7 +1451,7 @@ static int dmz_load_mapping(struct dmz_metadata *zmd)
>               if (bzone_id == DMZ_MAP_UNMAPPED)
>                       goto next;
>  
> -             if (bzone_id >= dev->nr_zones) {
> +             if (bzone_id >= zmd->nr_zones) {
>                       dmz_dev_err(dev, "Chunk %u mapping: invalid buffer zone 
> ID %u",
>                                   chunk, bzone_id);
>                       return -EIO;
> @@ -1451,7 +1483,7 @@ static int dmz_load_mapping(struct dmz_metadata *zmd)
>        * fully initialized. All remaining zones are unmapped data
>        * zones. Finish initializing those here.
>        */
> -     for (i = 0; i < dev->nr_zones; i++) {
> +     for (i = 0; i < zmd->nr_zones; i++) {
>               dzone = dmz_get(zmd, i);
>               if (dmz_is_meta(dzone))
>                       continue;
> @@ -1996,7 +2028,7 @@ int dmz_copy_valid_blocks(struct dmz_metadata *zmd, 
> struct dm_zone *from_zone,
>       sector_t chunk_block = 0;
>  
>       /* Get the zones bitmap blocks */
> -     while (chunk_block < zmd->dev->zone_nr_blocks) {
> +     while (chunk_block < zmd->zone_nr_blocks) {
>               from_mblk = dmz_get_bitmap(zmd, from_zone, chunk_block);
>               if (IS_ERR(from_mblk))
>                       return PTR_ERR(from_mblk);
> @@ -2031,7 +2063,7 @@ int dmz_merge_valid_blocks(struct dmz_metadata *zmd, 
> struct dm_zone *from_zone,
>       int ret;
>  
>       /* Get the zones bitmap blocks */
> -     while (chunk_block < zmd->dev->zone_nr_blocks) {
> +     while (chunk_block < zmd->zone_nr_blocks) {
>               /* Get a valid region from the source zone */
>               ret = dmz_first_valid_block(zmd, from_zone, &chunk_block);
>               if (ret <= 0)
> @@ -2055,7 +2087,7 @@ int dmz_validate_blocks(struct dmz_metadata *zmd, 
> struct dm_zone *zone,
>                       sector_t chunk_block, unsigned int nr_blocks)
>  {
>       unsigned int count, bit, nr_bits;
> -     unsigned int zone_nr_blocks = zmd->dev->zone_nr_blocks;
> +     unsigned int zone_nr_blocks = zmd->zone_nr_blocks;
>       struct dmz_mblock *mblk;
>       unsigned int n = 0;
>  
> @@ -2142,7 +2174,7 @@ int dmz_invalidate_blocks(struct dmz_metadata *zmd, 
> struct dm_zone *zone,
>       dmz_dev_debug(zmd->dev, "=> INVALIDATE zone %u, block %llu, %u blocks",
>                     dmz_id(zmd, zone), (u64)chunk_block, nr_blocks);
>  
> -     WARN_ON(chunk_block + nr_blocks > zmd->dev->zone_nr_blocks);
> +     WARN_ON(chunk_block + nr_blocks > zmd->zone_nr_blocks);
>  
>       while (nr_blocks) {
>               /* Get bitmap block */
> @@ -2186,7 +2218,7 @@ static int dmz_test_block(struct dmz_metadata *zmd, 
> struct dm_zone *zone,
>       struct dmz_mblock *mblk;
>       int ret;
>  
> -     WARN_ON(chunk_block >= zmd->dev->zone_nr_blocks);
> +     WARN_ON(chunk_block >= zmd->zone_nr_blocks);
>  
>       /* Get bitmap block */
>       mblk = dmz_get_bitmap(zmd, zone, chunk_block);
> @@ -2216,7 +2248,7 @@ static int dmz_to_next_set_block(struct dmz_metadata 
> *zmd, struct dm_zone *zone,
>       unsigned long *bitmap;
>       int n = 0;
>  
> -     WARN_ON(chunk_block + nr_blocks > zmd->dev->zone_nr_blocks);
> +     WARN_ON(chunk_block + nr_blocks > zmd->zone_nr_blocks);
>  
>       while (nr_blocks) {
>               /* Get bitmap block */
> @@ -2260,7 +2292,7 @@ int dmz_block_valid(struct dmz_metadata *zmd, struct 
> dm_zone *zone,
>  
>       /* The block is valid: get the number of valid blocks from block */
>       return dmz_to_next_set_block(zmd, zone, chunk_block,
> -                                  zmd->dev->zone_nr_blocks - chunk_block, 0);
> +                                  zmd->zone_nr_blocks - chunk_block, 0);
>  }
>  
>  /*
> @@ -2276,7 +2308,7 @@ int dmz_first_valid_block(struct dmz_metadata *zmd, 
> struct dm_zone *zone,
>       int ret;
>  
>       ret = dmz_to_next_set_block(zmd, zone, start_block,
> -                                 zmd->dev->zone_nr_blocks - start_block, 1);
> +                                 zmd->zone_nr_blocks - start_block, 1);
>       if (ret < 0)
>               return ret;
>  
> @@ -2284,7 +2316,7 @@ int dmz_first_valid_block(struct dmz_metadata *zmd, 
> struct dm_zone *zone,
>       *chunk_block = start_block;
>  
>       return dmz_to_next_set_block(zmd, zone, start_block,
> -                                  zmd->dev->zone_nr_blocks - start_block, 0);
> +                                  zmd->zone_nr_blocks - start_block, 0);
>  }
>  
>  /*
> @@ -2323,7 +2355,7 @@ static void dmz_get_zone_weight(struct dmz_metadata 
> *zmd, struct dm_zone *zone)
>       struct dmz_mblock *mblk;
>       sector_t chunk_block = 0;
>       unsigned int bit, nr_bits;
> -     unsigned int nr_blocks = zmd->dev->zone_nr_blocks;
> +     unsigned int nr_blocks = zmd->zone_nr_blocks;
>       void *bitmap;
>       int n = 0;
>  
> @@ -2495,7 +2527,7 @@ int dmz_ctr_metadata(struct dmz_dev *dev, struct 
> dmz_metadata **metadata)
>       dmz_dev_info(dev, "  %llu 512-byte logical sectors",
>                    (u64)dev->capacity);
>       dmz_dev_info(dev, "  %u zones of %llu 512-byte logical sectors",
> -                  dev->nr_zones, (u64)dev->zone_nr_sectors);
> +                  zmd->nr_zones, (u64)zmd->zone_nr_sectors);
>       dmz_dev_info(dev, "  %u metadata zones",
>                    zmd->nr_meta_zones * 2);
>       dmz_dev_info(dev, "  %u data zones for %u chunks",
> @@ -2548,7 +2580,7 @@ int dmz_resume_metadata(struct dmz_metadata *zmd)
>       int ret;
>  
>       /* Check zones */
> -     for (i = 0; i < dev->nr_zones; i++) {
> +     for (i = 0; i < zmd->nr_zones; i++) {
>               zone = dmz_get(zmd, i);
>               if (!zone) {
>                       dmz_dev_err(dev, "Unable to get zone %u", i);
> @@ -2576,7 +2608,7 @@ int dmz_resume_metadata(struct dmz_metadata *zmd)
>                                   i, (u64)zone->wp_block, (u64)wp_block);
>                       zone->wp_block = wp_block;
>                       dmz_invalidate_blocks(zmd, zone, zone->wp_block,
> -                                           dev->zone_nr_blocks - 
> zone->wp_block);
> +                                           zmd->zone_nr_blocks - 
> zone->wp_block);
>               }
>       }
>  
> diff --git a/drivers/md/dm-zoned-reclaim.c b/drivers/md/dm-zoned-reclaim.c
> index e7ace908a9b7..95d2c8870480 100644
> --- a/drivers/md/dm-zoned-reclaim.c
> +++ b/drivers/md/dm-zoned-reclaim.c
> @@ -128,7 +128,7 @@ static int dmz_reclaim_copy(struct dmz_reclaim *zrc,
>       if (dmz_is_seq(src_zone))
>               end_block = src_zone->wp_block;
>       else
> -             end_block = dev->zone_nr_blocks;
> +             end_block = dmz_zone_nr_blocks(zmd);
>       src_zone_block = dmz_start_block(zmd, src_zone);
>       dst_zone_block = dmz_start_block(zmd, dst_zone);
>  
> @@ -210,7 +210,7 @@ static int dmz_reclaim_buf(struct dmz_reclaim *zrc, 
> struct dm_zone *dzone)
>       ret = dmz_merge_valid_blocks(zmd, bzone, dzone, chunk_block);
>       if (ret == 0) {
>               /* Free the buffer zone */
> -             dmz_invalidate_blocks(zmd, bzone, 0, zrc->dev->zone_nr_blocks);
> +             dmz_invalidate_blocks(zmd, bzone, 0, dmz_zone_nr_blocks(zmd));
>               dmz_lock_map(zmd);
>               dmz_unmap_zone(zmd, bzone);
>               dmz_unlock_zone_reclaim(dzone);
> @@ -252,7 +252,7 @@ static int dmz_reclaim_seq_data(struct dmz_reclaim *zrc, 
> struct dm_zone *dzone)
>                * Free the data zone and remap the chunk to
>                * the buffer zone.
>                */
> -             dmz_invalidate_blocks(zmd, dzone, 0, zrc->dev->zone_nr_blocks);
> +             dmz_invalidate_blocks(zmd, dzone, 0, dmz_zone_nr_blocks(zmd));
>               dmz_lock_map(zmd);
>               dmz_unmap_zone(zmd, bzone);
>               dmz_unmap_zone(zmd, dzone);
> @@ -306,7 +306,7 @@ static int dmz_reclaim_rnd_data(struct dmz_reclaim *zrc, 
> struct dm_zone *dzone)
>               dmz_unlock_map(zmd);
>       } else {
>               /* Free the data zone and remap the chunk */
> -             dmz_invalidate_blocks(zmd, dzone, 0, zrc->dev->zone_nr_blocks);
> +             dmz_invalidate_blocks(zmd, dzone, 0, dmz_zone_nr_blocks(zmd));
>               dmz_lock_map(zmd);
>               dmz_unmap_zone(zmd, dzone);
>               dmz_unlock_zone_reclaim(dzone);
> diff --git a/drivers/md/dm-zoned-target.c b/drivers/md/dm-zoned-target.c
> index 44e30a7de8b9..f4e3be7f9474 100644
> --- a/drivers/md/dm-zoned-target.c
> +++ b/drivers/md/dm-zoned-target.c
> @@ -165,7 +165,8 @@ static void dmz_handle_read_zero(struct dmz_target *dmz, 
> struct bio *bio,
>  static int dmz_handle_read(struct dmz_target *dmz, struct dm_zone *zone,
>                          struct bio *bio)
>  {
> -     sector_t chunk_block = dmz_chunk_block(dmz->dev, dmz_bio_block(bio));
> +     struct dmz_metadata *zmd = dmz->metadata;
> +     sector_t chunk_block = dmz_chunk_block(zmd, dmz_bio_block(bio));
>       unsigned int nr_blocks = dmz_bio_blocks(bio);
>       sector_t end_block = chunk_block + nr_blocks;
>       struct dm_zone *rzone, *bzone;
> @@ -178,9 +179,9 @@ static int dmz_handle_read(struct dmz_target *dmz, struct 
> dm_zone *zone,
>       }
>  
>       dmz_dev_debug(dmz->dev, "READ chunk %llu -> %s zone %u, block %llu, %u 
> blocks",
> -                   (unsigned long long)dmz_bio_chunk(dmz->dev, bio),
> +                   (unsigned long long)dmz_bio_chunk(zmd, bio),
>                     (dmz_is_rnd(zone) ? "RND" : "SEQ"),
> -                   dmz_id(dmz->metadata, zone),
> +                   dmz_id(zmd, zone),
>                     (unsigned long long)chunk_block, nr_blocks);
>  
>       /* Check block validity to determine the read location */
> @@ -189,7 +190,7 @@ static int dmz_handle_read(struct dmz_target *dmz, struct 
> dm_zone *zone,
>               nr_blocks = 0;
>               if (dmz_is_rnd(zone) || chunk_block < zone->wp_block) {
>                       /* Test block validity in the data zone */
> -                     ret = dmz_block_valid(dmz->metadata, zone, chunk_block);
> +                     ret = dmz_block_valid(zmd, zone, chunk_block);
>                       if (ret < 0)
>                               return ret;
>                       if (ret > 0) {
> @@ -204,7 +205,7 @@ static int dmz_handle_read(struct dmz_target *dmz, struct 
> dm_zone *zone,
>                * Check the buffer zone, if there is one.
>                */
>               if (!nr_blocks && bzone) {
> -                     ret = dmz_block_valid(dmz->metadata, bzone, 
> chunk_block);
> +                     ret = dmz_block_valid(zmd, bzone, chunk_block);
>                       if (ret < 0)
>                               return ret;
>                       if (ret > 0) {
> @@ -308,16 +309,17 @@ static int dmz_handle_buffered_write(struct dmz_target 
> *dmz,
>  static int dmz_handle_write(struct dmz_target *dmz, struct dm_zone *zone,
>                           struct bio *bio)
>  {
> -     sector_t chunk_block = dmz_chunk_block(dmz->dev, dmz_bio_block(bio));
> +     struct dmz_metadata *zmd = dmz->metadata;
> +     sector_t chunk_block = dmz_chunk_block(zmd, dmz_bio_block(bio));
>       unsigned int nr_blocks = dmz_bio_blocks(bio);
>  
>       if (!zone)
>               return -ENOSPC;
>  
>       dmz_dev_debug(dmz->dev, "WRITE chunk %llu -> %s zone %u, block %llu, %u 
> blocks",
> -                   (unsigned long long)dmz_bio_chunk(dmz->dev, bio),
> +                   (unsigned long long)dmz_bio_chunk(zmd, bio),
>                     (dmz_is_rnd(zone) ? "RND" : "SEQ"),
> -                   dmz_id(dmz->metadata, zone),
> +                   dmz_id(zmd, zone),
>                     (unsigned long long)chunk_block, nr_blocks);
>  
>       if (dmz_is_rnd(zone) || chunk_block == zone->wp_block) {
> @@ -345,7 +347,7 @@ static int dmz_handle_discard(struct dmz_target *dmz, 
> struct dm_zone *zone,
>       struct dmz_metadata *zmd = dmz->metadata;
>       sector_t block = dmz_bio_block(bio);
>       unsigned int nr_blocks = dmz_bio_blocks(bio);
> -     sector_t chunk_block = dmz_chunk_block(dmz->dev, block);
> +     sector_t chunk_block = dmz_chunk_block(zmd, block);
>       int ret = 0;
>  
>       /* For unmapped chunks, there is nothing to do */
> @@ -356,7 +358,7 @@ static int dmz_handle_discard(struct dmz_target *dmz, 
> struct dm_zone *zone,
>               return -EROFS;
>  
>       dmz_dev_debug(dmz->dev, "DISCARD chunk %llu -> zone %u, block %llu, %u 
> blocks",
> -                   (unsigned long long)dmz_bio_chunk(dmz->dev, bio),
> +                   (unsigned long long)dmz_bio_chunk(zmd, bio),
>                     dmz_id(zmd, zone),
>                     (unsigned long long)chunk_block, nr_blocks);
>  
> @@ -402,7 +404,7 @@ static void dmz_handle_bio(struct dmz_target *dmz, struct 
> dm_chunk_work *cw,
>        * mapping for read and discard. If a mapping is obtained,
>        + the zone returned will be set to active state.
>        */
> -     zone = dmz_get_chunk_mapping(zmd, dmz_bio_chunk(dmz->dev, bio),
> +     zone = dmz_get_chunk_mapping(zmd, dmz_bio_chunk(zmd, bio),
>                                    bio_op(bio));
>       if (IS_ERR(zone)) {
>               ret = PTR_ERR(zone);
> @@ -525,7 +527,7 @@ static void dmz_flush_work(struct work_struct *work)
>   */
>  static int dmz_queue_chunk_work(struct dmz_target *dmz, struct bio *bio)
>  {
> -     unsigned int chunk = dmz_bio_chunk(dmz->dev, bio);
> +     unsigned int chunk = dmz_bio_chunk(dmz->metadata, bio);
>       struct dm_chunk_work *cw;
>       int ret = 0;
>  
> @@ -618,6 +620,7 @@ bool dmz_check_bdev(struct dmz_dev *dmz_dev)
>  static int dmz_map(struct dm_target *ti, struct bio *bio)
>  {
>       struct dmz_target *dmz = ti->private;
> +     struct dmz_metadata *zmd = dmz->metadata;
>       struct dmz_dev *dev = dmz->dev;
>       struct dmz_bioctx *bioctx = dm_per_bio_data(bio, sizeof(struct 
> dmz_bioctx));
>       sector_t sector = bio->bi_iter.bi_sector;
> @@ -630,8 +633,8 @@ static int dmz_map(struct dm_target *ti, struct bio *bio)
>  
>       dmz_dev_debug(dev, "BIO op %d sector %llu + %u => chunk %llu, block 
> %llu, %u blocks",
>                     bio_op(bio), (unsigned long long)sector, nr_sectors,
> -                   (unsigned long long)dmz_bio_chunk(dmz->dev, bio),
> -                   (unsigned long long)dmz_chunk_block(dmz->dev, 
> dmz_bio_block(bio)),
> +                   (unsigned long long)dmz_bio_chunk(zmd, bio),
> +                   (unsigned long long)dmz_chunk_block(zmd, 
> dmz_bio_block(bio)),
>                     (unsigned int)dmz_bio_blocks(bio));
>  
>       bio_set_dev(bio, dev->bdev);
> @@ -659,16 +662,16 @@ static int dmz_map(struct dm_target *ti, struct bio 
> *bio)
>       }
>  
>       /* Split zone BIOs to fit entirely into a zone */
> -     chunk_sector = sector & (dev->zone_nr_sectors - 1);
> -     if (chunk_sector + nr_sectors > dev->zone_nr_sectors)
> -             dm_accept_partial_bio(bio, dev->zone_nr_sectors - chunk_sector);
> +     chunk_sector = sector & (dmz_zone_nr_sectors(zmd) - 1);
> +     if (chunk_sector + nr_sectors > dmz_zone_nr_sectors(zmd))
> +             dm_accept_partial_bio(bio, dmz_zone_nr_sectors(zmd) - 
> chunk_sector);
>  
>       /* Now ready to handle this BIO */
>       ret = dmz_queue_chunk_work(dmz, bio);
>       if (ret) {
>               dmz_dev_debug(dmz->dev,
>                             "BIO op %d, can't process chunk %llu, err %i\n",
> -                           bio_op(bio), (u64)dmz_bio_chunk(dmz->dev, bio),
> +                           bio_op(bio), (u64)dmz_bio_chunk(zmd, bio),
>                             ret);
>               return DM_MAPIO_REQUEUE;
>       }
> @@ -722,10 +725,6 @@ static int dmz_get_zoned_device(struct dm_target *ti, 
> char *path)
>       }
>  
>       dev->zone_nr_sectors = blk_queue_zone_sectors(q);
> -     dev->zone_nr_sectors_shift = ilog2(dev->zone_nr_sectors);
> -
> -     dev->zone_nr_blocks = dmz_sect2blk(dev->zone_nr_sectors);
> -     dev->zone_nr_blocks_shift = ilog2(dev->zone_nr_blocks);
>  
>       dev->nr_zones = blkdev_nr_zones(dev->bdev->bd_disk);
>  
> @@ -790,7 +789,7 @@ static int dmz_ctr(struct dm_target *ti, unsigned int 
> argc, char **argv)
>       }
>  
>       /* Set target (no write same support) */
> -     ti->max_io_len = dev->zone_nr_sectors << 9;
> +     ti->max_io_len = dmz_zone_nr_sectors(dmz->metadata) << 9;
>       ti->num_flush_bios = 1;
>       ti->num_discard_bios = 1;
>       ti->num_write_zeroes_bios = 1;
> @@ -799,7 +798,8 @@ static int dmz_ctr(struct dm_target *ti, unsigned int 
> argc, char **argv)
>       ti->discards_supported = true;
>  
>       /* The exposed capacity is the number of chunks that can be mapped */
> -     ti->len = (sector_t)dmz_nr_chunks(dmz->metadata) << 
> dev->zone_nr_sectors_shift;
> +     ti->len = (sector_t)dmz_nr_chunks(dmz->metadata) <<
> +             dmz_zone_nr_sectors_shift(dmz->metadata);
>  
>       /* Zone BIO */
>       ret = bioset_init(&dmz->bio_set, DMZ_MIN_BIOS, 0, 0);
> @@ -895,7 +895,7 @@ static void dmz_dtr(struct dm_target *ti)
>  static void dmz_io_hints(struct dm_target *ti, struct queue_limits *limits)
>  {
>       struct dmz_target *dmz = ti->private;
> -     unsigned int chunk_sectors = dmz->dev->zone_nr_sectors;
> +     unsigned int chunk_sectors = dmz_zone_nr_sectors(dmz->metadata);
>  
>       limits->logical_block_size = DMZ_BLOCK_SIZE;
>       limits->physical_block_size = DMZ_BLOCK_SIZE;
> @@ -960,7 +960,7 @@ static int dmz_iterate_devices(struct dm_target *ti,
>  {
>       struct dmz_target *dmz = ti->private;
>       struct dmz_dev *dev = dmz->dev;
> -     sector_t capacity = dev->capacity & ~(dev->zone_nr_sectors - 1);
> +     sector_t capacity = dev->capacity & 
> ~(dmz_zone_nr_sectors(dmz->metadata) - 1);
>  
>       return fn(ti, dmz->ddev, 0, capacity, data);
>  }
> diff --git a/drivers/md/dm-zoned.h b/drivers/md/dm-zoned.h
> index 39d59898abbe..c1b7b9a729c2 100644
> --- a/drivers/md/dm-zoned.h
> +++ b/drivers/md/dm-zoned.h
> @@ -60,15 +60,11 @@ struct dmz_dev {
>       unsigned int            flags;
>  
>       sector_t                zone_nr_sectors;
> -     unsigned int            zone_nr_sectors_shift;
> -
> -     sector_t                zone_nr_blocks;
> -     sector_t                zone_nr_blocks_shift;
>  };
>  
> -#define dmz_bio_chunk(dev, bio)      ((bio)->bi_iter.bi_sector >> \
> -                              (dev)->zone_nr_sectors_shift)
> -#define dmz_chunk_block(dev, b)      ((b) & ((dev)->zone_nr_blocks - 1))
> +#define dmz_bio_chunk(zmd, bio)      ((bio)->bi_iter.bi_sector >> \
> +                              dmz_zone_nr_sectors_shift(zmd))
> +#define dmz_chunk_block(zmd, b)      ((b) & (dmz_zone_nr_blocks(zmd) - 1))
>  
>  /* Device flags. */
>  #define DMZ_BDEV_DYING               (1 << 0)
> @@ -198,6 +194,10 @@ unsigned int dmz_nr_rnd_zones(struct dmz_metadata *zmd);
>  unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd);
>  unsigned int dmz_nr_seq_zones(struct dmz_metadata *zmd);
>  unsigned int dmz_nr_unmap_seq_zones(struct dmz_metadata *zmd);
> +unsigned int dmz_zone_nr_blocks(struct dmz_metadata *zmd);
> +unsigned int dmz_zone_nr_blocks_shift(struct dmz_metadata *zmd);
> +unsigned int dmz_zone_nr_sectors(struct dmz_metadata *zmd);
> +unsigned int dmz_zone_nr_sectors_shift(struct dmz_metadata *zmd);
>  
>  /*
>   * Activate a zone (increment its reference count).
> 


-- 
Damien Le Moal
Western Digital Research



--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to