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, _