From: Suparna Bhattacharya <suparna@in.ibm.com>




 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-06-16 23:16:43.000000000 -0700
+++ 25-akpm/fs/aio.c	2003-06-16 23:16:43.000000000 -0700
@@ -29,6 +29,7 @@
 #include <linux/highmem.h>
 #include <linux/workqueue.h>
 #include <linux/writeback.h>
+#include <linux/pagemap.h>
 
 #include <asm/kmap_types.h>
 #include <asm/uaccess.h>
@@ -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-06-16 23:16:43.000000000 -0700
+++ 25-akpm/mm/filemap.c	2003-06-16 23:16:43.000000000 -0700
@@ -631,7 +631,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:

_