diff options
Diffstat (limited to 'block/blk-flush.c')
-rw-r--r-- | block/blk-flush.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/block/blk-flush.c b/block/blk-flush.c index 6c9b5e189e62..bb21e4c36f70 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c | |||
@@ -212,13 +212,19 @@ static void flush_end_io(struct request *flush_rq, int error) | |||
212 | } | 212 | } |
213 | 213 | ||
214 | /* | 214 | /* |
215 | * Moving a request silently to empty queue_head may stall the | 215 | * Kick the queue to avoid stall for two cases: |
216 | * queue. Kick the queue in those cases. This function is called | 216 | * 1. Moving a request silently to empty queue_head may stall the |
217 | * from request completion path and calling directly into | 217 | * queue. |
218 | * request_fn may confuse the driver. Always use kblockd. | 218 | * 2. When flush request is running in non-queueable queue, the |
219 | * queue is hold. Restart the queue after flush request is finished | ||
220 | * to avoid stall. | ||
221 | * This function is called from request completion path and calling | ||
222 | * directly into request_fn may confuse the driver. Always use | ||
223 | * kblockd. | ||
219 | */ | 224 | */ |
220 | if (queued) | 225 | if (queued || q->flush_queue_delayed) |
221 | blk_run_queue_async(q); | 226 | blk_run_queue_async(q); |
227 | q->flush_queue_delayed = 0; | ||
222 | } | 228 | } |
223 | 229 | ||
224 | /** | 230 | /** |