Patch from Nick Piggin - 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)) _