--- 25-akpm/mm/filemap.c | 9 ++++++--- mm/readahead.c | 0 2 files changed, 6 insertions(+), 3 deletions(-) diff -puN mm/readahead.c~readahead-private mm/readahead.c diff -puN mm/filemap.c~readahead-private mm/filemap.c --- 25/mm/filemap.c~readahead-private 2004-05-04 20:56:02.520117240 -0700 +++ 25-akpm/mm/filemap.c 2004-05-04 20:56:02.524116632 -0700 @@ -608,7 +608,7 @@ EXPORT_SYMBOL(grab_cache_page_nowait); * - note the struct file * is only passed for the use of readpage */ void do_generic_mapping_read(struct address_space *mapping, - struct file_ra_state *ra, + struct file_ra_state *_ra, struct file * filp, loff_t *ppos, read_descriptor_t * desc, @@ -618,6 +618,7 @@ void do_generic_mapping_read(struct addr unsigned long index, offset; struct page *cached_page; int error; + struct file_ra_state ra = *_ra; cached_page = NULL; index = *ppos >> PAGE_CACHE_SHIFT; @@ -640,13 +641,13 @@ void do_generic_mapping_read(struct addr } cond_resched(); - page_cache_readahead(mapping, ra, filp, index); + page_cache_readahead(mapping, &ra, filp, index); nr = nr - offset; find_page: page = find_get_page(mapping, index); if (unlikely(page == NULL)) { - handle_ra_miss(mapping, ra, index); + handle_ra_miss(mapping, &ra, index); goto no_cached_page; } if (!PageUptodate(page)) @@ -748,6 +749,8 @@ no_cached_page: goto readpage; } + *_ra = ra; + *ppos = ((loff_t) index << PAGE_CACHE_SHIFT) + offset; if (cached_page) page_cache_release(cached_page); _