Merge tag 'fs_for_v6.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack...
[platform/kernel/linux-starfive.git] / fs / ext4 / fsync.c
index 2a14320..0c56f3a 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/sched.h>
 #include <linux/writeback.h>
 #include <linux/blkdev.h>
+#include <linux/buffer_head.h>
 
 #include "ext4.h"
 #include "ext4_jbd2.h"
@@ -78,21 +79,13 @@ static int ext4_sync_parent(struct inode *inode)
        return ret;
 }
 
-static int ext4_fsync_nojournal(struct inode *inode, bool datasync,
-                               bool *needs_barrier)
+static int ext4_fsync_nojournal(struct file *file, loff_t start, loff_t end,
+                               int datasync, bool *needs_barrier)
 {
-       int ret, err;
-
-       ret = sync_mapping_buffers(inode->i_mapping);
-       if (!(inode->i_state & I_DIRTY_ALL))
-               return ret;
-       if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
-               return ret;
-
-       err = sync_inode_metadata(inode, 1);
-       if (!ret)
-               ret = err;
+       struct inode *inode = file->f_inode;
+       int ret;
 
+       ret = generic_buffers_fsync_noflush(file, start, end, datasync);
        if (!ret)
                ret = ext4_sync_parent(inode);
        if (test_opt(inode->i_sb, BARRIER))
@@ -155,6 +148,14 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
                goto out;
        }
 
+       if (!sbi->s_journal) {
+               ret = ext4_fsync_nojournal(file, start, end, datasync,
+                                          &needs_barrier);
+               if (needs_barrier)
+                       goto issue_flush;
+               goto out;
+       }
+
        ret = file_write_and_wait_range(file, start, end);
        if (ret)
                goto out;
@@ -164,11 +165,9 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
         *  Metadata is in the journal, we wait for proper transaction to
         *  commit here.
         */
-       if (!sbi->s_journal)
-               ret = ext4_fsync_nojournal(inode, datasync, &needs_barrier);
-       else
-               ret = ext4_fsync_journal(inode, datasync, &needs_barrier);
+       ret = ext4_fsync_journal(inode, datasync, &needs_barrier);
 
+issue_flush:
        if (needs_barrier) {
                err = blkdev_issue_flush(inode->i_sb->s_bdev);
                if (!ret)