summaryrefslogtreecommitdiffstats
path: root/fs/nfs/inode.c
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@primarydata.com>2018-04-08 17:51:11 -0400
committerTrond Myklebust <trond.myklebust@hammerspace.com>2018-06-04 15:03:58 -0400
commit6a97d02dfe7fca29a3acec66ff51a1ceecacaa20 (patch)
treeb00002682345a1612061f32c7f504e11e9e7925a /fs/nfs/inode.c
parent97c2c17af9bd17c2cf4bc1e17f088793996cbba2 (diff)
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>
Diffstat (limited to 'fs/nfs/inode.c')
-rw-r--r--fs/nfs/inode.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index a720427e5aa3..2b7edd011d86 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -671,9 +671,13 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr,
671 671
672 spin_lock(&inode->i_lock); 672 spin_lock(&inode->i_lock);
673 NFS_I(inode)->attr_gencount = fattr->gencount; 673 NFS_I(inode)->attr_gencount = fattr->gencount;
674 nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE 674 if ((attr->ia_valid & ATTR_SIZE) != 0) {
675 | NFS_INO_INVALID_CTIME); 675 nfs_set_cache_invalid(inode, NFS_INO_INVALID_MTIME);
676 nfs_inc_stats(inode, NFSIOS_SETATTRTRUNC);
677 nfs_vmtruncate(inode, attr->ia_size);
678 }
676 if ((attr->ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID)) != 0) { 679 if ((attr->ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID)) != 0) {
680 NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_CTIME;
677 if ((attr->ia_valid & ATTR_MODE) != 0) { 681 if ((attr->ia_valid & ATTR_MODE) != 0) {
678 int mode = attr->ia_mode & S_IALLUGO; 682 int mode = attr->ia_mode & S_IALLUGO;
679 mode |= inode->i_mode & ~S_IALLUGO; 683 mode |= inode->i_mode & ~S_IALLUGO;
@@ -683,13 +687,45 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr,
683 inode->i_uid = attr->ia_uid; 687 inode->i_uid = attr->ia_uid;
684 if ((attr->ia_valid & ATTR_GID) != 0) 688 if ((attr->ia_valid & ATTR_GID) != 0)
685 inode->i_gid = attr->ia_gid; 689 inode->i_gid = attr->ia_gid;
690 if (fattr->valid & NFS_ATTR_FATTR_CTIME)
691 inode->i_ctime = fattr->ctime;
692 else
693 nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
694 | NFS_INO_INVALID_CTIME);
686 nfs_set_cache_invalid(inode, NFS_INO_INVALID_ACCESS 695 nfs_set_cache_invalid(inode, NFS_INO_INVALID_ACCESS
687 | NFS_INO_INVALID_ACL); 696 | NFS_INO_INVALID_ACL);
688 } 697 }
689 if ((attr->ia_valid & ATTR_SIZE) != 0) { 698 if (attr->ia_valid & (ATTR_ATIME_SET|ATTR_ATIME)) {
690 nfs_set_cache_invalid(inode, NFS_INO_INVALID_MTIME); 699 NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_ATIME
691 nfs_inc_stats(inode, NFSIOS_SETATTRTRUNC); 700 | NFS_INO_INVALID_CTIME);
692 nfs_vmtruncate(inode, attr->ia_size); 701 if (fattr->valid & NFS_ATTR_FATTR_ATIME)
702 inode->i_atime = fattr->atime;
703 else if (attr->ia_valid & ATTR_ATIME_SET)
704 inode->i_atime = attr->ia_atime;
705 else
706 nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATIME);
707
708 if (fattr->valid & NFS_ATTR_FATTR_CTIME)
709 inode->i_ctime = fattr->ctime;
710 else
711 nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
712 | NFS_INO_INVALID_CTIME);
713 }
714 if (attr->ia_valid & (ATTR_MTIME_SET|ATTR_MTIME)) {
715 NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_MTIME
716 | NFS_INO_INVALID_CTIME);
717 if (fattr->valid & NFS_ATTR_FATTR_MTIME)
718 inode->i_mtime = fattr->mtime;
719 else if (attr->ia_valid & ATTR_MTIME_SET)
720 inode->i_mtime = attr->ia_mtime;
721 else
722 nfs_set_cache_invalid(inode, NFS_INO_INVALID_MTIME);
723
724 if (fattr->valid & NFS_ATTR_FATTR_CTIME)
725 inode->i_ctime = fattr->ctime;
726 else
727 nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
728 | NFS_INO_INVALID_CTIME);
693 } 729 }
694 if (fattr->valid) 730 if (fattr->valid)
695 nfs_update_inode(inode, fattr); 731 nfs_update_inode(inode, fattr);