Merge branch 'next/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/linux...
[firefly-linux-kernel-4.4.55.git] / fs / fat / file.c
index 7018e1d8902dee6c4b38f7247a38e9315cba27f5..c118acf16e4310530e39abf115fd003813cdea03 100644 (file)
@@ -149,12 +149,12 @@ static int fat_file_release(struct inode *inode, struct file *filp)
        return 0;
 }
 
-int fat_file_fsync(struct file *filp, int datasync)
+int fat_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
 {
        struct inode *inode = filp->f_mapping->host;
        int res, err;
 
-       res = generic_file_fsync(filp, datasync);
+       res = generic_file_fsync(filp, start, end, datasync);
        err = sync_mapping_buffers(MSDOS_SB(inode->i_sb)->fat_inode->i_mapping);
 
        return res ? res : err;
@@ -397,6 +397,8 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr)
         * sequence.
         */
        if (attr->ia_valid & ATTR_SIZE) {
+               inode_dio_wait(inode);
+
                if (attr->ia_size > inode->i_size) {
                        error = fat_cont_expand(inode, attr->ia_size);
                        if (error || attr->ia_valid == ATTR_SIZE)
@@ -429,8 +431,10 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr)
        }
 
        if (attr->ia_valid & ATTR_SIZE) {
+               down_write(&MSDOS_I(inode)->truncate_lock);
                truncate_setsize(inode, attr->ia_size);
                fat_truncate_blocks(inode, attr->ia_size);
+               up_write(&MSDOS_I(inode)->truncate_lock);
        }
 
        setattr_copy(inode, attr);