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) | |||
| 164 | if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) { | 164 | if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) { |
| 165 | nfs_fscache_invalidate(inode); | 165 | nfs_fscache_invalidate(inode); |
| 166 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR | 166 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR |
| 167 | | NFS_INO_INVALID_LABEL | ||
| 168 | | NFS_INO_INVALID_DATA | 167 | | NFS_INO_INVALID_DATA |
| 169 | | NFS_INO_INVALID_ACCESS | 168 | | NFS_INO_INVALID_ACCESS |
| 170 | | NFS_INO_INVALID_ACL | 169 | | NFS_INO_INVALID_ACL |
| 171 | | NFS_INO_REVAL_PAGECACHE; | 170 | | NFS_INO_REVAL_PAGECACHE; |
| 172 | } else | 171 | } else |
| 173 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR | 172 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR |
| 174 | | NFS_INO_INVALID_LABEL | ||
| 175 | | NFS_INO_INVALID_ACCESS | 173 | | NFS_INO_INVALID_ACCESS |
| 176 | | NFS_INO_INVALID_ACL | 174 | | NFS_INO_INVALID_ACL |
| 177 | | NFS_INO_REVAL_PAGECACHE; | 175 | | NFS_INO_REVAL_PAGECACHE; |
| 176 | nfs_zap_label_cache_locked(nfsi); | ||
| 178 | } | 177 | } |
| 179 | 178 | ||
| 180 | void nfs_zap_caches(struct inode *inode) | 179 | void nfs_zap_caches(struct inode *inode) |
| @@ -266,6 +265,13 @@ nfs_init_locked(struct inode *inode, void *opaque) | |||
| 266 | } | 265 | } |
| 267 | 266 | ||
| 268 | #ifdef CONFIG_NFS_V4_SECURITY_LABEL | 267 | #ifdef CONFIG_NFS_V4_SECURITY_LABEL |
| 268 | static void nfs_clear_label_invalid(struct inode *inode) | ||
| 269 | { | ||
| 270 | spin_lock(&inode->i_lock); | ||
| 271 | NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_LABEL; | ||
| 272 | spin_unlock(&inode->i_lock); | ||
| 273 | } | ||
| 274 | |||
| 269 | void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, | 275 | void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, |
| 270 | struct nfs4_label *label) | 276 | struct nfs4_label *label) |
| 271 | { | 277 | { |
| @@ -283,6 +289,7 @@ void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, | |||
| 283 | __func__, | 289 | __func__, |
| 284 | (char *)label->label, | 290 | (char *)label->label, |
| 285 | label->len, error); | 291 | label->len, error); |
| 292 | nfs_clear_label_invalid(inode); | ||
| 286 | } | 293 | } |
| 287 | } | 294 | } |
| 288 | 295 | ||
| @@ -1648,7 +1655,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
| 1648 | inode->i_blocks = fattr->du.nfs2.blocks; | 1655 | inode->i_blocks = fattr->du.nfs2.blocks; |
| 1649 | 1656 | ||
| 1650 | /* Update attrtimeo value if we're out of the unstable period */ | 1657 | /* Update attrtimeo value if we're out of the unstable period */ |
| 1651 | if (invalid & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_LABEL)) { | 1658 | if (invalid & NFS_INO_INVALID_ATTR) { |
| 1652 | nfs_inc_stats(inode, NFSIOS_ATTRINVALIDATE); | 1659 | nfs_inc_stats(inode, NFSIOS_ATTRINVALIDATE); |
| 1653 | nfsi->attrtimeo = NFS_MINATTRTIMEO(inode); | 1660 | nfsi->attrtimeo = NFS_MINATTRTIMEO(inode); |
| 1654 | nfsi->attrtimeo_timestamp = now; | 1661 | nfsi->attrtimeo_timestamp = now; |
| @@ -1661,7 +1668,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
| 1661 | } | 1668 | } |
| 1662 | } | 1669 | } |
| 1663 | invalid &= ~NFS_INO_INVALID_ATTR; | 1670 | invalid &= ~NFS_INO_INVALID_ATTR; |
| 1664 | invalid &= ~NFS_INO_INVALID_LABEL; | ||
| 1665 | /* Don't invalidate the data if we were to blame */ | 1671 | /* Don't invalidate the data if we were to blame */ |
| 1666 | if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) | 1672 | if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) |
| 1667 | || S_ISLNK(inode->i_mode))) | 1673 | || S_ISLNK(inode->i_mode))) |
