Hack - close direct-io read vs mmap page fault race so that
we get exclusion between direct I/O and mmap "buffered write"
path.

Not-Signed-off-by: Dave Chinner <dgc@sgi.com>
---
 fs/xfs/linux-2.6/xfs_file.c |   19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

Index: 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_file.c
===================================================================
--- 2.6.x-xfs-new.orig/fs/xfs/linux-2.6/xfs_file.c	2008-05-09 11:57:29.000000000 +1000
+++ 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_file.c	2008-05-21 12:54:22.782809446 +1000
@@ -495,7 +495,24 @@ xfs_vm_page_mkwrite(
 	struct vm_area_struct	*vma,
 	struct page		*page)
 {
-	return block_page_mkwrite(vma, page, xfs_get_blocks);
+	struct inode	*inode = vma->vm_file->f_path.dentry->d_inode;
+	xfs_inode_t	*ip;
+	loff_t		size;
+	int		ret = -EINVAL;
+
+	lock_page(page);
+	size = i_size_read(inode);
+	if ((page->mapping != inode->i_mapping) ||
+	    (page_offset(page) > size)) {
+		unlock_page(page);
+		return ret;
+	}
+	ip = XFS_I(inode);
+	unlock_page(page);
+	xfs_ilock(ip, XFS_IOLOCK_EXCL);
+	ret = block_page_mkwrite(vma, page, xfs_get_blocks);
+	xfs_iunlock(ip, XFS_IOLOCK_EXCL);
+	return ret;
 }
 
 const struct file_operations xfs_file_operations = {
