• Miao Xie's avatar
    Btrfs: just do dirty page flush for the inode with compression before direct IO · 41bd9ca4
    Miao Xie authored
    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: default avatarMiao Xie <miaox@cn.fujitsu.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    41bd9ca4
inode.c 237 KB