backport fix for managing block flush queue list
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
80775ca963
commit
e5731f42ad
@ -0,0 +1,48 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Chengming Zhou <chengming.zhou@linux.dev>
|
||||
Date: Tue, 4 Jun 2024 14:47:45 +0800
|
||||
Subject: [PATCH] block: fix request.queuelist usage in flush
|
||||
|
||||
Friedrich Weber reported a kernel crash problem and bisected to commit
|
||||
81ada09cc25e ("blk-flush: reuse rq queuelist in flush state machine").
|
||||
|
||||
The root cause is that we use "list_move_tail(&rq->queuelist, pending)"
|
||||
in the PREFLUSH/POSTFLUSH sequences. But rq->queuelist.next == xxx since
|
||||
it's popped out from plug->cached_rq in __blk_mq_alloc_requests_batch().
|
||||
We don't initialize its queuelist just for this first request, although
|
||||
the queuelist of all later popped requests will be initialized.
|
||||
|
||||
Fix it by changing to use "list_add_tail(&rq->queuelist, pending)" so
|
||||
rq->queuelist doesn't need to be initialized. It should be ok since rq
|
||||
can't be on any list when PREFLUSH or POSTFLUSH, has no move actually.
|
||||
|
||||
Please note the commit 81ada09cc25e ("blk-flush: reuse rq queuelist in
|
||||
flush state machine") also has another requirement that no drivers would
|
||||
touch rq->queuelist after blk_mq_end_request() since we will reuse it to
|
||||
add rq to the post-flush pending list in POSTFLUSH. If this is not true,
|
||||
we will have to revert that commit IMHO.
|
||||
|
||||
Reported-by: Friedrich Weber <f.weber@proxmox.com>
|
||||
Closes: https://lore.kernel.org/lkml/14b89dfb-505c-49f7-aebb-01c54451db40@proxmox.com/
|
||||
Fixes: 81ada09cc25e ("blk-flush: reuse rq queuelist in flush state machine")
|
||||
Cc: Christoph Hellwig <hch@lst.de>
|
||||
Cc: ming.lei@redhat.com
|
||||
Cc: bvanassche@acm.org
|
||||
Signed-off-by: Chengming Zhou <chengming.zhou@linux.dev>
|
||||
---
|
||||
block/blk-flush.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/blk-flush.c b/block/blk-flush.c
|
||||
index 3f4d41952ef2..aa5e573dd010 100644
|
||||
--- a/block/blk-flush.c
|
||||
+++ b/block/blk-flush.c
|
||||
@@ -183,7 +183,7 @@ static void blk_flush_complete_seq(struct request *rq,
|
||||
/* queue for flush */
|
||||
if (list_empty(pending))
|
||||
fq->flush_pending_since = jiffies;
|
||||
- list_move_tail(&rq->queuelist, pending);
|
||||
+ list_add_tail(&rq->queuelist, pending);
|
||||
break;
|
||||
|
||||
case REQ_FSEQ_DATA:
|
Loading…
Reference in New Issue
Block a user