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

- Handle non-block requests (ones which someone has privately allocated)

- Convert some BUG_ONs to WARN_ONs.



 drivers/block/as-iosched.c |   17 +++++++++++------
 1 files changed, 11 insertions(+), 6 deletions(-)

diff -puN drivers/block/as-iosched.c~as-handle-non-block-requests drivers/block/as-iosched.c
--- 25/drivers/block/as-iosched.c~as-handle-non-block-requests	2003-03-16 23:12:28.000000000 -0800
+++ 25-akpm/drivers/block/as-iosched.c	2003-03-16 23:12:28.000000000 -0800
@@ -928,7 +928,7 @@ 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);
+		WARN_ON(arq->state != AS_RQ_QUEUED);
 
 		if (arq->as_io_context) {
 			BUG_ON(!atomic_read(&arq->as_io_context->nr_queued));
@@ -968,8 +968,11 @@ static void as_remove_dispatched_request
 	list_del_init(&rq->queuelist);
 
 	if (arq) {
-		struct as_io_context *aic = arq->as_io_context;
+		struct as_io_context *aic;
 
+		WARN_ON(arq->state != AS_RQ_DISPATCHED);
+		WARN_ON(ON_RB(&arq->rb_node));
+		aic = arq->as_io_context;
 		if (aic) {
 			WARN_ON(!atomic_read(&aic->nr_dispatched));
 			atomic_dec(&arq->as_io_context->nr_dispatched);
@@ -986,6 +989,9 @@ static void as_remove_request(request_qu
 	struct as_data *ad = q->elevator.elevator_data;
 	struct as_rq *arq = RQ_DATA(rq);
 
+	if (unlikely(!blk_fs_request(rq)))
+			return;
+
 	if (arq) {
 		if (ON_RB(&arq->rb_node))
 			as_remove_queued_request(q, rq);
@@ -993,6 +999,7 @@ static void as_remove_request(request_qu
 			as_remove_dispatched_request(q, rq);
 
 		as_complete_arq(ad, arq);
+		arq->state = AS_RQ_NEW;
 		put_as_io_context(&arq->as_io_context);
 	}
 }
@@ -1071,7 +1078,7 @@ static void as_move_to_dispatch(struct a
 	if (arq->as_io_context) 
 		atomic_inc(&arq->as_io_context->nr_dispatched);
 
-	BUG_ON(arq->state != AS_RQ_QUEUED);
+	WARN_ON(arq->state != AS_RQ_QUEUED);
 	arq->state = AS_RQ_DISPATCHED;
 }
 
@@ -1241,9 +1248,7 @@ as_insert_request(request_queue_t *q, st
 
 		list_add(&rq->queuelist, insert_here);
 
-		if (arq)
-			RB_CLEAR(&arq->rb_node);
-
+		/* Stop anticipating - let this request get through */
 		if (!list_empty(ad->dispatch) && rq_data_dir(rq) == READ
 			&& (ad->antic_status == ANTIC_WAIT_REQ
 				|| ad->antic_status == ANTIC_WAIT_NEXT))

_