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




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

diff -puN drivers/block/as-iosched.c~as-fix-seek-estimation drivers/block/as-iosched.c
--- 25/drivers/block/as-iosched.c~as-fix-seek-estimation	2003-06-11 19:49:21.000000000 -0700
+++ 25-akpm/drivers/block/as-iosched.c	2003-06-11 19:49:22.000000000 -0700
@@ -877,24 +877,27 @@ static void as_update_iohist(struct as_i
 		}
 
 		/* Calculate read -> read seek distance */
-		if (aic->last_request_pos < rq->sector)
+		aic->last_request_pos = rq->sector + rq->nr_sectors;
+
+		if (!aic->seek_samples)
+			seek_dist = 0;
+		else if (aic->last_request_pos < rq->sector)
 			seek_dist = rq->sector - aic->last_request_pos;
 		else
 			seek_dist = aic->last_request_pos - rq->sector;
-		aic->last_request_pos = rq->sector + rq->nr_sectors;
 
+#if 0	/* TODO does this fix IBM's rawio random reads? */
 		/*
 		 * Don't allow the seek distance to get too large from the
 		 * odd fragment, pagein, etc
 		 */
-		if (!aic->seek_samples)
-			seek_dist = 0;
-		else if (aic->seek_samples < 400) /* second&third seek */
+		if (aic->seek_samples < 400) /* second&third seek */
 			seek_dist = min(seek_dist, (aic->seek_mean * 4)
 							+ 2*1024*1024);
 		else
 			seek_dist = min(seek_dist, (aic->seek_mean * 4)
 							+ 2*1024*64);
+#endif
 
 		aic->seek_samples += 256;
 		aic->seek_total += 256*seek_dist;
@@ -1023,6 +1026,7 @@ static void as_completed_request(request
 		}
 	}
 	spin_unlock(&aic->lock);
+
 	put_as_io_context(&arq->as_io_context);
 }
 

_