From: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> Port of "41bd9ca459a0 Btrfs: just do dirty page flush for the inode with compression before direct IO" Signed-off-by: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> --- fs/btrfs/inode.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 8e55b0d343bd..6654370168ff 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -7726,6 +7726,17 @@ static int direct_iomap_begin(struct inode *inode, loff_t start, lockstart = start; lockend = start + len - 1; + /* + * The generic stuff only does filemap_write_and_wait_range, which + * isn't enough if we've written compressed pages to this area, so + * we need to flush the dirty pages again to make absolutely sure + * that any outstanding dirty pages are on disk. + */ + if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT, + &BTRFS_I(inode)->runtime_flags)) + filemap_fdatawrite_range(inode->i_mapping, lockstart, lockend); + + if (current->journal_info) { /* * Need to pull our outstanding extents and set journal_info to NULL so -- 2.16.4