aboutsummaryrefslogtreecommitdiff
path: root/block/blk-mq.c
diff options
context:
space:
mode:
authorGravatar Damien Le Moal <dlemoal@kernel.org> 2024-05-01 20:09:02 +0900
committerGravatar Jens Axboe <axboe@kernel.dk> 2024-05-01 08:08:43 -0600
commit096bc7ea335bc5dfbaed1d005ff27f008ec9d710 (patch)
tree8393c99e90fdac1e4c5102704ce956b46c0235c9 /block/blk-mq.c
parentblock: Fix flush request sector restore (diff)
downloadlinux-096bc7ea335bc5dfbaed1d005ff27f008ec9d710.tar.gz
linux-096bc7ea335bc5dfbaed1d005ff27f008ec9d710.tar.bz2
linux-096bc7ea335bc5dfbaed1d005ff27f008ec9d710.zip
block: Fix handling of non-empty flush write requests to zones
Zone write plugging ignores empty (no data) flush operations but handles flush BIOs that have data to ensure that the flush machinery generated write is processed in order. However, the call to blk_zone_write_plug_attempt_merge() which sets a request RQF_ZONE_WRITE_PLUGGING flag is called after blk_insert_flush(), thus missing indicating that a non empty flush request completion needs handling by zone write plugging. Fix this by moving the call to blk_zone_write_plug_attempt_merge() before blk_insert_flush(). And while at it, rename that function as blk_zone_write_plug_init_request() to be clear that it is not just about merging plugged BIOs in the request. While at it, also add a WARN_ONCE() check that the zone write plug for the request is not NULL. Fixes: dd291d77cc90 ("block: Introduce zone write plugging") Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Link: https://lore.kernel.org/r/20240501110907.96950-10-dlemoal@kernel.org Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-mq.c')
-rw-r--r--block/blk-mq.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 434d45219e23..0fae9bd0ecd4 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -3001,12 +3001,12 @@ new_request:
return;
}
+ if (bio_zone_write_plugging(bio))
+ blk_zone_write_plug_init_request(rq);
+
if (op_is_flush(bio->bi_opf) && blk_insert_flush(rq))
return;
- if (bio_zone_write_plugging(bio))
- blk_zone_write_plug_attempt_merge(rq);
-
if (plug) {
blk_add_rq_to_plug(plug, rq);
return;