From: Nick Piggin <piggin@cyberone.com.au>

Use the new elv_queue_empty() stuff



 drivers/block/as-iosched.c |   36 ++++++++++++------------------------
 drivers/block/ll_rw_blk.c  |    4 ++--
 drivers/block/paride/pf.c  |    4 ++--
 3 files changed, 16 insertions(+), 28 deletions(-)

diff -puN drivers/block/as-iosched.c~as-use-queue_empty drivers/block/as-iosched.c
--- 25/drivers/block/as-iosched.c~as-use-queue_empty	2003-04-07 01:40:45.000000000 -0700
+++ 25-akpm/drivers/block/as-iosched.c	2003-04-07 01:40:45.000000000 -0700
@@ -1247,33 +1247,21 @@ as_insert_request(request_queue_t *q, st
 }
 
 /*
- * as_queue_notready tells us weather or not as_next_request
- * will return us a request or NULL. With the previous work conserving
- * scheduler this API was designed around, if a queue had requests in it,
- * as_next_request would return a request, and drivers seem to make
- * that assumption
+ * as_queue_empty tells us if there are requests left in the device. It may
+ * not be the case that a driver can get the next request even if the queue
+ * is not empty - it is used in the block layer to check for plugging and
+ * merging opportunities
  */
-static int as_queue_notready(request_queue_t *q)
+static int as_queue_empty(request_queue_t *q)
 {
-	int ret = 0;
 	struct as_data *ad = q->elevator.elevator_data;
 
-	if (!list_empty(ad->dispatch))
-		goto out;
-	
-	if (ad->antic_status == ANTIC_WAIT_REQ ||
-			ad->antic_status == ANTIC_WAIT_NEXT) {
-		ret = 1;
-		goto out;
-	}
-				
-	if (!as_dispatch_request(ad)) {
-		ret = 1;
-		goto out;
-	}
+	if (!list_empty(&ad->fifo_list[WRITE])
+		|| !list_empty(&ad->fifo_list[READ])
+		|| !list_empty(ad->dispatch))
+			return 0;
 
-out:
-	return ret;
+	return 1;
 }
 
 static struct request *
@@ -1442,7 +1430,7 @@ static void as_work_handler(void *data)
 	unsigned long flags;
 
 	spin_lock_irqsave(q->queue_lock, flags);
-	if (!as_queue_notready(q))
+	if (as_next_request(q))
 		q->request_fn(q);
 	spin_unlock_irqrestore(q->queue_lock, flags);
 }
@@ -1706,7 +1694,7 @@ elevator_t iosched_as = {
 	.elevator_next_req_fn =		as_next_request,
 	.elevator_add_req_fn =		as_insert_request,
 	.elevator_remove_req_fn =	as_remove_request,
-	.elevator_queue_empty_fn =	as_queue_notready,
+	.elevator_queue_empty_fn =	as_queue_empty,
 	.elevator_former_req_fn =	as_former_request,
 	.elevator_latter_req_fn =	as_latter_request,
 	.elevator_init_fn =		as_init,
diff -puN drivers/block/ll_rw_blk.c~as-use-queue_empty drivers/block/ll_rw_blk.c
--- 25/drivers/block/ll_rw_blk.c~as-use-queue_empty	2003-04-07 01:40:45.000000000 -0700
+++ 25-akpm/drivers/block/ll_rw_blk.c	2003-04-07 01:42:34.000000000 -0700
@@ -984,7 +984,7 @@ static inline void __generic_unplug_devi
 	/*
 	 * was plugged, fire request_fn if queue has stuff to do
 	 */
-	if (!elv_queue_empty(q))
+	if (elv_next_request(q))
 		q->request_fn(q);
 }
 
@@ -1038,7 +1038,7 @@ void blk_start_queue(request_queue_t *q)
 		unsigned long flags;
 
 		spin_lock_irqsave(q->queue_lock, flags);
-		if (!elv_queue_empty(q))
+		if (elv_next_request(q))
 			q->request_fn(q);
 		spin_unlock_irqrestore(q->queue_lock, flags);
 	}