X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=block%2Felevator.c;h=25f6ef28e3bb34567db40fb0d8472f39038d0ae5;hb=4aa9ab67fb9c0dfdb1692f4ec413120832a22ddc;hp=f6dafa8c7c4d03bea2522125895bf43579480cb9;hpb=975a8e3ed2b9eab9f062a1e0ba7fe180e15204e1;p=powerpc.git diff --git a/block/elevator.c b/block/elevator.c index f6dafa8c7c..25f6ef28e3 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -269,6 +269,22 @@ void elevator_exit(elevator_t *e) EXPORT_SYMBOL(elevator_exit); +static void elv_activate_rq(request_queue_t *q, struct request *rq) +{ + elevator_t *e = q->elevator; + + if (e->ops->elevator_activate_req_fn) + e->ops->elevator_activate_req_fn(q, rq); +} + +static void elv_deactivate_rq(request_queue_t *q, struct request *rq) +{ + elevator_t *e = q->elevator; + + if (e->ops->elevator_deactivate_req_fn) + e->ops->elevator_deactivate_req_fn(q, rq); +} + static inline void __elv_rqhash_del(struct request *rq) { hlist_del_init(&rq->hash); @@ -397,6 +413,8 @@ void elv_dispatch_sort(request_queue_t *q, struct request *rq) list_for_each_prev(entry, &q->queue_head) { struct request *pos = list_entry_rq(entry); + if (rq_data_dir(rq) != rq_data_dir(pos)) + break; if (pos->cmd_flags & (REQ_SOFTBARRIER|REQ_HARDBARRIER|REQ_STARTED)) break; if (rq->sector >= boundary) { @@ -498,16 +516,14 @@ void elv_merge_requests(request_queue_t *q, struct request *rq, void elv_requeue_request(request_queue_t *q, struct request *rq) { - elevator_t *e = q->elevator; - /* * it already went through dequeue, we need to decrement the * in_flight count again */ if (blk_account_rq(rq)) { q->in_flight--; - if (blk_sorted_rq(rq) && e->ops->elevator_deactivate_req_fn) - e->ops->elevator_deactivate_req_fn(q, rq); + if (blk_sorted_rq(rq)) + elv_deactivate_rq(q, rq); } rq->cmd_flags &= ~REQ_STARTED; @@ -700,16 +716,13 @@ struct request *elv_next_request(request_queue_t *q) while ((rq = __elv_next_request(q)) != NULL) { if (!(rq->cmd_flags & REQ_STARTED)) { - elevator_t *e = q->elevator; - /* * This is the first time the device driver * sees this request (possibly after * requeueing). Notify IO scheduler. */ - if (blk_sorted_rq(rq) && - e->ops->elevator_activate_req_fn) - e->ops->elevator_activate_req_fn(q, rq); + if (blk_sorted_rq(rq)) + elv_activate_rq(q, rq); /* * just mark as started even if we don't start