]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - fs/jfs/file.c
fs: push i_mutex and filemap_write_and_wait down into ->fsync() handlers
[mirror_ubuntu-bionic-kernel.git] / fs / jfs / file.c
index 9f32315acef1584877e40d9bbbf59645dcbba6ac..7527855b5cc6fc71ec5b613fbf022bd725843f20 100644 (file)
 #include "jfs_acl.h"
 #include "jfs_debug.h"
 
-int jfs_fsync(struct file *file, int datasync)
+int jfs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
 {
        struct inode *inode = file->f_mapping->host;
        int rc = 0;
 
+       rc = filemap_write_and_wait_range(inode->i_mapping, start, end);
+       if (rc)
+               return rc;
+
+       mutex_lock(&inode->i_mutex);
        if (!(inode->i_state & I_DIRTY) ||
            (datasync && !(inode->i_state & I_DIRTY_DATASYNC))) {
                /* Make sure committed changes hit the disk */
                jfs_flush_journal(JFS_SBI(inode->i_sb)->log, 1);
+               mutex_unlock(&inode->i_mutex);
                return rc;
        }
 
        rc |= jfs_commit_inode(inode, 1);
+       mutex_unlock(&inode->i_mutex);
 
        return rc ? -EIO : 0;
 }