Patch from Nick Piggin I appear to have forgotten to ever clear the AS_REQ_FINISHED bit Also added a bit of debugging stuff. drivers/block/as-iosched.c | 20 ++++++++++++++++++-- 1 files changed, 18 insertions(+), 2 deletions(-) diff -puN drivers/block/as-iosched.c~as-state-tracking-and-debug drivers/block/as-iosched.c --- 25/drivers/block/as-iosched.c~as-state-tracking-and-debug 2003-03-07 02:15:35.000000000 -0800 +++ 25-akpm/drivers/block/as-iosched.c 2003-03-07 02:15:35.000000000 -0800 @@ -141,6 +141,10 @@ struct as_data { unsigned long antic_expire; }; +#define AS_RQ_NEW 0 +#define AS_RQ_QUEUED 1 +#define AS_RQ_DISPATCHED 2 + /* * per-request data. */ @@ -166,6 +170,8 @@ struct as_rq { */ struct list_head fifo; unsigned long expires; + + unsigned long state; }; #define RQ_DATA(rq) ((struct as_rq *) (rq)->elevator_private) @@ -497,8 +503,10 @@ static void as_add_request(struct as_dat const int data_dir = rq_data_dir(arq->request); arq->as_io_context = get_as_io_context(); - if (arq->as_io_context) + if (arq->as_io_context) { atomic_inc(&arq->as_io_context->nr_queued); + clear_bit(AS_REQ_FINISHED, &arq->as_io_context->state); + } as_add_arq_rb(ad, arq); @@ -509,6 +517,8 @@ static void as_add_request(struct as_dat */ arq->expires = jiffies + ad->fifo_expire[data_dir]; list_add_tail(&arq->fifo, &ad->fifo_list[data_dir]); + + arq->state = AS_RQ_QUEUED; } /* @@ -527,6 +537,8 @@ static void as_remove_queued_request(req const int data_dir = rq_data_dir(arq->request); struct as_data *ad = q->elevator.elevator_data; + BUG_ON(arq->state != AS_RQ_QUEUED); + if (arq->as_io_context) { BUG_ON(!atomic_read(&arq->as_io_context->nr_queued)); atomic_dec(&arq->as_io_context->nr_queued); @@ -567,6 +579,7 @@ 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)); if (arq->as_io_context) { BUG_ON(arq->as_io_context->nr_dispatched == 0); @@ -737,8 +750,11 @@ static void as_move_to_dispatch(struct a */ as_remove_queued_request(ad->q, arq->request); list_add_tail(&arq->request->queuelist, ad->dispatch); - if (arq->as_io_context) + if (arq->as_io_context) arq->as_io_context->nr_dispatched++; + + BUG_ON(arq->state != AS_RQ_QUEUED); + arq->state = AS_RQ_DISPATCHED; } #define list_entry_fifo(ptr) list_entry((ptr), struct as_rq, fifo) _