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