--- zzzz-none-000/linux-2.6.32.61/block/elevator.c 2013-06-10 09:43:48.000000000 +0000 +++ virian-300e-630/linux-2.6.32.61/block/elevator.c 2014-06-03 13:06:56.000000000 +0000 @@ -479,6 +479,10 @@ struct request *__rq; int ret; + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return ELEVATOR_NO_MERGE; + /* * First try one-hit cache. */ @@ -512,6 +516,10 @@ { struct elevator_queue *e = q->elevator; + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return; + if (e->ops->elevator_merged_fn) e->ops->elevator_merged_fn(q, rq, type); @@ -538,6 +546,11 @@ void elv_requeue_request(struct request_queue *q, struct request *rq) { + + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return; + /* * it already went through dequeue, we need to decrement the * in_flight count again @@ -556,6 +569,11 @@ void elv_drain_elevator(struct request_queue *q) { static int printed; + + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return; + while (q->elevator->ops->elevator_dispatch_fn(q, 1)) ; if (q->nr_sorted == 0) @@ -601,6 +619,10 @@ unsigned ordseq; int unplug_it = 1; + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return; + trace_block_rq_insert(q, rq); rq->q = q; @@ -745,6 +767,10 @@ { struct elevator_queue *e = q->elevator; + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return 1; + if (!list_empty(&q->queue_head)) return 0; @@ -759,6 +785,10 @@ { struct elevator_queue *e = q->elevator; + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return NULL; + if (e->ops->elevator_latter_req_fn) return e->ops->elevator_latter_req_fn(q, rq); return NULL; @@ -768,6 +798,10 @@ { struct elevator_queue *e = q->elevator; + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return NULL; + if (e->ops->elevator_former_req_fn) return e->ops->elevator_former_req_fn(q, rq); return NULL; @@ -788,6 +822,10 @@ { struct elevator_queue *e = q->elevator; + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return; + if (e->ops->elevator_put_req_fn) e->ops->elevator_put_req_fn(rq); } @@ -796,6 +834,10 @@ { struct elevator_queue *e = q->elevator; + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return ELV_MQUEUE_NO; + if (e->ops->elevator_may_queue_fn) return e->ops->elevator_may_queue_fn(q, rw); @@ -824,6 +866,10 @@ { struct elevator_queue *e = q->elevator; + /*= AVM/WK 20140603: Crash fix, don't access elevator of dead queue =*/ + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) + return; + /* * request is released from the driver, io must be done */