Commit 8f22272a authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Mike Snitzer

dm zoned: add device pointer to struct dm_zone

Add a pointer, to the containing device, within struct dm_zone and
kill dmz_zone_to_dev().
Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 5d2c74f3
...@@ -229,16 +229,10 @@ struct dmz_metadata { ...@@ -229,16 +229,10 @@ struct dmz_metadata {
*/ */
static unsigned int dmz_dev_zone_id(struct dmz_metadata *zmd, struct dm_zone *zone) static unsigned int dmz_dev_zone_id(struct dmz_metadata *zmd, struct dm_zone *zone)
{ {
unsigned int zone_id;
if (WARN_ON(!zone)) if (WARN_ON(!zone))
return 0; return 0;
zone_id = zone->id; return zone->id - zone->dev->zone_offset;
if (zmd->nr_devs > 1 &&
(zone_id >= zmd->dev[1].zone_offset))
zone_id -= zmd->dev[1].zone_offset;
return zone_id;
} }
sector_t dmz_start_sect(struct dmz_metadata *zmd, struct dm_zone *zone) 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) ...@@ -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; 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) unsigned int dmz_zone_nr_blocks(struct dmz_metadata *zmd)
{ {
return zmd->zone_nr_blocks; return zmd->zone_nr_blocks;
...@@ -333,7 +315,7 @@ static struct dm_zone *dmz_get(struct dmz_metadata *zmd, unsigned int zone_id) ...@@ -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, 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); 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, ...@@ -349,6 +331,7 @@ static struct dm_zone *dmz_insert(struct dmz_metadata *zmd,
atomic_set(&zone->refcount, 0); atomic_set(&zone->refcount, 0);
zone->id = zone_id; zone->id = zone_id;
zone->chunk = DMZ_MAP_UNMAPPED; zone->chunk = DMZ_MAP_UNMAPPED;
zone->dev = dev;
return zone; return zone;
} }
...@@ -1273,7 +1256,7 @@ static int dmz_load_sb(struct dmz_metadata *zmd) ...@@ -1273,7 +1256,7 @@ static int dmz_load_sb(struct dmz_metadata *zmd)
/* Read and check the primary super block */ /* Read and check the primary super block */
zmd->sb[0].block = dmz_start_block(zmd, zmd->sb[0].zone); 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); ret = dmz_get_sb(zmd, &zmd->sb[0], 0);
if (ret) { if (ret) {
dmz_dev_err(zmd->sb[0].dev, "Read primary super block failed"); 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) ...@@ -1393,7 +1376,7 @@ static int dmz_init_zone(struct blk_zone *blkz, unsigned int num, void *data)
int idx = num + dev->zone_offset; int idx = num + dev->zone_offset;
struct dm_zone *zone; struct dm_zone *zone;
zone = dmz_insert(zmd, idx); zone = dmz_insert(zmd, idx, dev);
if (IS_ERR(zone)) if (IS_ERR(zone))
return PTR_ERR(zone); return PTR_ERR(zone);
...@@ -1457,7 +1440,7 @@ static int dmz_emulate_zones(struct dmz_metadata *zmd, struct dmz_dev *dev) ...@@ -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++) { for(idx = 0; idx < dev->nr_zones; idx++) {
struct dm_zone *zone; struct dm_zone *zone;
zone = dmz_insert(zmd, idx); zone = dmz_insert(zmd, idx, dev);
if (IS_ERR(zone)) if (IS_ERR(zone))
return PTR_ERR(zone); return PTR_ERR(zone);
set_bit(DMZ_CACHE, &zone->flags); set_bit(DMZ_CACHE, &zone->flags);
...@@ -1583,7 +1566,7 @@ static int dmz_update_zone_cb(struct blk_zone *blkz, unsigned int idx, ...@@ -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) 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; unsigned int noio_flag;
int ret; int ret;
...@@ -1620,7 +1603,7 @@ static int dmz_update_zone(struct dmz_metadata *zmd, struct dm_zone *zone) ...@@ -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, static int dmz_handle_seq_write_err(struct dmz_metadata *zmd,
struct dm_zone *zone) struct dm_zone *zone)
{ {
struct dmz_dev *dev = dmz_zone_to_dev(zmd, zone); struct dmz_dev *dev = zone->dev;
unsigned int wp = 0; unsigned int wp = 0;
int ret; int ret;
...@@ -1657,7 +1640,7 @@ static int dmz_reset_zone(struct dmz_metadata *zmd, struct dm_zone *zone) ...@@ -1657,7 +1640,7 @@ static int dmz_reset_zone(struct dmz_metadata *zmd, struct dm_zone *zone)
return 0; return 0;
if (!dmz_is_empty(zone) || dmz_seq_write_err(zone)) { 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, ret = blkdev_zone_mgmt(dev->bdev, REQ_OP_ZONE_RESET,
dmz_start_sect(zmd, zone), dmz_start_sect(zmd, zone),
...@@ -2218,9 +2201,7 @@ struct dm_zone *dmz_alloc_zone(struct dmz_metadata *zmd, unsigned long flags) ...@@ -2218,9 +2201,7 @@ struct dm_zone *dmz_alloc_zone(struct dmz_metadata *zmd, unsigned long flags)
goto again; goto again;
} }
if (dmz_is_meta(zone)) { if (dmz_is_meta(zone)) {
struct dmz_dev *dev = dmz_zone_to_dev(zmd, zone); dmz_zmd_warn(zmd, "Zone %u has metadata", zone->id);
dmz_dev_warn(dev, "Zone %u has metadata", zone->id);
zone = NULL; zone = NULL;
goto again; goto again;
} }
......
...@@ -58,7 +58,7 @@ static int dmz_reclaim_align_wp(struct dmz_reclaim *zrc, struct dm_zone *zone, ...@@ -58,7 +58,7 @@ static int dmz_reclaim_align_wp(struct dmz_reclaim *zrc, struct dm_zone *zone,
sector_t block) sector_t block)
{ {
struct dmz_metadata *zmd = zrc->metadata; 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; sector_t wp_block = zone->wp_block;
unsigned int nr_blocks; unsigned int nr_blocks;
int ret; int ret;
...@@ -116,7 +116,6 @@ static int dmz_reclaim_copy(struct dmz_reclaim *zrc, ...@@ -116,7 +116,6 @@ static int dmz_reclaim_copy(struct dmz_reclaim *zrc,
struct dm_zone *src_zone, struct dm_zone *dst_zone) struct dm_zone *src_zone, struct dm_zone *dst_zone)
{ {
struct dmz_metadata *zmd = zrc->metadata; struct dmz_metadata *zmd = zrc->metadata;
struct dmz_dev *src_dev, *dst_dev;
struct dm_io_region src, dst; struct dm_io_region src, dst;
sector_t block = 0, end_block; sector_t block = 0, end_block;
sector_t nr_blocks; sector_t nr_blocks;
...@@ -130,17 +129,15 @@ static int dmz_reclaim_copy(struct dmz_reclaim *zrc, ...@@ -130,17 +129,15 @@ static int dmz_reclaim_copy(struct dmz_reclaim *zrc,
else else
end_block = dmz_zone_nr_blocks(zmd); end_block = dmz_zone_nr_blocks(zmd);
src_zone_block = dmz_start_block(zmd, src_zone); 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_zone_block = dmz_start_block(zmd, dst_zone);
dst_dev = dmz_zone_to_dev(zmd, dst_zone);
if (dmz_is_seq(dst_zone)) if (dmz_is_seq(dst_zone))
set_bit(DM_KCOPYD_WRITE_SEQ, &flags); set_bit(DM_KCOPYD_WRITE_SEQ, &flags);
while (block < end_block) { while (block < end_block) {
if (src_dev->flags & DMZ_BDEV_DYING) if (src_zone->dev->flags & DMZ_BDEV_DYING)
return -EIO; return -EIO;
if (dst_dev->flags & DMZ_BDEV_DYING) if (dst_zone->dev->flags & DMZ_BDEV_DYING)
return -EIO; return -EIO;
if (dmz_reclaim_should_terminate(src_zone)) if (dmz_reclaim_should_terminate(src_zone))
...@@ -163,11 +160,11 @@ static int dmz_reclaim_copy(struct dmz_reclaim *zrc, ...@@ -163,11 +160,11 @@ static int dmz_reclaim_copy(struct dmz_reclaim *zrc,
return ret; return ret;
} }
src.bdev = src_dev->bdev; src.bdev = src_zone->dev->bdev;
src.sector = dmz_blk2sect(src_zone_block + block); src.sector = dmz_blk2sect(src_zone_block + block);
src.count = dmz_blk2sect(nr_blocks); 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.sector = dmz_blk2sect(dst_zone_block + block);
dst.count = src.count; dst.count = src.count;
......
...@@ -123,7 +123,7 @@ static int dmz_submit_bio(struct dmz_target *dmz, struct dm_zone *zone, ...@@ -123,7 +123,7 @@ static int dmz_submit_bio(struct dmz_target *dmz, struct dm_zone *zone,
{ {
struct dmz_bioctx *bioctx = struct dmz_bioctx *bioctx =
dm_per_bio_data(bio, sizeof(struct dmz_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; struct bio *clone;
if (dev->flags & DMZ_BDEV_DYING) if (dev->flags & DMZ_BDEV_DYING)
......
...@@ -80,6 +80,9 @@ struct dm_zone { ...@@ -80,6 +80,9 @@ struct dm_zone {
/* For listing the zone depending on its state */ /* For listing the zone depending on its state */
struct list_head link; struct list_head link;
/* Device containing this zone */
struct dmz_dev *dev;
/* Zone type and state */ /* Zone type and state */
unsigned long flags; unsigned long flags;
...@@ -190,7 +193,6 @@ const char *dmz_metadata_label(struct dmz_metadata *zmd); ...@@ -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_sect(struct dmz_metadata *zmd, struct dm_zone *zone);
sector_t dmz_start_block(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); 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_check_dev(struct dmz_metadata *zmd);
bool dmz_dev_is_dying(struct dmz_metadata *zmd); bool dmz_dev_is_dying(struct dmz_metadata *zmd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment