---

 fs/direct-io.c          |    5 ++++-
 fs/inode.c              |    0 
 fs/open.c               |    0 
 fs/xfs/linux/xfs_aops.c |    0 
 include/linux/fs.h      |    0 
 mm/filemap.c            |    0 
 6 files changed, 4 insertions(+), 1 deletion(-)

diff -puN fs/direct-io.c~O_DIRECT-race-fixes-rollup-use-f_mapping fs/direct-io.c
--- 25/fs/direct-io.c~O_DIRECT-race-fixes-rollup-use-f_mapping	2004-01-30 00:43:19.000000000 -0800
+++ 25-akpm/fs/direct-io.c	2004-01-30 00:47:00.000000000 -0800
@@ -1076,8 +1076,11 @@ __blockdev_direct_IO(int rw, struct kioc
 	if (S_ISREG(inode->i_mode) && needs_special_locking) {
 		needs_locking = 1;
 		if (rw == READ) {
+			struct address_space *mapping;
+
+			mapping = iocb->ki_filp->f_mapping;
 			down(&inode->i_sem);
-			retval = filemap_write_and_wait(inode->i_mapping);
+			retval = filemap_write_and_wait(mapping);
 			if (retval) {
 				up(&inode->i_sem);
 				kfree(dio);
diff -puN fs/inode.c~O_DIRECT-race-fixes-rollup-use-f_mapping fs/inode.c
diff -puN fs/open.c~O_DIRECT-race-fixes-rollup-use-f_mapping fs/open.c
diff -puN include/linux/fs.h~O_DIRECT-race-fixes-rollup-use-f_mapping include/linux/fs.h
diff -puN mm/filemap.c~O_DIRECT-race-fixes-rollup-use-f_mapping mm/filemap.c
diff -puN fs/xfs/linux/xfs_aops.c~O_DIRECT-race-fixes-rollup-use-f_mapping fs/xfs/linux/xfs_aops.c

_