mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
dm: update original bio sector on Zone Append
Naohiro reported that issuing zone-append bios to a zoned block device
underneath a dm-linear device does not work as expected.
This because we forgot to reverse-map the sector the device wrote to the
original bio.
For zone-append bios, get the offset in the zone of the written sector
from the clone bio and add that to the original bio's sector position.
Fixes: 0512a75b98
("block: Introduce REQ_OP_ZONE_APPEND")
Cc: stable@vger.kernel.org
Reported-by: Naohiro Aota <Naohiro.Aota@wdc.com>
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
b38c0ad57f
commit
415c79e13b
@ -1009,6 +1009,7 @@ static void clone_endio(struct bio *bio)
|
|||||||
struct dm_io *io = tio->io;
|
struct dm_io *io = tio->io;
|
||||||
struct mapped_device *md = tio->io->md;
|
struct mapped_device *md = tio->io->md;
|
||||||
dm_endio_fn endio = tio->ti->type->end_io;
|
dm_endio_fn endio = tio->ti->type->end_io;
|
||||||
|
struct bio *orig_bio = io->orig_bio;
|
||||||
|
|
||||||
if (unlikely(error == BLK_STS_TARGET) && md->type != DM_TYPE_NVME_BIO_BASED) {
|
if (unlikely(error == BLK_STS_TARGET) && md->type != DM_TYPE_NVME_BIO_BASED) {
|
||||||
if (bio_op(bio) == REQ_OP_DISCARD &&
|
if (bio_op(bio) == REQ_OP_DISCARD &&
|
||||||
@ -1022,6 +1023,18 @@ static void clone_endio(struct bio *bio)
|
|||||||
disable_write_zeroes(md);
|
disable_write_zeroes(md);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For zone-append bios get offset in zone of the written
|
||||||
|
* sector and add that to the original bio sector pos.
|
||||||
|
*/
|
||||||
|
if (bio_op(orig_bio) == REQ_OP_ZONE_APPEND) {
|
||||||
|
sector_t written_sector = bio->bi_iter.bi_sector;
|
||||||
|
struct request_queue *q = orig_bio->bi_disk->queue;
|
||||||
|
u64 mask = (u64)blk_queue_zone_sectors(q) - 1;
|
||||||
|
|
||||||
|
orig_bio->bi_iter.bi_sector += written_sector & mask;
|
||||||
|
}
|
||||||
|
|
||||||
if (endio) {
|
if (endio) {
|
||||||
int r = endio(tio->ti, bio, &error);
|
int r = endio(tio->ti, bio, &error);
|
||||||
switch (r) {
|
switch (r) {
|
||||||
|
Loading…
Reference in New Issue
Block a user