]> git.baikalelectronics.ru Git - kernel.git/commit
Btrfs: call filemap_fdatawrite twice for compression
authorJosef Bacik <josef@redhat.com>
Fri, 8 Jun 2012 19:26:47 +0000 (15:26 -0400)
committerChris Mason <chris.mason@oracle.com>
Fri, 15 Jun 2012 01:30:54 +0000 (21:30 -0400)
commitdd2673b01f5fc15c0fe23bf48b29f859589eaf91
tree3b6a46eec858b867db9184d0e8beefe4ed01e9ec
parent4f21d5661bc119daded1b7de18a0398e0afc1322
Btrfs: call filemap_fdatawrite twice for compression

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: Josef Bacik <josef@redhat.com>
fs/btrfs/btrfs_inode.h
fs/btrfs/inode.c
fs/btrfs/ordered-data.c