mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
NFS: fix up nfs_setattr_update_inode
Always try to set the attributes, even if we don't have a valid struct nfs_fattr. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
97c2c17af9
commit
6a97d02dfe
1 changed files with 42 additions and 6 deletions
|
@ -671,9 +671,13 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr,
|
|||
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->attr_gencount = fattr->gencount;
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
|
||||
| NFS_INO_INVALID_CTIME);
|
||||
if ((attr->ia_valid & ATTR_SIZE) != 0) {
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_MTIME);
|
||||
nfs_inc_stats(inode, NFSIOS_SETATTRTRUNC);
|
||||
nfs_vmtruncate(inode, attr->ia_size);
|
||||
}
|
||||
if ((attr->ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID)) != 0) {
|
||||
NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_CTIME;
|
||||
if ((attr->ia_valid & ATTR_MODE) != 0) {
|
||||
int mode = attr->ia_mode & S_IALLUGO;
|
||||
mode |= inode->i_mode & ~S_IALLUGO;
|
||||
|
@ -683,13 +687,45 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr,
|
|||
inode->i_uid = attr->ia_uid;
|
||||
if ((attr->ia_valid & ATTR_GID) != 0)
|
||||
inode->i_gid = attr->ia_gid;
|
||||
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
||||
inode->i_ctime = fattr->ctime;
|
||||
else
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
|
||||
| NFS_INO_INVALID_CTIME);
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_ACCESS
|
||||
| NFS_INO_INVALID_ACL);
|
||||
}
|
||||
if ((attr->ia_valid & ATTR_SIZE) != 0) {
|
||||
if (attr->ia_valid & (ATTR_ATIME_SET|ATTR_ATIME)) {
|
||||
NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_ATIME
|
||||
| NFS_INO_INVALID_CTIME);
|
||||
if (fattr->valid & NFS_ATTR_FATTR_ATIME)
|
||||
inode->i_atime = fattr->atime;
|
||||
else if (attr->ia_valid & ATTR_ATIME_SET)
|
||||
inode->i_atime = attr->ia_atime;
|
||||
else
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATIME);
|
||||
|
||||
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
||||
inode->i_ctime = fattr->ctime;
|
||||
else
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
|
||||
| NFS_INO_INVALID_CTIME);
|
||||
}
|
||||
if (attr->ia_valid & (ATTR_MTIME_SET|ATTR_MTIME)) {
|
||||
NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_MTIME
|
||||
| NFS_INO_INVALID_CTIME);
|
||||
if (fattr->valid & NFS_ATTR_FATTR_MTIME)
|
||||
inode->i_mtime = fattr->mtime;
|
||||
else if (attr->ia_valid & ATTR_MTIME_SET)
|
||||
inode->i_mtime = attr->ia_mtime;
|
||||
else
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_MTIME);
|
||||
nfs_inc_stats(inode, NFSIOS_SETATTRTRUNC);
|
||||
nfs_vmtruncate(inode, attr->ia_size);
|
||||
|
||||
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
||||
inode->i_ctime = fattr->ctime;
|
||||
else
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
|
||||
| NFS_INO_INVALID_CTIME);
|
||||
}
|
||||
if (fattr->valid)
|
||||
nfs_update_inode(inode, fattr);
|
||||
|
|
Loading…
Reference in a new issue