diff options
-rw-r--r-- | fs/btrfs/file.c | 12 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 16 |
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 | ||