aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/file.c12
-rw-r--r--fs/btrfs/inode.c16
2 files changed, 24 insertions, 4 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index a18ceabd99a8..f5a868ab60f3 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1692,8 +1692,18 @@ static ssize_t __btrfs_direct_write(struct kiocb *iocb,
1692 err = written_buffered; 1692 err = written_buffered;
1693 goto out; 1693 goto out;
1694 } 1694 }
1695 /*
1696 * Ensure all data is persisted. We want the next direct IO read to be
1697 * able to read what was just written.
1698 */
1695 endbyte = pos + written_buffered - 1; 1699 endbyte = pos + written_buffered - 1;
1696 err = filemap_write_and_wait_range(file->f_mapping, pos, endbyte); 1700 err = filemap_fdatawrite_range(file->f_mapping, pos, endbyte);
1701 if (!err && test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT,
1702 &BTRFS_I(file_inode(file))->runtime_flags))
1703 err = filemap_fdatawrite_range(file->f_mapping, pos, endbyte);
1704 if (err)
1705 goto out;
1706 err = filemap_fdatawait_range(file->f_mapping, pos, endbyte);
1697 if (err) 1707 if (err)
1698 goto out; 1708 goto out;
1699 written += written_buffered; 1709 written += written_buffered;
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 5a8a749b7e6b..01d223e22bb1 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -7015,9 +7015,19 @@ static int lock_extent_direct(struct inode *inode, u64 lockstart, u64 lockend,
7015 btrfs_put_ordered_extent(ordered); 7015 btrfs_put_ordered_extent(ordered);
7016 } else { 7016 } else {
7017 /* Screw you mmap */ 7017 /* Screw you mmap */
7018 ret = filemap_write_and_wait_range(inode->i_mapping, 7018 ret = filemap_fdatawrite_range(inode->i_mapping,
7019 lockstart, 7019 lockstart,
7020 lockend); 7020 lockend);
7021 if (!ret && test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT,
7022 &BTRFS_I(inode)->runtime_flags))
7023 ret = filemap_fdatawrite_range(inode->i_mapping,
7024 lockstart,
7025 lockend);
7026 if (ret)
7027 break;
7028 ret = filemap_fdatawait_range(inode->i_mapping,
7029 lockstart,
7030 lockend);
7021 if (ret) 7031 if (ret)
7022 break; 7032 break;
7023 7033