aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMing Lei <[email protected]>2020-10-30 10:42:53 +0800
committerJens Axboe <[email protected]>2020-10-30 08:33:49 -0600
commit65ff5cd04551daf2c11c7928e48fc3483391c900 (patch)
tree93d6db0e0473214a2837b0099771ca6bed8725c1
parent1f41be7d4e90e36084037cecba5978b3d7f849db (diff)
blk-mq: mark flush request as IDLE in flush_end_io()
Mark flush request as IDLE in its .end_io(), aligning it with how normal requests behave. The flush request stays in in-flight tags if we're not using an IO scheduler, so we need to change its state into IDLE. Otherwise, we will hang in blk_mq_tagset_wait_completed_request() during error recovery because flush the request state is kept as COMPLETED. Reported-by: Yi Zhang <[email protected]> Signed-off-by: Ming Lei <[email protected]> Tested-by: Yi Zhang <[email protected]> Cc: Chao Leng <[email protected]> Cc: Sagi Grimberg <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
-rw-r--r--block/blk-flush.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/block/blk-flush.c b/block/blk-flush.c
index 53abb5c73d99..e32958f0b687 100644
--- a/block/blk-flush.c
+++ b/block/blk-flush.c
@@ -225,6 +225,7 @@ static void flush_end_io(struct request *flush_rq, blk_status_t error)
/* release the tag's ownership to the req cloned from */
spin_lock_irqsave(&fq->mq_flush_lock, flags);
+ WRITE_ONCE(flush_rq->state, MQ_RQ_IDLE);
if (!refcount_dec_and_test(&flush_rq->ref)) {
fq->rq_status = error;
spin_unlock_irqrestore(&fq->mq_flush_lock, flags);