Patch from Nick Piggin <piggin@cyberone.com.au>

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)

_