diff options
Diffstat (limited to 'block/elevator.c')
-rw-r--r-- | block/elevator.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/block/elevator.c b/block/elevator.c index 86836dd179c0..261ffaaf47bd 100644 --- a/block/elevator.c +++ b/block/elevator.c | |||
@@ -944,10 +944,14 @@ void elv_completed_request(struct request_queue *q, struct request *rq) | |||
944 | * drained for flush sequence. | 944 | * drained for flush sequence. |
945 | */ | 945 | */ |
946 | if (unlikely(q->ordseq)) { | 946 | if (unlikely(q->ordseq)) { |
947 | struct request *first_rq = list_entry_rq(q->queue_head.next); | 947 | struct request *next = NULL; |
948 | if (q->in_flight == 0 && | 948 | |
949 | if (!list_empty(&q->queue_head)) | ||
950 | next = list_entry_rq(q->queue_head.next); | ||
951 | |||
952 | if (!q->in_flight && | ||
949 | blk_ordered_cur_seq(q) == QUEUE_ORDSEQ_DRAIN && | 953 | blk_ordered_cur_seq(q) == QUEUE_ORDSEQ_DRAIN && |
950 | blk_ordered_req_seq(first_rq) > QUEUE_ORDSEQ_DRAIN) { | 954 | (!next || blk_ordered_req_seq(next) > QUEUE_ORDSEQ_DRAIN)) { |
951 | blk_ordered_complete_seq(q, QUEUE_ORDSEQ_DRAIN, 0); | 955 | blk_ordered_complete_seq(q, QUEUE_ORDSEQ_DRAIN, 0); |
952 | blk_start_queueing(q); | 956 | blk_start_queueing(q); |
953 | } | 957 | } |