diff options
Diffstat (limited to 'block/blk-flush.c')
| -rw-r--r-- | block/blk-flush.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/block/blk-flush.c b/block/blk-flush.c index 54b123d6563e..b27d0208611b 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c | |||
| @@ -66,10 +66,12 @@ static void blk_flush_complete_seq_end_io(struct request_queue *q, | |||
| 66 | 66 | ||
| 67 | /* | 67 | /* |
| 68 | * Moving a request silently to empty queue_head may stall the | 68 | * Moving a request silently to empty queue_head may stall the |
| 69 | * queue. Kick the queue in those cases. | 69 | * queue. Kick the queue in those cases. This function is called |
| 70 | * from request completion path and calling directly into | ||
| 71 | * request_fn may confuse the driver. Always use kblockd. | ||
| 70 | */ | 72 | */ |
| 71 | if (was_empty && next_rq) | 73 | if (was_empty && next_rq) |
| 72 | __blk_run_queue(q); | 74 | __blk_run_queue(q, true); |
| 73 | } | 75 | } |
| 74 | 76 | ||
| 75 | static void pre_flush_end_io(struct request *rq, int error) | 77 | static void pre_flush_end_io(struct request *rq, int error) |
| @@ -130,7 +132,7 @@ static struct request *queue_next_fseq(struct request_queue *q) | |||
| 130 | BUG(); | 132 | BUG(); |
| 131 | } | 133 | } |
| 132 | 134 | ||
| 133 | elv_insert(q, rq, ELEVATOR_INSERT_FRONT); | 135 | elv_insert(q, rq, ELEVATOR_INSERT_REQUEUE); |
| 134 | return rq; | 136 | return rq; |
| 135 | } | 137 | } |
| 136 | 138 | ||
