From: Hans Reiser This patch recovers reiser4 read performance which was caused by incorrect using page_cache_readahead Signed-off-by: Andrew Morton --- 25-akpm/fs/reiser4/plugin/file/file.c | 2 +- 25-akpm/fs/reiser4/plugin/item/extent_file_ops.c | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff -puN fs/reiser4/plugin/file/file.c~reiser4-recover-read-performance fs/reiser4/plugin/file/file.c --- 25/fs/reiser4/plugin/file/file.c~reiser4-recover-read-performance 2004-12-31 01:11:08.803229464 -0800 +++ 25-akpm/fs/reiser4/plugin/file/file.c 2004-12-31 01:11:08.810228400 -0800 @@ -2929,7 +2929,7 @@ reiser4_internal ssize_t sendfile_common index = *ppos >> PAGE_CACHE_SHIFT; offset = *ppos & ~PAGE_CACHE_MASK; - page_cache_readahead(inode->i_mapping, &file->f_ra, file, offset, 0); + page_cache_readahead(inode->i_mapping, &file->f_ra, file, offset, (file_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT); /* determine valid read request size. */ read_request_size = PAGE_CACHE_SIZE - offset; diff -puN fs/reiser4/plugin/item/extent_file_ops.c~reiser4-recover-read-performance fs/reiser4/plugin/item/extent_file_ops.c --- 25/fs/reiser4/plugin/item/extent_file_ops.c~reiser4-recover-read-performance 2004-12-31 01:11:08.805229160 -0800 +++ 25-akpm/fs/reiser4/plugin/item/extent_file_ops.c 2004-12-31 01:11:08.811228248 -0800 @@ -1124,7 +1124,7 @@ read_readpages(struct address_space *map static void call_page_cache_readahead(struct address_space *mapping, struct file *file, unsigned long page_nr, - const uf_coord_t *uf_coord) + const uf_coord_t *uf_coord, unsigned long ra_pages) { reiser4_file_fsdata *fsdata; uf_coord_t ra_coord; @@ -1135,7 +1135,7 @@ call_page_cache_readahead(struct address fsdata->ra2.data = &ra_coord; fsdata->ra2.readpages = read_readpages; - page_cache_readahead(mapping, &file->f_ra, file, page_nr, 0); + page_cache_readahead(mapping, &file->f_ra, file, page_nr, ra_pages); fsdata->ra2.readpages = NULL; } @@ -1171,6 +1171,7 @@ read_extent(struct file *file, flow_t *f uf_coord_t *uf_coord; coord_t *coord; extent_coord_extension_t *ext_coord; + unsigned long ra_pages; uf_coord = &hint->coord; assert("vs-1318", coord_extension_is_ok(uf_coord)); @@ -1198,9 +1199,10 @@ read_extent(struct file *file, flow_t *f page_off = (unsigned long)(file_off & (PAGE_CACHE_SIZE - 1)); count = PAGE_CACHE_SIZE - page_off; + ra_pages = (flow->length + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; do { - call_page_cache_readahead(inode->i_mapping, file, page_nr, uf_coord); + call_page_cache_readahead(inode->i_mapping, file, page_nr, uf_coord, ra_pages); /* this will return page if it exists and is uptodate, otherwise it will allocate page and call extent_readpage to fill it */ _