summaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>2025-05-06 13:27:30 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-05-29 11:13:54 +0200
commitc99cfbac1617dc34f6ade25b20e38158e8df57e4 (patch)
treec9b1814261019b9c5574585062efa94320b00e80 /block
parent9a7a0bc1d3ee7d4088dd0fe39dce6491e325c9e7 (diff)
downloadlinux-c99cfbac1617dc34f6ade25b20e38158e8df57e4.tar.gz
linux-c99cfbac1617dc34f6ade25b20e38158e8df57e4.tar.bz2
linux-c99cfbac1617dc34f6ade25b20e38158e8df57e4.zip
block: only update request sector if needed
[ Upstream commit db492e24f9b05547ba12b4783f09c9d943cf42fe ] In case of a ZONE APPEND write, regardless of native ZONE APPEND or the emulation layer in the zone write plugging code, the sector the data got written to by the device needs to be updated in the bio. At the moment, this is done for every native ZONE APPEND write and every request that is flagged with 'BIO_ZONE_WRITE_PLUGGING'. But thus superfluously updates the sector for regular writes to a zoned block device. Check if a bio is a native ZONE APPEND write or if the bio is flagged as 'BIO_EMULATES_ZONE_APPEND', meaning the block layer's zone write plugging code handles the ZONE APPEND and translates it into a regular write and back. Only if one of these two criterion is met, update the sector in the bio upon completion. Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/dea089581cb6b777c1cd1500b38ac0b61df4b2d1.1746530748.git.jth@kernel.org Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'block')
-rw-r--r--block/blk.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/block/blk.h b/block/blk.h
index 9dcc92c7f2b5..c14f415de522 100644
--- a/block/blk.h
+++ b/block/blk.h
@@ -480,7 +480,8 @@ static inline void blk_zone_update_request_bio(struct request *rq,
* the original BIO sector so that blk_zone_write_plug_bio_endio() can
* lookup the zone write plug.
*/
- if (req_op(rq) == REQ_OP_ZONE_APPEND || bio_zone_write_plugging(bio))
+ if (req_op(rq) == REQ_OP_ZONE_APPEND ||
+ bio_flagged(bio, BIO_EMULATES_ZONE_APPEND))
bio->bi_iter.bi_sector = rq->__sector;
}
void blk_zone_write_plug_bio_endio(struct bio *bio);