|
@@ -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)))
|