
From: Mike Christie <michaelc@cs.wisc.edu>,
      Jens Axboe <axboe@suse.de>

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);
 }
 

_
