[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220615101920.329421-13-p.raghav@samsung.com>
Date: Wed, 15 Jun 2022 12:19:19 +0200
From: Pankaj Raghav <p.raghav@...sung.com>
To: hch@....de, snitzer@...hat.com, damien.lemoal@...nsource.wdc.com,
axboe@...nel.dk
Cc: bvanassche@....org, linux-kernel@...r.kernel.org,
jiangbo.365@...edance.com, hare@...e.de, pankydev8@...il.com,
dm-devel@...hat.com, jonathan.derrick@...ux.dev,
gost.dev@...sung.com, dsterba@...e.com, jaegeuk@...nel.org,
linux-nvme@...ts.infradead.org, Johannes.Thumshirn@....com,
linux-block@...r.kernel.org, Pankaj Raghav <p.raghav@...sung.com>
Subject: [PATCH v7 12/13] dm: call dm_zone_endio after the target endio
callback for zoned devices
dm_zone_endio() updates the bi_sector of orig bio for zoned devices that
uses either native append or append emulation and it is called before the
endio of the target. But target endio can still update the clone bio
after dm_zone_endio is called, thereby, the orig bio does not contain
the updated information anymore. Call dm_zone_endio for zoned devices
after calling the target's endio function
Signed-off-by: Pankaj Raghav <p.raghav@...sung.com>
---
@Damien and @Hannes: I couldn't come up with a testcase that uses endio callback and
zone append or append emulation for zoned devices to test for
regression in this change. It would be great if you can suggest
something. This change is required for the npo2 target as we update the
clone bio sector in the endio callback function and the orig bio should
be updated only after the endio callback for zone appends.
drivers/md/dm.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 3f17fe1de..3a74e1038 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1025,10 +1025,6 @@ static void clone_endio(struct bio *bio)
disable_write_zeroes(md);
}
- if (static_branch_unlikely(&zoned_enabled) &&
- unlikely(blk_queue_is_zoned(bdev_get_queue(bio->bi_bdev))))
- dm_zone_endio(io, bio);
-
if (endio) {
int r = endio(ti, bio, &error);
switch (r) {
@@ -1057,6 +1053,10 @@ static void clone_endio(struct bio *bio)
}
}
+ if (static_branch_unlikely(&zoned_enabled) &&
+ unlikely(blk_queue_is_zoned(bdev_get_queue(bio->bi_bdev))))
+ dm_zone_endio(io, bio);
+
if (static_branch_unlikely(&swap_bios_enabled) &&
unlikely(swap_bios_limit(ti, bio)))
up(&md->swap_bios_semaphore);
--
2.25.1
Powered by blists - more mailing lists