aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--fs/9p/vfs_inode.c16
-rw-r--r--fs/9p/vfs_inode_dotl.c12
2 files changed, 15 insertions, 13 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);
diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c
index 327c578c7ba6..0a0ac30d51d6 100644
--- a/fs/9p/vfs_inode_dotl.c
+++ b/fs/9p/vfs_inode_dotl.c
@@ -456,12 +456,6 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr)
456 if (IS_ERR(fid)) 456 if (IS_ERR(fid))
457 return PTR_ERR(fid); 457 return PTR_ERR(fid);
458 458
459 if ((iattr->ia_valid & ATTR_SIZE) &&
460 iattr->ia_size != i_size_read(dentry->d_inode)) {
461 retval = vmtruncate(dentry->d_inode, iattr->ia_size);
462 if (retval)
463 return retval;
464 }
465 /* Write all dirty data */ 459 /* Write all dirty data */
466 if (S_ISREG(dentry->d_inode->i_mode)) 460 if (S_ISREG(dentry->d_inode->i_mode))
467 filemap_write_and_wait(dentry->d_inode->i_mapping); 461 filemap_write_and_wait(dentry->d_inode->i_mapping);
@@ -469,8 +463,12 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr)
469 retval = p9_client_setattr(fid, &p9attr); 463 retval = p9_client_setattr(fid, &p9attr);
470 if (retval < 0) 464 if (retval < 0)
471 return retval; 465 return retval;
472 v9fs_invalidate_inode_attr(dentry->d_inode);
473 466
467 if ((iattr->ia_valid & ATTR_SIZE) &&
468 iattr->ia_size != i_size_read(dentry->d_inode))
469 truncate_setsize(dentry->d_inode, iattr->ia_size);
470
471 v9fs_invalidate_inode_attr(dentry->d_inode);
474 setattr_copy(dentry->d_inode, iattr); 472 setattr_copy(dentry->d_inode, iattr);
475 mark_inode_dirty(dentry->d_inode); 473 mark_inode_dirty(dentry->d_inode);
476 if (iattr->ia_valid & ATTR_MODE) { 474 if (iattr->ia_valid & ATTR_MODE) {