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: Hannes Reinecke <hare@suse.de> Reviewed-by: Bob Liu <bob.liu@oracle.com> Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
6c805f77f1
commit
52d6775888
|
@ -17,7 +17,7 @@
|
|||
* Zone BIO context.
|
||||
*/
|
||||
struct dmz_bioctx {
|
||||
struct dmz_target *target;
|
||||
struct dmz_dev *dev;
|
||||
struct dm_zone *zone;
|
||||
struct bio *bio;
|
||||
refcount_t ref;
|
||||
|
@ -76,12 +76,13 @@ struct dmz_target {
|
|||
*/
|
||||
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)
|
||||
bio->bi_status = status;
|
||||
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)) {
|
||||
struct dm_zone *zone = bioctx->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,
|
||||
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;
|
||||
|
||||
if (dev->flags & DMZ_BDEV_DYING)
|
||||
return -EIO;
|
||||
|
||||
clone = bio_clone_fast(bio, GFP_NOIO, &dmz->bio_set);
|
||||
if (!clone)
|
||||
return -ENOMEM;
|
||||
|
||||
bio_set_dev(clone, dmz->dev->bdev);
|
||||
bio_set_dev(clone, dev->bdev);
|
||||
bioctx->dev = dev;
|
||||
clone->bi_iter.bi_sector =
|
||||
dmz_start_sect(dmz->metadata, zone) + dmz_blk2sect(chunk_block);
|
||||
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,
|
|||
|
||||
if (nr_blocks) {
|
||||
/* Valid blocks found: read them */
|
||||
nr_blocks = min_t(unsigned int, nr_blocks, end_block - chunk_block);
|
||||
ret = dmz_submit_bio(dmz, rzone, bio, chunk_block, nr_blocks);
|
||||
nr_blocks = min_t(unsigned int, nr_blocks,
|
||||
end_block - chunk_block);
|
||||
ret = dmz_submit_bio(dmz, rzone, bio,
|
||||
chunk_block, nr_blocks);
|
||||
if (ret)
|
||||
return ret;
|
||||
chunk_block += nr_blocks;
|
||||
|
@ -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:
|
||||
* 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,
|
|||
static void dmz_handle_bio(struct dmz_target *dmz, struct dm_chunk_work *cw,
|
||||
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 dm_zone *zone;
|
||||
int ret;
|
||||
|
@ -397,11 +408,6 @@ static void dmz_handle_bio(struct dmz_target *dmz, struct dm_chunk_work *cw,
|
|||
|
||||
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
|
||||
* 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)
|
|||
{
|
||||
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;
|
||||
unsigned int nr_sectors = bio_sectors(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 int)dmz_bio_blocks(bio));
|
||||
|
||||
bio_set_dev(bio, dev->bdev);
|
||||
|
||||
if (!nr_sectors && bio_op(bio) != REQ_OP_WRITE)
|
||||
return DM_MAPIO_REMAPPED;
|
||||
|
||||
|
@ -652,7 +655,7 @@ static int dmz_map(struct dm_target *ti, struct bio *bio)
|
|||
return DM_MAPIO_KILL;
|
||||
|
||||
/* Initialize the BIO context */
|
||||
bioctx->target = dmz;
|
||||
bioctx->dev = NULL;
|
||||
bioctx->zone = NULL;
|
||||
bioctx->bio = bio;
|
||||
refcount_set(&bioctx->ref, 1);
|
||||
|
@ -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)
|
||||
{
|
||||
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;
|
||||
|
||||
*bdev = dmz->dev->bdev;
|
||||
*bdev = dev->bdev;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue