drivers/block/as-iosched.c |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

diff -puN drivers/block/as-iosched.c~as-remove-request-fix drivers/block/as-iosched.c
--- 25-power4/drivers/block/as-iosched.c~as-remove-request-fix	2003-03-16 01:41:01.000000000 -0800
+++ 25-power4-akpm/drivers/block/as-iosched.c	2003-03-16 01:41:21.000000000 -0800
@@ -523,6 +523,10 @@ static void as_update_iohist(struct as_i
 	}
 }
 
+/*
+ * Look Ma, no comment!
+ */
+
 static void as_complete_arq(struct as_data *ad, struct as_rq *arq)
 {
 	if (!arq->as_io_context)
@@ -622,7 +626,7 @@ static void as_remove_queued_request(req
  * request (or it has caused an error), and is finished with it. It assumes
  * the request is on the dispatch queue.
  */
-static void as_remove_dispatched_request(request_queue_t *q, struct request *rq)
+static void as_remove_request(request_queue_t *q, struct request *rq)
 {
 	struct as_rq *arq = RQ_DATA(rq);
 	struct as_data *ad = q->elevator.elevator_data;
@@ -633,10 +637,11 @@ static void as_remove_dispatched_request
 	list_del_init(&rq->queuelist);
 
 	if (arq) {
-		BUG_ON(arq->state != AS_RQ_DISPATCHED);
-		BUG_ON(ON_RB(&arq->rb_node));
+		list_del_init(&arq->fifo);
+		as_del_arq_hash(arq);
+		as_del_arq_rb(ad, arq);
 		if (arq->as_io_context) {
-			BUG_ON(!atomic_read(&arq->as_io_context->nr_dispatched));
+			WARN_ON(!atomic_read(&arq->as_io_context->nr_dispatched));
 			atomic_dec(&arq->as_io_context->nr_dispatched);
 		}
 		as_complete_arq(ad, arq);
@@ -1708,7 +1713,7 @@ elevator_t iosched_as = {
 	.elevator_merge_req_fn =	as_merged_requests,
 	.elevator_next_req_fn =		as_next_request,
 	.elevator_add_req_fn =		as_insert_request,
-	.elevator_remove_req_fn =	as_remove_dispatched_request,
+	.elevator_remove_req_fn =	as_remove_request,
 	.elevator_queue_empty_fn =	as_queue_notready,
 	.elevator_former_req_fn =	as_former_request,
 	.elevator_latter_req_fn =	as_latter_request,

_