trace_btrfs_sync_file(file, datasync);
 
+       /*
+        * We write the dirty pages in the range and wait until they complete
+        * out of the ->i_mutex. If so, we can flush the dirty pages by
+        * multi-task, and make the performance up.
+        */
+       ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
+       if (ret)
+               return ret;
+
        mutex_lock(&inode->i_mutex);
 
        /*
-        * we wait first, since the writeback may change the inode, also wait
-        * ordered range does a filemape_write_and_wait_range which is why we
-        * don't do it above like other file systems.
+        * We flush the dirty pages again to avoid some dirty pages in the
+        * range being left.
         */
        atomic_inc(&root->log_batch);
        btrfs_wait_ordered_range(inode, start, end);