diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 4516fbf01671..404704d26822 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 | ||