From: Miklos Szeredi Current readahead logic is broken when a random read pattern is followed by a long sequential read. The cause is that on a window miss ra->next_size is set to ra->average, but ra->average is only updated at the end of a sequence, so window size will remain 1 until the end of the sequential read. This patch fixes this by taking the current sequence length into account (code taken from towards end of page_cache_readahead()), and also setting ra->average to a decent value in handle_ra_miss() when sequential access is detected. Signed-off-by: Miklos Szeredi Signed-off-by: Andrew Morton --- 25-akpm/mm/readahead.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) diff -puN mm/readahead.c~fix-readahead-breakage-for-sequential-after-random-reads mm/readahead.c --- 25/mm/readahead.c~fix-readahead-breakage-for-sequential-after-random-reads 2004-07-26 16:28:19.671904776 -0700 +++ 25-akpm/mm/readahead.c 2004-07-26 16:28:19.675904168 -0700 @@ -470,7 +470,11 @@ do_io: * pages shall be accessed in the next * current window. */ - ra->next_size = min(ra->average , (unsigned long)max); + average = ra->average; + if (ra->serial_cnt > average) + average = (ra->serial_cnt + ra->average + 1) / 2; + + ra->next_size = min(average , (unsigned long)max); } ra->start = offset; ra->size = ra->next_size; @@ -552,6 +556,7 @@ void handle_ra_miss(struct address_space ra->size = max; ra->ahead_start = 0; ra->ahead_size = 0; + ra->average = max / 2; } } ra->prev_page = offset; _