OSDN Git Service

dm zoned: add device pointer to struct dm_zone
authorHannes Reinecke <hare@suse.de>
Tue, 2 Jun 2020 11:09:48 +0000 (13:09 +0200)
committerMike Snitzer <snitzer@redhat.com>
Fri, 5 Jun 2020 18:59:48 +0000 (14:59 -0400)
Add a pointer, to the containing device, within struct dm_zone and
kill dmz_zone_to_dev().

Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-zoned-metadata.c
drivers/md/dm-zoned-reclaim.c
drivers/md/dm-zoned-target.c
drivers/md/dm-zoned.h

index 525ac0d..68d4450 100644 (file)
@@ -229,16 +229,10 @@ struct dmz_metadata {
  */
 static unsigned int dmz_dev_zone_id(struct dmz_metadata *zmd, struct dm_zone *zone)
 {
-       unsigned int zone_id;
-
        if (WARN_ON(!zone))
                return 0;
 
-       zone_id = zone->id;
-       if (zmd->nr_devs > 1 &&
-           (zone_id >= zmd->dev[1].zone_offset))
-               zone_id -= zmd->dev[1].zone_offset;
-       return zone_id;
+       return zone->id - zone->dev->zone_offset;
 }
 
 sector_t dmz_start_sect(struct dmz_metadata *zmd, struct dm_zone *zone)
@@ -255,18 +249,6 @@ sector_t dmz_start_block(struct dmz_metadata *zmd, struct dm_zone *zone)
        return (sector_t)zone_id << zmd->zone_nr_blocks_shift;
 }
 
-struct dmz_dev *dmz_zone_to_dev(struct dmz_metadata *zmd, struct dm_zone *zone)
-{
-       if (WARN_ON(!zone))
-               return &zmd->dev[0];
-
-       if (zmd->nr_devs > 1 &&
-           zone->id >= zmd->dev[1].zone_offset)
-               return &zmd->dev[1];
-
-       return &zmd->dev[0];
-}
-
 unsigned int dmz_zone_nr_blocks(struct dmz_metadata *zmd)
 {
        return zmd->zone_nr_blocks;
@@ -333,7 +315,7 @@ static struct dm_zone *dmz_get(struct dmz_metadata *zmd, unsigned int zone_id)
 }
 
 static struct dm_zone *dmz_insert(struct dmz_metadata *zmd,
-                                 unsigned int zone_id)
+                                 unsigned int zone_id, struct dmz_dev *dev)
 {
        struct dm_zone *zone = kzalloc(sizeof(struct dm_zone), GFP_KERNEL);
 
@@ -349,6 +331,7 @@ static struct dm_zone *dmz_insert(struct dmz_metadata *zmd,
        atomic_set(&zone->refcount, 0);
        zone->id = zone_id;
        zone->chunk = DMZ_MAP_UNMAPPED;
+       zone->dev = dev;
 
        return zone;
 }
@@ -1273,7 +1256,7 @@ static int dmz_load_sb(struct dmz_metadata *zmd)
 
        /* Read and check the primary super block */
        zmd->sb[0].block = dmz_start_block(zmd, zmd->sb[0].zone);
-       zmd->sb[0].dev = dmz_zone_to_dev(zmd, zmd->sb[0].zone);
+       zmd->sb[0].dev = zmd->sb[0].zone->dev;
        ret = dmz_get_sb(zmd, &zmd->sb[0], 0);
        if (ret) {
                dmz_dev_err(zmd->sb[0].dev, "Read primary super block failed");
@@ -1393,7 +1376,7 @@ static int dmz_init_zone(struct blk_zone *blkz, unsigned int num, void *data)
        int idx = num + dev->zone_offset;
        struct dm_zone *zone;
 
-       zone = dmz_insert(zmd, idx);
+       zone = dmz_insert(zmd, idx, dev);
        if (IS_ERR(zone))
                return PTR_ERR(zone);
 
@@ -1457,7 +1440,7 @@ static int dmz_emulate_zones(struct dmz_metadata *zmd, struct dmz_dev *dev)
        for(idx = 0; idx < dev->nr_zones; idx++) {
                struct dm_zone *zone;
 
-               zone = dmz_insert(zmd, idx);
+               zone = dmz_insert(zmd, idx, dev);
                if (IS_ERR(zone))
                        return PTR_ERR(zone);
                set_bit(DMZ_CACHE, &zone->flags);
@@ -1583,7 +1566,7 @@ static int dmz_update_zone_cb(struct blk_zone *blkz, unsigned int idx,
  */
 static int dmz_update_zone(struct dmz_metadata *zmd, struct dm_zone *zone)
 {
-       struct dmz_dev *dev = dmz_zone_to_dev(zmd, zone);
+       struct dmz_dev *dev = zone->dev;
        unsigned int noio_flag;
        int ret;
 
@@ -1620,7 +1603,7 @@ static int dmz_update_zone(struct dmz_metadata *zmd, struct dm_zone *zone)
 static int dmz_handle_seq_write_err(struct dmz_metadata *zmd,
                                    struct dm_zone *zone)
 {
-       struct dmz_dev *dev = dmz_zone_to_dev(zmd, zone);
+       struct dmz_dev *dev = zone->dev;
        unsigned int wp = 0;
        int ret;
 
@@ -1657,7 +1640,7 @@ static int dmz_reset_zone(struct dmz_metadata *zmd, struct dm_zone *zone)
                return 0;
 
        if (!dmz_is_empty(zone) || dmz_seq_write_err(zone)) {
-               struct dmz_dev *dev = dmz_zone_to_dev(zmd, zone);
+               struct dmz_dev *dev = zone->dev;
 
                ret = blkdev_zone_mgmt(dev->bdev, REQ_OP_ZONE_RESET,
                                       dmz_start_sect(zmd, zone),
@@ -2218,9 +2201,7 @@ again:
                goto again;
        }
        if (dmz_is_meta(zone)) {
-               struct dmz_dev *dev = dmz_zone_to_dev(zmd, zone);
-
-               dmz_dev_warn(dev, "Zone %u has metadata", zone->id);
+               dmz_zmd_warn(zmd, "Zone %u has metadata", zone->id);
                zone = NULL;
                goto again;
        }
index fd4d47d..e9e3b73 100644 (file)
@@ -58,7 +58,7 @@ static int dmz_reclaim_align_wp(struct dmz_reclaim *zrc, struct dm_zone *zone,
                                sector_t block)
 {
        struct dmz_metadata *zmd = zrc->metadata;
-       struct dmz_dev *dev = dmz_zone_to_dev(zmd, zone);
+       struct dmz_dev *dev = zone->dev;
        sector_t wp_block = zone->wp_block;
        unsigned int nr_blocks;
        int ret;
@@ -116,7 +116,6 @@ static int dmz_reclaim_copy(struct dmz_reclaim *zrc,
                            struct dm_zone *src_zone, struct dm_zone *dst_zone)
 {
        struct dmz_metadata *zmd = zrc->metadata;
-       struct dmz_dev *src_dev, *dst_dev;
        struct dm_io_region src, dst;
        sector_t block = 0, end_block;
        sector_t nr_blocks;
@@ -130,17 +129,15 @@ static int dmz_reclaim_copy(struct dmz_reclaim *zrc,
        else
                end_block = dmz_zone_nr_blocks(zmd);
        src_zone_block = dmz_start_block(zmd, src_zone);
-       src_dev = dmz_zone_to_dev(zmd, src_zone);
        dst_zone_block = dmz_start_block(zmd, dst_zone);
-       dst_dev = dmz_zone_to_dev(zmd, dst_zone);
 
        if (dmz_is_seq(dst_zone))
                set_bit(DM_KCOPYD_WRITE_SEQ, &flags);
 
        while (block < end_block) {
-               if (src_dev->flags & DMZ_BDEV_DYING)
+               if (src_zone->dev->flags & DMZ_BDEV_DYING)
                        return -EIO;
-               if (dst_dev->flags & DMZ_BDEV_DYING)
+               if (dst_zone->dev->flags & DMZ_BDEV_DYING)
                        return -EIO;
 
                if (dmz_reclaim_should_terminate(src_zone))
@@ -163,11 +160,11 @@ static int dmz_reclaim_copy(struct dmz_reclaim *zrc,
                                return ret;
                }
 
-               src.bdev = src_dev->bdev;
+               src.bdev = src_zone->dev->bdev;
                src.sector = dmz_blk2sect(src_zone_block + block);
                src.count = dmz_blk2sect(nr_blocks);
 
-               dst.bdev = dst_dev->bdev;
+               dst.bdev = dst_zone->dev->bdev;
                dst.sector = dmz_blk2sect(dst_zone_block + block);
                dst.count = src.count;
 
index 2770e29..087dd48 100644 (file)
@@ -123,7 +123,7 @@ static int dmz_submit_bio(struct dmz_target *dmz, struct dm_zone *zone,
 {
        struct dmz_bioctx *bioctx =
                dm_per_bio_data(bio, sizeof(struct dmz_bioctx));
-       struct dmz_dev *dev = dmz_zone_to_dev(dmz->metadata, zone);
+       struct dmz_dev *dev = zone->dev;
        struct bio *clone;
 
        if (dev->flags & DMZ_BDEV_DYING)
index 3451b5a..316344b 100644 (file)
@@ -80,6 +80,9 @@ struct dm_zone {
        /* For listing the zone depending on its state */
        struct list_head        link;
 
+       /* Device containing this zone */
+       struct dmz_dev          *dev;
+
        /* Zone type and state */
        unsigned long           flags;
 
@@ -190,7 +193,6 @@ const char *dmz_metadata_label(struct dmz_metadata *zmd);
 sector_t dmz_start_sect(struct dmz_metadata *zmd, struct dm_zone *zone);
 sector_t dmz_start_block(struct dmz_metadata *zmd, struct dm_zone *zone);
 unsigned int dmz_nr_chunks(struct dmz_metadata *zmd);
-struct dmz_dev *dmz_zone_to_dev(struct dmz_metadata *zmd, struct dm_zone *zone);
 
 bool dmz_check_dev(struct dmz_metadata *zmd);
 bool dmz_dev_is_dying(struct dmz_metadata *zmd);