Commit 52d67758 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Mike Snitzer

dm zoned: replace 'target' pointer in the bio context

Replace the 'target' pointer in the bio context with the
device pointer as this is what's actually used.
Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarBob Liu <bob.liu@oracle.com>
Reviewed-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 6c805f77
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
* Zone BIO context. * Zone BIO context.
*/ */
struct dmz_bioctx { struct dmz_bioctx {
struct dmz_target *target; struct dmz_dev *dev;
struct dm_zone *zone; struct dm_zone *zone;
struct bio *bio; struct bio *bio;
refcount_t ref; refcount_t ref;
...@@ -76,12 +76,13 @@ struct dmz_target { ...@@ -76,12 +76,13 @@ struct dmz_target {
*/ */
static inline void dmz_bio_endio(struct bio *bio, blk_status_t status) static inline void dmz_bio_endio(struct bio *bio, blk_status_t status)
{ {
struct dmz_bioctx *bioctx = dm_per_bio_data(bio, sizeof(struct dmz_bioctx)); struct dmz_bioctx *bioctx =
dm_per_bio_data(bio, sizeof(struct dmz_bioctx));
if (status != BLK_STS_OK && bio->bi_status == BLK_STS_OK) if (status != BLK_STS_OK && bio->bi_status == BLK_STS_OK)
bio->bi_status = status; bio->bi_status = status;
if (bio->bi_status != BLK_STS_OK) if (bio->bi_status != BLK_STS_OK)
bioctx->target->dev->flags |= DMZ_CHECK_BDEV; bioctx->dev->flags |= DMZ_CHECK_BDEV;
if (refcount_dec_and_test(&bioctx->ref)) { if (refcount_dec_and_test(&bioctx->ref)) {
struct dm_zone *zone = bioctx->zone; struct dm_zone *zone = bioctx->zone;
...@@ -118,14 +119,20 @@ static int dmz_submit_bio(struct dmz_target *dmz, struct dm_zone *zone, ...@@ -118,14 +119,20 @@ static int dmz_submit_bio(struct dmz_target *dmz, struct dm_zone *zone,
struct bio *bio, sector_t chunk_block, struct bio *bio, sector_t chunk_block,
unsigned int nr_blocks) unsigned int nr_blocks)
{ {
struct dmz_bioctx *bioctx = dm_per_bio_data(bio, sizeof(struct dmz_bioctx)); 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 bio *clone; struct bio *clone;
if (dev->flags & DMZ_BDEV_DYING)
return -EIO;
clone = bio_clone_fast(bio, GFP_NOIO, &dmz->bio_set); clone = bio_clone_fast(bio, GFP_NOIO, &dmz->bio_set);
if (!clone) if (!clone)
return -ENOMEM; return -ENOMEM;
bio_set_dev(clone, dmz->dev->bdev); bio_set_dev(clone, dev->bdev);
bioctx->dev = dev;
clone->bi_iter.bi_sector = clone->bi_iter.bi_sector =
dmz_start_sect(dmz->metadata, zone) + dmz_blk2sect(chunk_block); dmz_start_sect(dmz->metadata, zone) + dmz_blk2sect(chunk_block);
clone->bi_iter.bi_size = dmz_blk2sect(nr_blocks) << SECTOR_SHIFT; clone->bi_iter.bi_size = dmz_blk2sect(nr_blocks) << SECTOR_SHIFT;
...@@ -218,8 +225,10 @@ static int dmz_handle_read(struct dmz_target *dmz, struct dm_zone *zone, ...@@ -218,8 +225,10 @@ static int dmz_handle_read(struct dmz_target *dmz, struct dm_zone *zone,
if (nr_blocks) { if (nr_blocks) {
/* Valid blocks found: read them */ /* Valid blocks found: read them */
nr_blocks = min_t(unsigned int, nr_blocks, end_block - chunk_block); nr_blocks = min_t(unsigned int, nr_blocks,
ret = dmz_submit_bio(dmz, rzone, bio, chunk_block, nr_blocks); end_block - chunk_block);
ret = dmz_submit_bio(dmz, rzone, bio,
chunk_block, nr_blocks);
if (ret) if (ret)
return ret; return ret;
chunk_block += nr_blocks; chunk_block += nr_blocks;
...@@ -330,7 +339,8 @@ static int dmz_handle_write(struct dmz_target *dmz, struct dm_zone *zone, ...@@ -330,7 +339,8 @@ static int dmz_handle_write(struct dmz_target *dmz, struct dm_zone *zone,
* and the BIO is aligned to the zone write pointer: * and the BIO is aligned to the zone write pointer:
* direct write the zone. * direct write the zone.
*/ */
return dmz_handle_direct_write(dmz, zone, bio, chunk_block, nr_blocks); return dmz_handle_direct_write(dmz, zone, bio,
chunk_block, nr_blocks);
} }
/* /*
...@@ -383,7 +393,8 @@ static int dmz_handle_discard(struct dmz_target *dmz, struct dm_zone *zone, ...@@ -383,7 +393,8 @@ static int dmz_handle_discard(struct dmz_target *dmz, struct dm_zone *zone,
static void dmz_handle_bio(struct dmz_target *dmz, struct dm_chunk_work *cw, static void dmz_handle_bio(struct dmz_target *dmz, struct dm_chunk_work *cw,
struct bio *bio) struct bio *bio)
{ {
struct dmz_bioctx *bioctx = dm_per_bio_data(bio, sizeof(struct dmz_bioctx)); struct dmz_bioctx *bioctx =
dm_per_bio_data(bio, sizeof(struct dmz_bioctx));
struct dmz_metadata *zmd = dmz->metadata; struct dmz_metadata *zmd = dmz->metadata;
struct dm_zone *zone; struct dm_zone *zone;
int ret; int ret;
...@@ -397,11 +408,6 @@ static void dmz_handle_bio(struct dmz_target *dmz, struct dm_chunk_work *cw, ...@@ -397,11 +408,6 @@ static void dmz_handle_bio(struct dmz_target *dmz, struct dm_chunk_work *cw,
dmz_lock_metadata(zmd); dmz_lock_metadata(zmd);
if (dmz->dev->flags & DMZ_BDEV_DYING) {
ret = -EIO;
goto out;
}
/* /*
* Get the data zone mapping the chunk. There may be no * Get the data zone mapping the chunk. There may be no
* mapping for read and discard. If a mapping is obtained, * mapping for read and discard. If a mapping is obtained,
...@@ -625,7 +631,6 @@ static int dmz_map(struct dm_target *ti, struct bio *bio) ...@@ -625,7 +631,6 @@ static int dmz_map(struct dm_target *ti, struct bio *bio)
{ {
struct dmz_target *dmz = ti->private; struct dmz_target *dmz = ti->private;
struct dmz_metadata *zmd = dmz->metadata; 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)); struct dmz_bioctx *bioctx = dm_per_bio_data(bio, sizeof(struct dmz_bioctx));
sector_t sector = bio->bi_iter.bi_sector; sector_t sector = bio->bi_iter.bi_sector;
unsigned int nr_sectors = bio_sectors(bio); unsigned int nr_sectors = bio_sectors(bio);
...@@ -642,8 +647,6 @@ static int dmz_map(struct dm_target *ti, struct bio *bio) ...@@ -642,8 +647,6 @@ static int dmz_map(struct dm_target *ti, struct bio *bio)
(unsigned long long)dmz_chunk_block(zmd, dmz_bio_block(bio)), (unsigned long long)dmz_chunk_block(zmd, dmz_bio_block(bio)),
(unsigned int)dmz_bio_blocks(bio)); (unsigned int)dmz_bio_blocks(bio));
bio_set_dev(bio, dev->bdev);
if (!nr_sectors && bio_op(bio) != REQ_OP_WRITE) if (!nr_sectors && bio_op(bio) != REQ_OP_WRITE)
return DM_MAPIO_REMAPPED; return DM_MAPIO_REMAPPED;
...@@ -652,7 +655,7 @@ static int dmz_map(struct dm_target *ti, struct bio *bio) ...@@ -652,7 +655,7 @@ static int dmz_map(struct dm_target *ti, struct bio *bio)
return DM_MAPIO_KILL; return DM_MAPIO_KILL;
/* Initialize the BIO context */ /* Initialize the BIO context */
bioctx->target = dmz; bioctx->dev = NULL;
bioctx->zone = NULL; bioctx->zone = NULL;
bioctx->bio = bio; bioctx->bio = bio;
refcount_set(&bioctx->ref, 1); refcount_set(&bioctx->ref, 1);
...@@ -931,11 +934,12 @@ static void dmz_io_hints(struct dm_target *ti, struct queue_limits *limits) ...@@ -931,11 +934,12 @@ static void dmz_io_hints(struct dm_target *ti, struct queue_limits *limits)
static int dmz_prepare_ioctl(struct dm_target *ti, struct block_device **bdev) static int dmz_prepare_ioctl(struct dm_target *ti, struct block_device **bdev)
{ {
struct dmz_target *dmz = ti->private; struct dmz_target *dmz = ti->private;
struct dmz_dev *dev = &dmz->dev[0];
if (!dmz_check_bdev(dmz->dev)) if (!dmz_check_bdev(dev))
return -EIO; return -EIO;
*bdev = dmz->dev->bdev; *bdev = dev->bdev;
return 0; return 0;
} }
......
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