• Josef Bacik's avatar
    Btrfs: call filemap_fdatawrite twice for compression · 7ddf5a42
    Josef Bacik authored
    I removed this in an earlier commit and I was wrong.  Because compression
    can return from filemap_fdatawrite() without having actually set any of it's
    pages as writeback() it can make filemap_fdatawait() do essentially nothing,
    and then we won't find any ordered extents because they may not have been
    created yet.  So not only does this make fsync() completely useless, but it
    will also screw up if you truncate on a non-page aligned offset since we
    zero out the end and then wait on ordered extents and then call drop caches.
    We can drop the cache before the io completes and then we try to unpin the
    extent we just wrote we won't find it and everything goes sideways.  So fix
    this by putting it back and put a giant comment there to keep me from trying
    to remove it in the future.  Thanks,
    Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
    7ddf5a42
inode.c 203 KB