aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/file.c14
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);