aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 4516fbf0167..404704d2682 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -3440,13 +3440,24 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root)
3440 list_del_init(&binode->delalloc_inodes); 3440 list_del_init(&binode->delalloc_inodes);
3441 spin_unlock_irqrestore(&root->fs_info->delalloc_lock, flags); 3441 spin_unlock_irqrestore(&root->fs_info->delalloc_lock, flags);
3442 if (inode) { 3442 if (inode) {
3443 filemap_write_and_wait(inode->i_mapping); 3443 filemap_flush(inode->i_mapping);
3444 iput(inode); 3444 iput(inode);
3445 } 3445 }
3446 cond_resched(); 3446 cond_resched();
3447 spin_lock_irqsave(&root->fs_info->delalloc_lock, flags); 3447 spin_lock_irqsave(&root->fs_info->delalloc_lock, flags);
3448 } 3448 }
3449 spin_unlock_irqrestore(&root->fs_info->delalloc_lock, flags); 3449 spin_unlock_irqrestore(&root->fs_info->delalloc_lock, flags);
3450
3451 /* the filemap_flush will queue IO into the worker threads, but
3452 * we have to make sure the IO is actually started and that
3453 * ordered extents get created before we return
3454 */
3455 atomic_inc(&root->fs_info->async_submit_draining);
3456 while(atomic_read(&root->fs_info->nr_async_submits)) {
3457 wait_event(root->fs_info->async_submit_wait,
3458 (atomic_read(&root->fs_info->nr_async_submits) == 0));
3459 }
3460 atomic_dec(&root->fs_info->async_submit_draining);
3450 return 0; 3461 return 0;
3451} 3462}
3452 3463