aboutsummaryrefslogtreecommitdiffstats
path: root/fs/9p/vfs_inode.c
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>2011-03-08 06:09:48 -0500
committerEric Van Hensbergen <ericvh@gmail.com>2011-03-22 16:43:35 -0400
commit059c138bc79320bd7d6fba91bad4d50eeec9c31f (patch)
tree0ec60c1a30863ff20029043b14909d02aadc696e /fs/9p/vfs_inode.c
parent472e7f9f8b547605ee9670ac803e971c2e3eeac0 (diff)
fs/9p: Use truncate_setsize instead of vmtruncate
convert vmtruncate usage to truncate_setsize. We also writeback all dirty pages before doing 9p operations and on success call truncate_setsize. This ensure that we continue sanely on failed truncate on the server. The disadvantage is that we are now going to write back the content that get thrown away later as a part of truncate. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Diffstat (limited to 'fs/9p/vfs_inode.c')
-rw-r--r--fs/9p/vfs_inode.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index c6cef2495f00..0afbbb450faf 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -971,6 +971,10 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
971 struct p9_wstat wstat; 971 struct p9_wstat wstat;
972 972
973 P9_DPRINTK(P9_DEBUG_VFS, "\n"); 973 P9_DPRINTK(P9_DEBUG_VFS, "\n");
974 retval = inode_change_ok(dentry->d_inode, iattr);
975 if (retval)
976 return retval;
977
974 retval = -EPERM; 978 retval = -EPERM;
975 v9ses = v9fs_inode2v9ses(dentry->d_inode); 979 v9ses = v9fs_inode2v9ses(dentry->d_inode);
976 fid = v9fs_fid_lookup(dentry); 980 fid = v9fs_fid_lookup(dentry);
@@ -997,12 +1001,7 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
997 if (iattr->ia_valid & ATTR_GID) 1001 if (iattr->ia_valid & ATTR_GID)
998 wstat.n_gid = iattr->ia_gid; 1002 wstat.n_gid = iattr->ia_gid;
999 } 1003 }
1000 if ((iattr->ia_valid & ATTR_SIZE) && 1004
1001 iattr->ia_size != i_size_read(dentry->d_inode)) {
1002 retval = vmtruncate(dentry->d_inode, iattr->ia_size);
1003 if (retval)
1004 return retval;
1005 }
1006 /* Write all dirty data */ 1005 /* Write all dirty data */
1007 if (S_ISREG(dentry->d_inode->i_mode)) 1006 if (S_ISREG(dentry->d_inode->i_mode))
1008 filemap_write_and_wait(dentry->d_inode->i_mapping); 1007 filemap_write_and_wait(dentry->d_inode->i_mapping);
@@ -1010,6 +1009,11 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
1010 retval = p9_client_wstat(fid, &wstat); 1009 retval = p9_client_wstat(fid, &wstat);
1011 if (retval < 0) 1010 if (retval < 0)
1012 return retval; 1011 return retval;
1012
1013 if ((iattr->ia_valid & ATTR_SIZE) &&
1014 iattr->ia_size != i_size_read(dentry->d_inode))
1015 truncate_setsize(dentry->d_inode, iattr->ia_size);
1016
1013 v9fs_invalidate_inode_attr(dentry->d_inode); 1017 v9fs_invalidate_inode_attr(dentry->d_inode);
1014 1018
1015 setattr_copy(dentry->d_inode, iattr); 1019 setattr_copy(dentry->d_inode, iattr);