fs/9p: call vmtruncate before setattr 9p opeation
We need to call vmtruncate before 9p setattr operation, otherwise we could write back some dirty pages between setattr with ATTR_SIZE and vmtruncate causing some truncated pages to be written back to server 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>
This commit is contained in:
parent
c06c066a08
commit
f10fc50f1a
2 changed files with 8 additions and 11 deletions
|
@ -993,18 +993,16 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
|
|||
if (iattr->ia_valid & ATTR_GID)
|
||||
wstat.n_gid = iattr->ia_gid;
|
||||
}
|
||||
|
||||
retval = p9_client_wstat(fid, &wstat);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
|
||||
v9fs_invalidate_inode_attr(dentry->d_inode);
|
||||
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;
|
||||
}
|
||||
retval = p9_client_wstat(fid, &wstat);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
v9fs_invalidate_inode_attr(dentry->d_inode);
|
||||
|
||||
setattr_copy(dentry->d_inode, iattr);
|
||||
mark_inode_dirty(dentry->d_inode);
|
||||
|
|
|
@ -453,17 +453,16 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr)
|
|||
if (IS_ERR(fid))
|
||||
return PTR_ERR(fid);
|
||||
|
||||
retval = p9_client_setattr(fid, &p9attr);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
|
||||
v9fs_invalidate_inode_attr(dentry->d_inode);
|
||||
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;
|
||||
}
|
||||
retval = p9_client_setattr(fid, &p9attr);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
v9fs_invalidate_inode_attr(dentry->d_inode);
|
||||
|
||||
setattr_copy(dentry->d_inode, iattr);
|
||||
mark_inode_dirty(dentry->d_inode);
|
||||
|
|
Loading…
Reference in a new issue