Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzi...
[firefly-linux-kernel-4.4.55.git] / fs / hfs / inode.c
index fff16c968e67705a4d82e0bfcda6fca54aa005b0..96a1b625fc74de04cd79ef2ba8fc2a2dba0301a1 100644 (file)
@@ -123,8 +123,8 @@ static ssize_t hfs_direct_IO(int rw, struct kiocb *iocb,
        struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host;
        ssize_t ret;
 
-       ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
-                                 offset, nr_segs, hfs_get_block, NULL);
+       ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs,
+                                hfs_get_block);
 
        /*
         * In case of error extending write may have instantiated a few
@@ -615,6 +615,8 @@ int hfs_inode_setattr(struct dentry *dentry, struct iattr * attr)
 
        if ((attr->ia_valid & ATTR_SIZE) &&
            attr->ia_size != i_size_read(inode)) {
+               inode_dio_wait(inode);
+
                error = vmtruncate(inode, attr->ia_size);
                if (error)
                        return error;
@@ -625,12 +627,18 @@ int hfs_inode_setattr(struct dentry *dentry, struct iattr * attr)
        return 0;
 }
 
-static int hfs_file_fsync(struct file *filp, int datasync)
+static int hfs_file_fsync(struct file *filp, loff_t start, loff_t end,
+                         int datasync)
 {
        struct inode *inode = filp->f_mapping->host;
        struct super_block * sb;
        int ret, err;
 
+       ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
+       if (ret)
+               return ret;
+       mutex_lock(&inode->i_mutex);
+
        /* sync the inode to buffers */
        ret = write_inode_now(inode, 0);
 
@@ -647,6 +655,7 @@ static int hfs_file_fsync(struct file *filp, int datasync)
        err = sync_blockdev(sb->s_bdev);
        if (!ret)
                ret = err;
+       mutex_unlock(&inode->i_mutex);
        return ret;
 }