From: Mike Christie , Jens Axboe It's cleaner and more correct to look at req->rl to determine whether this request got from the block layer requests lists instead of using req->q. It's handy to always have req->q available, to lookup the queue from the request. --- drivers/block/elevator.c | 1 + drivers/block/ll_rw_blk.c | 11 +++++------ include/linux/blkdev.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff -puN drivers/block/elevator.c~request-origination-determination-fix drivers/block/elevator.c --- 25/drivers/block/elevator.c~request-origination-determination-fix 2004-01-15 08:28:01.000000000 -0800 +++ 25-akpm/drivers/block/elevator.c 2004-01-15 08:28:01.000000000 -0800 @@ -165,6 +165,7 @@ void __elv_add_request(request_queue_t * if (plug) blk_plug_device(q); + rq->q = q; q->elevator.elevator_add_req_fn(q, rq, where); } diff -puN drivers/block/ll_rw_blk.c~request-origination-determination-fix drivers/block/ll_rw_blk.c --- 25/drivers/block/ll_rw_blk.c~request-origination-determination-fix 2004-01-15 08:28:01.000000000 -0800 +++ 25-akpm/drivers/block/ll_rw_blk.c 2004-01-15 08:28:01.000000000 -0800 @@ -1843,8 +1843,6 @@ void __blk_put_request(request_queue_t * if (unlikely(--req->ref_count)) return; - elv_completed_request(req->q, req); - req->rq_status = RQ_INACTIVE; req->q = NULL; req->rl = NULL; @@ -1856,6 +1854,8 @@ void __blk_put_request(request_queue_t * if (rl) { int rw = rq_data_dir(req); + elv_completed_request(q, req); + BUG_ON(!list_empty(&req->queuelist)); blk_free_request(q, req); @@ -1865,14 +1865,13 @@ void __blk_put_request(request_queue_t * void blk_put_request(struct request *req) { - request_queue_t *q = req->q; - /* - * if req->q isn't set, this request didnt originate from the + * if req->rl isn't set, this request didnt originate from the * block layer, so it's safe to just disregard it */ - if (q) { + if (req->rl) { unsigned long flags; + request_queue_t *q = req->q; spin_lock_irqsave(q->queue_lock, flags); __blk_put_request(q, req); diff -puN include/linux/blkdev.h~request-origination-determination-fix include/linux/blkdev.h --- 25/include/linux/blkdev.h~request-origination-determination-fix 2004-01-15 08:28:01.000000000 -0800 +++ 25-akpm/include/linux/blkdev.h 2004-01-15 08:28:01.000000000 -0800 @@ -541,7 +541,7 @@ static inline void blkdev_dequeue_reques list_del_init(&req->queuelist); - if (req->q) + if (req->rl) elv_remove_request(req->q, req); } _