vserver 2.0 rc7
[linux-2.6.git] / drivers / block / cfq-iosched.c
index 4234508..2210bac 100644 (file)
@@ -607,10 +607,7 @@ out:
        return NULL;
 }
 
-/*
- * make sure the service time gets corrected on reissue of this request
- */
-static void cfq_requeue_request(request_queue_t *q, struct request *rq)
+static void cfq_deactivate_request(request_queue_t *q, struct request *rq)
 {
        struct cfq_rq *crq = RQ_DATA(rq);
 
@@ -627,6 +624,14 @@ static void cfq_requeue_request(request_queue_t *q, struct request *rq)
                        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);
 }
 
@@ -1197,13 +1202,16 @@ retry:
                if (new_cfqq) {
                        cfqq = new_cfqq;
                        new_cfqq = NULL;
-               } else if (gfp_mask & __GFP_WAIT) {
+               } else {
                        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));
 
@@ -1790,7 +1798,7 @@ static struct sysfs_ops cfq_sysfs_ops = {
        .store  = cfq_attr_store,
 };
 
-struct kobj_type cfq_ktype = {
+static struct kobj_type cfq_ktype = {
        .sysfs_ops      = &cfq_sysfs_ops,
        .default_attrs  = default_attrs,
 };
@@ -1804,6 +1812,7 @@ 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,