X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fblock%2Fcfq-iosched.c;h=6c24f236f7f6de5af02e200ef770dabc19b9c6c1;hb=f1227cd3e0e73c48b93368800aa89f4341103a00;hp=2210bacad56a34c4023a85036681c51657d19f8b;hpb=340e2b1a4c74f653454348914c408420d5d3c28a;p=linux-2.6.git diff --git a/drivers/block/cfq-iosched.c b/drivers/block/cfq-iosched.c index 2210bacad..6c24f236f 100644 --- a/drivers/block/cfq-iosched.c +++ b/drivers/block/cfq-iosched.c @@ -607,7 +607,10 @@ out: return NULL; } -static void cfq_deactivate_request(request_queue_t *q, struct request *rq) +/* + * make sure the service time gets corrected on reissue of this request + */ +static void cfq_requeue_request(request_queue_t *q, struct request *rq) { struct cfq_rq *crq = RQ_DATA(rq); @@ -619,19 +622,9 @@ static void cfq_deactivate_request(request_queue_t *q, struct request *rq) cfq_sort_rr_list(cfqq, 0); } - if (crq->accounted) { - crq->accounted = 0; - cfqq->cfqd->rq_in_driver--; - } + crq->accounted = 0; + cfqq->cfqd->rq_in_driver--; } -} - -/* - * make sure the service time gets corrected on reissue of this request - */ -static void cfq_requeue_request(request_queue_t *q, struct request *rq) -{ - cfq_deactivate_request(q, rq); list_add(&rq->queuelist, &q->queue_head); } @@ -1202,16 +1195,13 @@ retry: if (new_cfqq) { cfqq = new_cfqq; new_cfqq = NULL; - } else { + } else if (gfp_mask & __GFP_WAIT) { spin_unlock_irq(cfqd->queue->queue_lock); new_cfqq = kmem_cache_alloc(cfq_pool, gfp_mask); spin_lock_irq(cfqd->queue->queue_lock); - - if (!new_cfqq && !(gfp_mask & __GFP_WAIT)) - goto out; - goto retry; - } + } else + goto out; memset(cfqq, 0, sizeof(*cfqq)); @@ -1293,19 +1283,19 @@ static int cfq_queue_empty(request_queue_t *q) static void cfq_completed_request(request_queue_t *q, struct request *rq) { struct cfq_rq *crq = RQ_DATA(rq); - struct cfq_queue *cfqq; if (unlikely(!blk_fs_request(rq))) return; - cfqq = crq->cfq_queue; - if (crq->in_flight) { + struct cfq_queue *cfqq = crq->cfq_queue; + WARN_ON(!cfqq->in_flight); cfqq->in_flight--; + + cfq_account_completion(cfqq, crq); } - cfq_account_completion(cfqq, crq); } static struct request * @@ -1798,7 +1788,7 @@ static struct sysfs_ops cfq_sysfs_ops = { .store = cfq_attr_store, }; -static struct kobj_type cfq_ktype = { +struct kobj_type cfq_ktype = { .sysfs_ops = &cfq_sysfs_ops, .default_attrs = default_attrs, }; @@ -1812,7 +1802,6 @@ static struct elevator_type iosched_cfq = { .elevator_add_req_fn = cfq_insert_request, .elevator_remove_req_fn = cfq_remove_request, .elevator_requeue_req_fn = cfq_requeue_request, - .elevator_deactivate_req_fn = cfq_deactivate_request, .elevator_queue_empty_fn = cfq_queue_empty, .elevator_completed_req_fn = cfq_completed_request, .elevator_former_req_fn = cfq_former_request, @@ -1828,7 +1817,7 @@ static struct elevator_type iosched_cfq = { .elevator_owner = THIS_MODULE, }; -static int __init cfq_init(void) +int cfq_init(void) { int ret;