From: Suparna Bhattacharya fs/aio.c | 14 +++++++++++++- mm/filemap.c | 3 ++- 2 files changed, 15 insertions(+), 2 deletions(-) diff -puN fs/aio.c~aio-12-readahead fs/aio.c --- 25/fs/aio.c~aio-12-readahead 2003-08-20 23:30:28.000000000 -0700 +++ 25-akpm/fs/aio.c 2003-08-20 23:30:28.000000000 -0700 @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -1351,8 +1352,19 @@ ssize_t aio_setup_iocb(struct kiocb *kio kiocb->ki_left))) break; ret = -EINVAL; - if (file->f_op->aio_read) + if (file->f_op->aio_read) { + struct address_space *mapping = + file->f_dentry->d_inode->i_mapping; + unsigned long index = kiocb->ki_pos >> PAGE_CACHE_SHIFT; + unsigned long end = (kiocb->ki_pos + kiocb->ki_left) + >> PAGE_CACHE_SHIFT; + + for (; index < end; index++) { + page_cache_readahead(mapping, &file->f_ra, + file, index); + } kiocb->ki_retry = aio_pread; + } break; case IOCB_CMD_PWRITE: ret = -EBADF; diff -puN mm/filemap.c~aio-12-readahead mm/filemap.c --- 25/mm/filemap.c~aio-12-readahead 2003-08-20 23:30:28.000000000 -0700 +++ 25-akpm/mm/filemap.c 2003-08-20 23:30:28.000000000 -0700 @@ -648,7 +648,8 @@ void do_generic_mapping_read(struct addr } cond_resched(); - page_cache_readahead(mapping, ra, filp, index); + if (is_sync_wait(current->io_wait)) + page_cache_readahead(mapping, ra, filp, index); nr = nr - offset; find_page: _