From: Nick Piggin 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; } _