From: Tejun Heo <htejun@gmail.com>

In cfq_find_next_crq(), cfq tries to find the next request by choosing one
of two requests before and after the current one.  Currently, when choosing
the next request, if there's no next request, the next candidate is NULL,
resulting in selection of the previous request.  This results in weird
scheduling.  Once we reach the end, we always seek backward.

The correct behavior is using the first request as the next candidate. 
cfq_choose_req() already has logics for handling wrapped requests.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Cc: Jens Axboe <axboe@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 drivers/block/cfq-iosched.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletion(-)

diff -puN drivers/block/cfq-iosched.c~cfq-iosched-update-to-time-sliced-design-find_next_crq-fix drivers/block/cfq-iosched.c
--- 25/drivers/block/cfq-iosched.c~cfq-iosched-update-to-time-sliced-design-find_next_crq-fix	2005-06-15 21:09:21.000000000 -0700
+++ 25-akpm/drivers/block/cfq-iosched.c	2005-06-15 21:09:21.000000000 -0700
@@ -378,9 +378,10 @@ cfq_find_next_crq(struct cfq_data *cfqd,
 	struct cfq_rq *crq_next = NULL, *crq_prev = NULL;
 	struct rb_node *rbnext, *rbprev;
 
+	rbnext = NULL;
 	if (ON_RB(&last->rb_node))
 		rbnext = rb_next(&last->rb_node);
-	else {
+	if (!rbnext) {
 		rbnext = rb_first(&cfqq->sort_list);
 		if (rbnext == &last->rb_node)
 			rbnext = NULL;
_