vserver 2.0 rc7
[linux-2.6.git] / drivers / block / as-iosched.c
index fb625b4..a9575bb 100644 (file)
@@ -25,7 +25,7 @@
 #define REQ_ASYNC      0
 
 /*
- * See Documentation/as-iosched.txt
+ * See Documentation/block/as-iosched.txt
  */
 
 /*
@@ -1463,34 +1463,35 @@ static void as_add_request(struct as_data *ad, struct as_rq *arq)
        arq->state = AS_RQ_QUEUED;
 }
 
-/*
- * requeue the request. The request has not been completed, nor is it a
- * new request, so don't touch accounting.
- */
-static void as_requeue_request(request_queue_t *q, struct request *rq)
+static void as_deactivate_request(request_queue_t *q, struct request *rq)
 {
        struct as_data *ad = q->elevator->elevator_data;
        struct as_rq *arq = RQ_DATA(rq);
 
        if (arq) {
-               if (arq->state != AS_RQ_REMOVED) {
-                       printk("arq->state %d\n", arq->state);
-                       WARN_ON(1);
+               if (arq->state == AS_RQ_REMOVED) {
+                       arq->state = AS_RQ_DISPATCHED;
+                       if (arq->io_context && arq->io_context->aic)
+                               atomic_inc(&arq->io_context->aic->nr_dispatched);
                }
-
-               arq->state = AS_RQ_DISPATCHED;
-               if (arq->io_context && arq->io_context->aic)
-                       atomic_inc(&arq->io_context->aic->nr_dispatched);
        } else
                WARN_ON(blk_fs_request(rq)
                        && (!(rq->flags & (REQ_HARDBARRIER|REQ_SOFTBARRIER))) );
 
-       list_add(&rq->queuelist, ad->dispatch);
-
        /* Stop anticipating - let this request get through */
        as_antic_stop(ad);
 }
 
+/*
+ * requeue the request. The request has not been completed, nor is it a
+ * new request, so don't touch accounting.
+ */
+static void as_requeue_request(request_queue_t *q, struct request *rq)
+{
+       as_deactivate_request(q, rq);
+       list_add(&rq->queuelist, &q->queue_head);
+}
+
 /*
  * Account a request that is inserted directly onto the dispatch queue.
  * arq->io_context->aic->nr_dispatched should not need to be incremented
@@ -2080,6 +2081,7 @@ static struct elevator_type iosched_as = {
                .elevator_add_req_fn =          as_insert_request,
                .elevator_remove_req_fn =       as_remove_request,
                .elevator_requeue_req_fn =      as_requeue_request,
+               .elevator_deactivate_req_fn =   as_deactivate_request,
                .elevator_queue_empty_fn =      as_queue_empty,
                .elevator_completed_req_fn =    as_completed_request,
                .elevator_former_req_fn =       as_former_request,