aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2013-10-28 15:03:41 -0400
committerChris Mason <chris.mason@fusionio.com>2013-11-11 22:08:22 -0500
commit9f23e289edaf1e99f60de3978c50a1c7424f3e92 (patch)
tree4adebd01673babcff82aa9c99ced49d9b0a709ca /fs
parent93858769172c4e3678917810e9d5de360eb991cc (diff)
Btrfs: make sure the delalloc workers actually flush compressed writes
When using delalloc workers in a non-waiting way (like for enospc handling) we can end up not actually waiting for the dirty pages to be started if we have compression. We need to add an extra filemap flush to make sure any async extents that have started are actually moved along before returning. Thanks, Signed-off-by: Josef Bacik <jbacik@fusionio.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/inode.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 5916ad8681cd..c84adde53023 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8163,18 +8163,24 @@ out_notrans:
8163static void btrfs_run_delalloc_work(struct btrfs_work *work) 8163static void btrfs_run_delalloc_work(struct btrfs_work *work)
8164{ 8164{
8165 struct btrfs_delalloc_work *delalloc_work; 8165 struct btrfs_delalloc_work *delalloc_work;
8166 struct inode *inode;
8166 8167
8167 delalloc_work = container_of(work, struct btrfs_delalloc_work, 8168 delalloc_work = container_of(work, struct btrfs_delalloc_work,
8168 work); 8169 work);
8169 if (delalloc_work->wait) 8170 inode = delalloc_work->inode;
8170 btrfs_wait_ordered_range(delalloc_work->inode, 0, (u64)-1); 8171 if (delalloc_work->wait) {
8171 else 8172 btrfs_wait_ordered_range(inode, 0, (u64)-1);
8172 filemap_flush(delalloc_work->inode->i_mapping); 8173 } else {
8174 filemap_flush(inode->i_mapping);
8175 if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT,
8176 &BTRFS_I(inode)->runtime_flags))
8177 filemap_flush(inode->i_mapping);
8178 }
8173 8179
8174 if (delalloc_work->delay_iput) 8180 if (delalloc_work->delay_iput)
8175 btrfs_add_delayed_iput(delalloc_work->inode); 8181 btrfs_add_delayed_iput(inode);
8176 else 8182 else
8177 iput(delalloc_work->inode); 8183 iput(inode);
8178 complete(&delalloc_work->completion); 8184 complete(&delalloc_work->completion);
8179} 8185}
8180 8186