xfs: use ranged writeback and invalidation for direct IO
authorDave Chinner <dchinner@redhat.com>
Tue, 2 Sep 2014 02:12:53 +0000 (12:12 +1000)
committerDave Chinner <david@fromorbit.com>
Tue, 2 Sep 2014 02:12:53 +0000 (12:12 +1000)
Now we are not doing silly things with dirtying buffers beyond EOF
and using invalidation correctly, we can finally reduce the ranges of
writeback and invalidation used by direct IO to match that of the IO
being issued.

Bring the writeback and invalidation ranges back to match the
generic direct IO code - this will greatly reduce the perturbation
of cached data when direct IO and buffered IO are mixed, but still
provide the same buffered vs direct IO coherency behaviour we
currently have.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_file.c

index 19917faac2d20dacd20bafb0215b7f9d51881d97..de5368c803f9db192416e21032ade4535a0efcdd 100644 (file)
@@ -291,7 +291,7 @@ xfs_file_read_iter(
                if (inode->i_mapping->nrpages) {
                        ret = filemap_write_and_wait_range(
                                                        VFS_I(ip)->i_mapping,
-                                                       pos, -1);
+                                                       pos, pos + size - 1);
                        if (ret) {
                                xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL);
                                return ret;
@@ -303,7 +303,8 @@ xfs_file_read_iter(
                         * happen on XFS. Warn if it does fail.
                         */
                        ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping,
-                                               pos >> PAGE_CACHE_SHIFT, -1);
+                                       pos >> PAGE_CACHE_SHIFT,
+                                       (pos + size - 1) >> PAGE_CACHE_SHIFT);
                        WARN_ON_ONCE(ret);
                        ret = 0;
                }
@@ -641,7 +642,7 @@ xfs_file_dio_aio_write(
 
        if (mapping->nrpages) {
                ret = filemap_write_and_wait_range(VFS_I(ip)->i_mapping,
-                                                   pos, -1);
+                                                   pos, pos + count - 1);
                if (ret)
                        goto out;
                /*
@@ -650,7 +651,8 @@ xfs_file_dio_aio_write(
                 * happen on XFS. Warn if it does fail.
                 */
                ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping,
-                                               pos >> PAGE_CACHE_SHIFT, -1);
+                                       pos >> PAGE_CACHE_SHIFT,
+                                       (pos + count - 1) >> PAGE_CACHE_SHIFT);
                WARN_ON_ONCE(ret);
                ret = 0;
        }
This page took 0.045368 seconds and 5 git commands to generate.