From: Oleg Nesterov get_next_ra_size() can get all info from file_ra_state. Signed-off-by: Oleg Nesterov Signed-off-by: Andrew Morton --- 25-akpm/mm/readahead.c | 24 +++++++++++------------- 1 files changed, 11 insertions(+), 13 deletions(-) diff -puN mm/readahead.c~readahead-cleanup-get_next_ra_size mm/readahead.c --- 25/mm/readahead.c~readahead-cleanup-get_next_ra_size 2005-02-24 21:01:40.000000000 -0800 +++ 25-akpm/mm/readahead.c 2005-02-24 21:01:40.000000000 -0800 @@ -85,14 +85,16 @@ static unsigned long get_init_ra_size(un * not for each call to readahead. If a cache miss occured, reduce next I/O * size, else increase depending on how close to max we are. */ -static unsigned long get_next_ra_size(unsigned long cur, unsigned long max, - unsigned long min, unsigned long * flags) +static unsigned long get_next_ra_size(struct file_ra_state *ra) { + unsigned long max = get_max_readahead(ra); + unsigned long min = get_min_readahead(ra); + unsigned long cur = ra->size; unsigned long newsize; - if (*flags & RA_FLAG_MISS) { + if (ra->flags & RA_FLAG_MISS) { + ra->flags &= ~RA_FLAG_MISS; newsize = max((cur - 2), min); - *flags &= ~RA_FLAG_MISS; } else if (cur < max / 16) { newsize = 4 * cur; } else { @@ -413,7 +415,7 @@ page_cache_readahead(struct address_spac struct file *filp, unsigned long offset, unsigned long req_size) { - unsigned long max, min; + unsigned long max; unsigned long newsize = req_size; unsigned long block; @@ -427,7 +429,6 @@ page_cache_readahead(struct address_spac goto out; max = get_max_readahead(ra); - min = get_min_readahead(ra); newsize = min(req_size, max); if (newsize == 0 || (ra->flags & RA_FLAG_INCACHE)) { @@ -457,8 +458,7 @@ page_cache_readahead(struct address_spac * immediately. */ if (req_size >= max) { - ra->ahead_size = get_next_ra_size(ra->size, max, min, - &ra->flags); + ra->ahead_size = get_next_ra_size(ra); ra->ahead_start = ra->start + ra->size; blockable_page_cache_readahead(mapping, filp, ra->ahead_start, ra->ahead_size, ra, 1); @@ -484,8 +484,7 @@ page_cache_readahead(struct address_spac */ if (ra->ahead_start == 0) { /* no ahead window yet */ - ra->ahead_size = get_next_ra_size(ra->size, max, min, - &ra->flags); + ra->ahead_size = get_next_ra_size(ra); ra->ahead_start = ra->start + ra->size; block = ((offset + newsize -1) >= ra->ahead_start); if (!blockable_page_cache_readahead(mapping, filp, @@ -517,9 +516,8 @@ page_cache_readahead(struct address_spac if ((offset + newsize - 1) >= ra->ahead_start) { ra->start = ra->ahead_start; ra->size = ra->ahead_size; - ra->ahead_start = ra->ahead_start + ra->ahead_size; - ra->ahead_size = get_next_ra_size(ra->ahead_size, - max, min, &ra->flags); + ra->ahead_start = ra->start + ra->size; + ra->ahead_size = get_next_ra_size(ra); block = ((offset + newsize - 1) >= ra->ahead_start); if (!blockable_page_cache_readahead(mapping, filp, ra->ahead_start, ra->ahead_size, ra, block)) { _