X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=block%2Felevator.c;h=1d0759178e4b49710c6cb90c538fc6d0c897e126;hb=2dede2d8e925f4c2cb4e136b14df127685e15dd3;hp=99a4d7b2f8ad335079ae1eebeab71136f20acc35;hpb=8e9c238c3884c226f0cddc31cde87dd5df1a6500;p=karo-tx-linux.git diff --git a/block/elevator.c b/block/elevator.c index 99a4d7b2f8ad..1d0759178e4b 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -610,23 +610,23 @@ void elv_completed_request(request_queue_t *q, struct request *rq) * request is released from the driver, io must be done */ if (blk_account_rq(rq)) { - struct request *first_rq = list_entry_rq(q->queue_head.next); - q->in_flight--; + if (blk_sorted_rq(rq) && e->ops->elevator_completed_req_fn) + e->ops->elevator_completed_req_fn(q, rq); + } - /* - * Check if the queue is waiting for fs requests to be - * drained for flush sequence. - */ - if (q->ordseq && q->in_flight == 0 && + /* + * Check if the queue is waiting for fs requests to be + * drained for flush sequence. + */ + if (unlikely(q->ordseq)) { + struct request *first_rq = list_entry_rq(q->queue_head.next); + if (q->in_flight == 0 && blk_ordered_cur_seq(q) == QUEUE_ORDSEQ_DRAIN && blk_ordered_req_seq(first_rq) > QUEUE_ORDSEQ_DRAIN) { blk_ordered_complete_seq(q, QUEUE_ORDSEQ_DRAIN, 0); q->request_fn(q); } - - if (blk_sorted_rq(rq) && e->ops->elevator_completed_req_fn) - e->ops->elevator_completed_req_fn(q, rq); } }