diff options
-rw-r--r-- | fs/btrfs/file.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 0a4b03d8fcd6..d0fc4c5aaf15 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -1544,12 +1544,20 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
1544 | 1544 | ||
1545 | trace_btrfs_sync_file(file, datasync); | 1545 | trace_btrfs_sync_file(file, datasync); |
1546 | 1546 | ||
1547 | /* | ||
1548 | * We write the dirty pages in the range and wait until they complete | ||
1549 | * out of the ->i_mutex. If so, we can flush the dirty pages by | ||
1550 | * multi-task, and make the performance up. | ||
1551 | */ | ||
1552 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); | ||
1553 | if (ret) | ||
1554 | return ret; | ||
1555 | |||
1547 | mutex_lock(&inode->i_mutex); | 1556 | mutex_lock(&inode->i_mutex); |
1548 | 1557 | ||
1549 | /* | 1558 | /* |
1550 | * we wait first, since the writeback may change the inode, also wait | 1559 | * We flush the dirty pages again to avoid some dirty pages in the |
1551 | * ordered range does a filemape_write_and_wait_range which is why we | 1560 | * range being left. |
1552 | * don't do it above like other file systems. | ||
1553 | */ | 1561 | */ |
1554 | atomic_inc(&root->log_batch); | 1562 | atomic_inc(&root->log_batch); |
1555 | btrfs_wait_ordered_range(inode, start, end); | 1563 | btrfs_wait_ordered_range(inode, start, end); |