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

This patch does the following:
starts a new fifo batch when changing from write to read
starts from the oldest request first when chaning from write to read
doesn't finish a read batch until the fifo batch is also expired

fifo batches can loosely be thought of as a process IO timeslice.



 drivers/block/as-iosched.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff -puN drivers/block/as-iosched.c~as-discrete-read-fifo-batches drivers/block/as-iosched.c
--- 25/drivers/block/as-iosched.c~as-discrete-read-fifo-batches	2003-05-22 12:32:19.000000000 -0700
+++ 25-akpm/drivers/block/as-iosched.c	2003-05-22 12:32:19.000000000 -0700
@@ -1069,7 +1069,9 @@ static int as_fifo_expired(struct as_dat
  */
 static inline int as_batch_expired(struct as_data *ad)
 {
-	return time_after(jiffies, ad->current_batch_expires);
+	return time_after(jiffies, ad->current_batch_expires) &&
+		(ad->batch_data_dir == WRITE ||
+		 time_after(jiffies, ad->fifo_expire[READ]));
 }
 
 /*
@@ -1166,9 +1168,10 @@ static int as_dispatch_request(struct as
 			goto dispatch_writes;
 
 		ad->batch_data_dir = READ;
-		arq = ad->next_arq[ad->batch_data_dir];
+		arq = list_entry_fifo(ad->fifo_list[ad->batch_data_dir].next);
 		ad->current_batch_expires = jiffies +
 			ad->batch_expire[ad->batch_data_dir];
+		ad->last_check_fifo[ad->batch_data_dir] = jiffies;
 		goto dispatch_request;
 	}
 

_