From: Jackie Liu Commit fe0418eb9bd6 ("block: Prevent potential deadlocks in zone write plug error recovery") changed blk_zone_wplug_handle_write() to fail BIOs directly when blk_zone_wplug_prepare_bio() rejects them, for example because the write is not aligned to the cached write pointer or the plug needs a write pointer update. However, the BIO is already marked with BIO_ZONE_WRITE_PLUGGING at that point even though it is not issued. Completing such a BIO with bio_io_error() makes bio_endio() call blk_zone_write_plug_bio_endio(), which treats the completion as a failed device write and may poison the cached zone write pointer state by setting BLK_ZONE_WPLUG_NEED_WP_UPDATE. Clear BIO_ZONE_WRITE_PLUGGING and drop the zone write plug reference before failing the rejected BIO. Fixes: fe0418eb9bd6 ("block: Prevent potential deadlocks in zone write plug error recovery") Cc: stable@vger.kernel.org # 6.13+ Signed-off-by: Jackie Liu --- block/blk-zoned.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/block/blk-zoned.c b/block/blk-zoned.c index 6a221c180889..855767d8bfc1 100644 --- a/block/blk-zoned.c +++ b/block/blk-zoned.c @@ -1502,7 +1502,9 @@ static bool blk_zone_wplug_handle_write(struct bio *bio, unsigned int nr_segs) goto queue_bio; if (!blk_zone_wplug_prepare_bio(zwplug, bio)) { + bio_clear_flag(bio, BIO_ZONE_WRITE_PLUGGING); spin_unlock_irqrestore(&zwplug->lock, flags); + disk_put_zone_wplug(zwplug); bio_io_error(bio); return true; } -- 2.54.0