fs: push i_mutex and filemap_write_and_wait down into ->fsync() handlers
[platform/adaptation/renesas_rcar/renesas_kernel.git] / fs / nilfs2 / file.c
index d7eeca6..2660152 100644 (file)
@@ -27,7 +27,7 @@
 #include "nilfs.h"
 #include "segment.h"
 
-int nilfs_sync_file(struct file *file, int datasync)
+int nilfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
 {
        /*
         * Called from fsync() system call
@@ -40,8 +40,15 @@ int nilfs_sync_file(struct file *file, int datasync)
        struct inode *inode = file->f_mapping->host;
        int err;
 
-       if (!nilfs_inode_dirty(inode))
+       err = filemap_write_and_wait_range(inode->i_mapping, start, end);
+       if (err)
+               return err;
+       mutex_lock(&inode->i_mutex);
+
+       if (!nilfs_inode_dirty(inode)) {
+               mutex_unlock(&inode->i_mutex);
                return 0;
+       }
 
        if (datasync)
                err = nilfs_construct_dsync_segment(inode->i_sb, inode, 0,
@@ -49,6 +56,7 @@ int nilfs_sync_file(struct file *file, int datasync)
        else
                err = nilfs_construct_segment(inode->i_sb);
 
+       mutex_unlock(&inode->i_mutex);
        return err;
 }