aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorMiao Xie <miaox@cn.fujitsu.com>2014-03-06 00:54:57 -0500
committerJosef Bacik <jbacik@fb.com>2014-03-10 15:17:24 -0400
commit41bd9ca459a007cc5588563bb08de9677c8d23fd (patch)
tree4721ab45d20f2e4baa7092ff96241c5aa94b1434 /fs
parentaf7a65097b3f0a63caf1755df78d04e1a33588ef (diff)
Btrfs: just do dirty page flush for the inode with compression before direct IO
As the comment in the btrfs_direct_IO says, only the compressed pages need be flush again to make sure they are on the disk, but the common pages needn't, so we add a if statement to check if the inode has compressed pages or not, if no, skip the flush. And in order to prevent the write ranges from intersecting, we need wait for the running ordered extents. But the current code waits for them twice, one is done before the direct IO starts (in btrfs_wait_ordered_range()), the other is before we get the blocks, it is unnecessary. because we can do the direct IO without holding i_mutex, it means that the intersected ordered extents may happen during the direct IO, the first wait can not avoid this problem. So we use filemap_fdatawrite_range() instead of btrfs_wait_ordered_range() to remove the first wait. Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Josef Bacik <jbacik@fb.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/inode.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 53697a80b849..f5e623371bf3 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -7422,15 +7422,15 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
7422 smp_mb__after_atomic_inc(); 7422 smp_mb__after_atomic_inc();
7423 7423
7424 /* 7424 /*
7425 * The generic stuff only does filemap_write_and_wait_range, which isn't 7425 * The generic stuff only does filemap_write_and_wait_range, which
7426 * enough if we've written compressed pages to this area, so we need to 7426 * isn't enough if we've written compressed pages to this area, so
7427 * call btrfs_wait_ordered_range to make absolutely sure that any 7427 * we need to flush the dirty pages again to make absolutely sure
7428 * outstanding dirty pages are on disk. 7428 * that any outstanding dirty pages are on disk.
7429 */ 7429 */
7430 count = iov_length(iov, nr_segs); 7430 count = iov_length(iov, nr_segs);
7431 ret = btrfs_wait_ordered_range(inode, offset, count); 7431 if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT,
7432 if (ret) 7432 &BTRFS_I(inode)->runtime_flags))
7433 return ret; 7433 filemap_fdatawrite_range(inode->i_mapping, offset, count);
7434 7434
7435 if (rw & WRITE) { 7435 if (rw & WRITE) {
7436 /* 7436 /*