diff options
Diffstat (limited to 'fs/nfs/inode.c')
| -rw-r--r-- | fs/nfs/inode.c | 14 | 
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 28a0a3cbd3b7..360114ae8b82 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -164,17 +164,16 @@ static void nfs_zap_caches_locked(struct inode *inode)  	if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) {  		nfs_fscache_invalidate(inode);  		nfsi->cache_validity |= NFS_INO_INVALID_ATTR -					| NFS_INO_INVALID_LABEL  					| NFS_INO_INVALID_DATA  					| NFS_INO_INVALID_ACCESS  					| NFS_INO_INVALID_ACL  					| NFS_INO_REVAL_PAGECACHE;  	} else  		nfsi->cache_validity |= NFS_INO_INVALID_ATTR -					| NFS_INO_INVALID_LABEL  					| NFS_INO_INVALID_ACCESS  					| NFS_INO_INVALID_ACL  					| NFS_INO_REVAL_PAGECACHE; +	nfs_zap_label_cache_locked(nfsi);  }  void nfs_zap_caches(struct inode *inode) @@ -266,6 +265,13 @@ nfs_init_locked(struct inode *inode, void *opaque)  }  #ifdef CONFIG_NFS_V4_SECURITY_LABEL +static void nfs_clear_label_invalid(struct inode *inode) +{ +	spin_lock(&inode->i_lock); +	NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_LABEL; +	spin_unlock(&inode->i_lock); +} +  void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr,  					struct nfs4_label *label)  { @@ -283,6 +289,7 @@ void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr,  					__func__,  					(char *)label->label,  					label->len, error); +		nfs_clear_label_invalid(inode);  	}  } @@ -1648,7 +1655,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)  		inode->i_blocks = fattr->du.nfs2.blocks;  	/* Update attrtimeo value if we're out of the unstable period */ -	if (invalid & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_LABEL)) { +	if (invalid & NFS_INO_INVALID_ATTR) {  		nfs_inc_stats(inode, NFSIOS_ATTRINVALIDATE);  		nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);  		nfsi->attrtimeo_timestamp = now; @@ -1661,7 +1668,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)  		}  	}  	invalid &= ~NFS_INO_INVALID_ATTR; -	invalid &= ~NFS_INO_INVALID_LABEL;  	/* Don't invalidate the data if we were to blame */  	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)  				|| S_ISLNK(inode->i_mode)))  | 
