fs/9p: Use truncate_setsize instead of vmtruncate
[deliverable/linux.git] / fs / 9p / vfs_inode.c
index 8a2c232f708a022d44d72522544697d84233aa08..0afbbb450faf8a9892b4cc88e484df4296c0ff9c 100644 (file)
@@ -221,6 +221,7 @@ struct inode *v9fs_alloc_inode(struct super_block *sb)
 #endif
        v9inode->writeback_fid = NULL;
        v9inode->cache_validity = 0;
+       mutex_init(&v9inode->v_mutex);
        return &v9inode->vfs_inode;
 }
 
@@ -650,6 +651,7 @@ v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode,
        /* if we are opening a file, assign the open fid to the file */
        if (nd && nd->flags & LOOKUP_OPEN) {
                v9inode = V9FS_I(dentry->d_inode);
+               mutex_lock(&v9inode->v_mutex);
                if (v9ses->cache && !v9inode->writeback_fid) {
                        /*
                         * clone a fid and add it to writeback_fid
@@ -661,10 +663,12 @@ v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode,
                        inode_fid = v9fs_writeback_fid(dentry);
                        if (IS_ERR(inode_fid)) {
                                err = PTR_ERR(inode_fid);
+                               mutex_unlock(&v9inode->v_mutex);
                                goto error;
                        }
                        v9inode->writeback_fid = (void *) inode_fid;
                }
+               mutex_unlock(&v9inode->v_mutex);
                filp = lookup_instantiate_filp(nd, dentry, generic_file_open);
                if (IS_ERR(filp)) {
                        err = PTR_ERR(filp);
@@ -967,6 +971,10 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
        struct p9_wstat wstat;
 
        P9_DPRINTK(P9_DEBUG_VFS, "\n");
+       retval = inode_change_ok(dentry->d_inode, iattr);
+       if (retval)
+               return retval;
+
        retval = -EPERM;
        v9ses = v9fs_inode2v9ses(dentry->d_inode);
        fid = v9fs_fid_lookup(dentry);
@@ -993,12 +1001,7 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
                if (iattr->ia_valid & ATTR_GID)
                        wstat.n_gid = iattr->ia_gid;
        }
-       if ((iattr->ia_valid & ATTR_SIZE) &&
-           iattr->ia_size != i_size_read(dentry->d_inode)) {
-               retval = vmtruncate(dentry->d_inode, iattr->ia_size);
-               if (retval)
-                       return retval;
-       }
+
        /* Write all dirty data */
        if (S_ISREG(dentry->d_inode->i_mode))
                filemap_write_and_wait(dentry->d_inode->i_mapping);
@@ -1006,6 +1009,11 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
        retval = p9_client_wstat(fid, &wstat);
        if (retval < 0)
                return retval;
+
+       if ((iattr->ia_valid & ATTR_SIZE) &&
+           iattr->ia_size != i_size_read(dentry->d_inode))
+               truncate_setsize(dentry->d_inode, iattr->ia_size);
+
        v9fs_invalidate_inode_attr(dentry->d_inode);
 
        setattr_copy(dentry->d_inode, iattr);
This page took 0.026252 seconds and 5 git commands to generate.