diff options
-rw-r--r-- | fs/nfs/dir.c | 16 | ||||
-rw-r--r-- | fs/nfs/file.c | 5 | ||||
-rw-r--r-- | fs/nfs/inode.c | 61 | ||||
-rw-r--r-- | fs/nfs/nfs3acl.c | 2 | ||||
-rw-r--r-- | fs/nfs/read.c | 4 | ||||
-rw-r--r-- | include/linux/nfs_fs.h | 27 |
6 files changed, 63 insertions, 52 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index b38a57e78a63..5732e13cd0da 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -189,7 +189,7 @@ int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page *page) | |||
189 | goto error; | 189 | goto error; |
190 | } | 190 | } |
191 | SetPageUptodate(page); | 191 | SetPageUptodate(page); |
192 | NFS_FLAGS(inode) |= NFS_INO_INVALID_ATIME; | 192 | NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME; |
193 | /* Ensure consistent page alignment of the data. | 193 | /* Ensure consistent page alignment of the data. |
194 | * Note: assumes we have exclusive access to this mapping either | 194 | * Note: assumes we have exclusive access to this mapping either |
195 | * through inode->i_sem or some other mechanism. | 195 | * through inode->i_sem or some other mechanism. |
@@ -462,7 +462,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent, | |||
462 | page, | 462 | page, |
463 | NFS_SERVER(inode)->dtsize, | 463 | NFS_SERVER(inode)->dtsize, |
464 | desc->plus); | 464 | desc->plus); |
465 | NFS_FLAGS(inode) |= NFS_INO_INVALID_ATIME; | 465 | NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME; |
466 | desc->page = page; | 466 | desc->page = page; |
467 | desc->ptr = kmap(page); /* matching kunmap in nfs_do_filldir */ | 467 | desc->ptr = kmap(page); /* matching kunmap in nfs_do_filldir */ |
468 | if (desc->error >= 0) { | 468 | if (desc->error >= 0) { |
@@ -608,7 +608,7 @@ static inline int nfs_check_verifier(struct inode *dir, struct dentry *dentry) | |||
608 | { | 608 | { |
609 | if (IS_ROOT(dentry)) | 609 | if (IS_ROOT(dentry)) |
610 | return 1; | 610 | return 1; |
611 | if ((NFS_FLAGS(dir) & NFS_INO_INVALID_ATTR) != 0 | 611 | if ((NFS_I(dir)->cache_validity & NFS_INO_INVALID_ATTR) != 0 |
612 | || nfs_attribute_timeout(dir)) | 612 | || nfs_attribute_timeout(dir)) |
613 | return 0; | 613 | return 0; |
614 | return nfs_verify_change_attribute(dir, (unsigned long)dentry->d_fsdata); | 614 | return nfs_verify_change_attribute(dir, (unsigned long)dentry->d_fsdata); |
@@ -1575,11 +1575,12 @@ out: | |||
1575 | 1575 | ||
1576 | int nfs_access_get_cached(struct inode *inode, struct rpc_cred *cred, struct nfs_access_entry *res) | 1576 | int nfs_access_get_cached(struct inode *inode, struct rpc_cred *cred, struct nfs_access_entry *res) |
1577 | { | 1577 | { |
1578 | struct nfs_access_entry *cache = &NFS_I(inode)->cache_access; | 1578 | struct nfs_inode *nfsi = NFS_I(inode); |
1579 | struct nfs_access_entry *cache = &nfsi->cache_access; | ||
1579 | 1580 | ||
1580 | if (cache->cred != cred | 1581 | if (cache->cred != cred |
1581 | || time_after(jiffies, cache->jiffies + NFS_ATTRTIMEO(inode)) | 1582 | || time_after(jiffies, cache->jiffies + NFS_ATTRTIMEO(inode)) |
1582 | || (NFS_FLAGS(inode) & NFS_INO_INVALID_ACCESS)) | 1583 | || (nfsi->cache_validity & NFS_INO_INVALID_ACCESS)) |
1583 | return -ENOENT; | 1584 | return -ENOENT; |
1584 | memcpy(res, cache, sizeof(*res)); | 1585 | memcpy(res, cache, sizeof(*res)); |
1585 | return 0; | 1586 | return 0; |
@@ -1587,14 +1588,15 @@ int nfs_access_get_cached(struct inode *inode, struct rpc_cred *cred, struct nfs | |||
1587 | 1588 | ||
1588 | void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set) | 1589 | void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set) |
1589 | { | 1590 | { |
1590 | struct nfs_access_entry *cache = &NFS_I(inode)->cache_access; | 1591 | struct nfs_inode *nfsi = NFS_I(inode); |
1592 | struct nfs_access_entry *cache = &nfsi->cache_access; | ||
1591 | 1593 | ||
1592 | if (cache->cred != set->cred) { | 1594 | if (cache->cred != set->cred) { |
1593 | if (cache->cred) | 1595 | if (cache->cred) |
1594 | put_rpccred(cache->cred); | 1596 | put_rpccred(cache->cred); |
1595 | cache->cred = get_rpccred(set->cred); | 1597 | cache->cred = get_rpccred(set->cred); |
1596 | } | 1598 | } |
1597 | NFS_FLAGS(inode) &= ~NFS_INO_INVALID_ACCESS; | 1599 | nfsi->cache_validity &= ~NFS_INO_INVALID_ACCESS; |
1598 | cache->jiffies = set->jiffies; | 1600 | cache->jiffies = set->jiffies; |
1599 | cache->mask = set->mask; | 1601 | cache->mask = set->mask; |
1600 | } | 1602 | } |
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 5621ba9885f4..f6b9eda925c5 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -134,9 +134,10 @@ nfs_file_release(struct inode *inode, struct file *filp) | |||
134 | */ | 134 | */ |
135 | static int nfs_revalidate_file(struct inode *inode, struct file *filp) | 135 | static int nfs_revalidate_file(struct inode *inode, struct file *filp) |
136 | { | 136 | { |
137 | struct nfs_inode *nfsi = NFS_I(inode); | ||
137 | int retval = 0; | 138 | int retval = 0; |
138 | 139 | ||
139 | if ((NFS_FLAGS(inode) & NFS_INO_REVAL_PAGECACHE) || nfs_attribute_timeout(inode)) | 140 | if ((nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE) || nfs_attribute_timeout(inode)) |
140 | retval = __nfs_revalidate_inode(NFS_SERVER(inode), inode); | 141 | retval = __nfs_revalidate_inode(NFS_SERVER(inode), inode); |
141 | nfs_revalidate_mapping(inode, filp->f_mapping); | 142 | nfs_revalidate_mapping(inode, filp->f_mapping); |
142 | return 0; | 143 | return 0; |
@@ -164,7 +165,7 @@ static int nfs_revalidate_file_size(struct inode *inode, struct file *filp) | |||
164 | goto force_reval; | 165 | goto force_reval; |
165 | if (nfsi->npages != 0) | 166 | if (nfsi->npages != 0) |
166 | return 0; | 167 | return 0; |
167 | if (!(NFS_FLAGS(inode) & NFS_INO_REVAL_PAGECACHE) && !nfs_attribute_timeout(inode)) | 168 | if (!(nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE) && !nfs_attribute_timeout(inode)) |
168 | return 0; | 169 | return 0; |
169 | force_reval: | 170 | force_reval: |
170 | return __nfs_revalidate_inode(server, inode); | 171 | return __nfs_revalidate_inode(server, inode); |
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index bb7ca022bcb2..622184553516 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -620,9 +620,9 @@ nfs_zap_caches(struct inode *inode) | |||
620 | 620 | ||
621 | memset(NFS_COOKIEVERF(inode), 0, sizeof(NFS_COOKIEVERF(inode))); | 621 | memset(NFS_COOKIEVERF(inode), 0, sizeof(NFS_COOKIEVERF(inode))); |
622 | if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) | 622 | if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) |
623 | nfsi->flags |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE; | 623 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE; |
624 | else | 624 | else |
625 | nfsi->flags |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE; | 625 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE; |
626 | } | 626 | } |
627 | 627 | ||
628 | static void nfs_zap_acl_cache(struct inode *inode) | 628 | static void nfs_zap_acl_cache(struct inode *inode) |
@@ -632,7 +632,7 @@ static void nfs_zap_acl_cache(struct inode *inode) | |||
632 | clear_acl_cache = NFS_PROTO(inode)->clear_acl_cache; | 632 | clear_acl_cache = NFS_PROTO(inode)->clear_acl_cache; |
633 | if (clear_acl_cache != NULL) | 633 | if (clear_acl_cache != NULL) |
634 | clear_acl_cache(inode); | 634 | clear_acl_cache(inode); |
635 | NFS_I(inode)->flags &= ~NFS_INO_INVALID_ACL; | 635 | NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_ACL; |
636 | } | 636 | } |
637 | 637 | ||
638 | /* | 638 | /* |
@@ -841,7 +841,7 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr) | |||
841 | inode->i_uid = attr->ia_uid; | 841 | inode->i_uid = attr->ia_uid; |
842 | if ((attr->ia_valid & ATTR_GID) != 0) | 842 | if ((attr->ia_valid & ATTR_GID) != 0) |
843 | inode->i_gid = attr->ia_gid; | 843 | inode->i_gid = attr->ia_gid; |
844 | NFS_FLAGS(inode) |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL; | 844 | NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL; |
845 | } | 845 | } |
846 | if ((attr->ia_valid & ATTR_SIZE) != 0) { | 846 | if ((attr->ia_valid & ATTR_SIZE) != 0) { |
847 | inode->i_size = attr->ia_size; | 847 | inode->i_size = attr->ia_size; |
@@ -872,8 +872,7 @@ nfs_wait_on_inode(struct inode *inode, int flag) | |||
872 | int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) | 872 | int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) |
873 | { | 873 | { |
874 | struct inode *inode = dentry->d_inode; | 874 | struct inode *inode = dentry->d_inode; |
875 | struct nfs_inode *nfsi = NFS_I(inode); | 875 | int need_atime = NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATIME; |
876 | int need_atime = nfsi->flags & NFS_INO_INVALID_ATIME; | ||
877 | int err; | 876 | int err; |
878 | 877 | ||
879 | if (__IS_FLG(inode, MS_NOATIME)) | 878 | if (__IS_FLG(inode, MS_NOATIME)) |
@@ -1019,7 +1018,7 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) | |||
1019 | struct nfs_fattr fattr; | 1018 | struct nfs_fattr fattr; |
1020 | struct nfs_inode *nfsi = NFS_I(inode); | 1019 | struct nfs_inode *nfsi = NFS_I(inode); |
1021 | unsigned long verifier; | 1020 | unsigned long verifier; |
1022 | unsigned int flags; | 1021 | unsigned long cache_validity; |
1023 | 1022 | ||
1024 | dfprintk(PAGECACHE, "NFS: revalidating (%s/%Ld)\n", | 1023 | dfprintk(PAGECACHE, "NFS: revalidating (%s/%Ld)\n", |
1025 | inode->i_sb->s_id, (long long)NFS_FILEID(inode)); | 1024 | inode->i_sb->s_id, (long long)NFS_FILEID(inode)); |
@@ -1036,7 +1035,7 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) | |||
1036 | goto out_nowait; | 1035 | goto out_nowait; |
1037 | if (NFS_ATTRTIMEO(inode) == 0) | 1036 | if (NFS_ATTRTIMEO(inode) == 0) |
1038 | continue; | 1037 | continue; |
1039 | if (NFS_FLAGS(inode) & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ATIME)) | 1038 | if (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ATIME)) |
1040 | continue; | 1039 | continue; |
1041 | status = NFS_STALE(inode) ? -ESTALE : 0; | 1040 | status = NFS_STALE(inode) ? -ESTALE : 0; |
1042 | goto out_nowait; | 1041 | goto out_nowait; |
@@ -1065,18 +1064,21 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) | |||
1065 | (long long)NFS_FILEID(inode), status); | 1064 | (long long)NFS_FILEID(inode), status); |
1066 | goto out; | 1065 | goto out; |
1067 | } | 1066 | } |
1068 | flags = nfsi->flags; | 1067 | cache_validity = nfsi->cache_validity; |
1069 | nfsi->flags &= ~NFS_INO_REVAL_PAGECACHE; | 1068 | nfsi->cache_validity &= ~NFS_INO_REVAL_PAGECACHE; |
1069 | |||
1070 | /* | 1070 | /* |
1071 | * We may need to keep the attributes marked as invalid if | 1071 | * We may need to keep the attributes marked as invalid if |
1072 | * we raced with nfs_end_attr_update(). | 1072 | * we raced with nfs_end_attr_update(). |
1073 | */ | 1073 | */ |
1074 | if (verifier == nfsi->cache_change_attribute) | 1074 | if (verifier == nfsi->cache_change_attribute) |
1075 | nfsi->flags &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME); | 1075 | nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME); |
1076 | /* Do the page cache invalidation */ | 1076 | |
1077 | nfs_revalidate_mapping(inode, inode->i_mapping); | 1077 | nfs_revalidate_mapping(inode, inode->i_mapping); |
1078 | if (flags & NFS_INO_INVALID_ACL) | 1078 | |
1079 | if (cache_validity & NFS_INO_INVALID_ACL) | ||
1079 | nfs_zap_acl_cache(inode); | 1080 | nfs_zap_acl_cache(inode); |
1081 | |||
1080 | dfprintk(PAGECACHE, "NFS: (%s/%Ld) revalidation complete\n", | 1082 | dfprintk(PAGECACHE, "NFS: (%s/%Ld) revalidation complete\n", |
1081 | inode->i_sb->s_id, | 1083 | inode->i_sb->s_id, |
1082 | (long long)NFS_FILEID(inode)); | 1084 | (long long)NFS_FILEID(inode)); |
@@ -1107,7 +1109,7 @@ int nfs_attribute_timeout(struct inode *inode) | |||
1107 | */ | 1109 | */ |
1108 | int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) | 1110 | int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) |
1109 | { | 1111 | { |
1110 | if (!(NFS_FLAGS(inode) & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA)) | 1112 | if (!(NFS_I(inode)->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA)) |
1111 | && !nfs_attribute_timeout(inode)) | 1113 | && !nfs_attribute_timeout(inode)) |
1112 | return NFS_STALE(inode) ? -ESTALE : 0; | 1114 | return NFS_STALE(inode) ? -ESTALE : 0; |
1113 | return __nfs_revalidate_inode(server, inode); | 1115 | return __nfs_revalidate_inode(server, inode); |
@@ -1122,14 +1124,14 @@ void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) | |||
1122 | { | 1124 | { |
1123 | struct nfs_inode *nfsi = NFS_I(inode); | 1125 | struct nfs_inode *nfsi = NFS_I(inode); |
1124 | 1126 | ||
1125 | if (nfsi->flags & NFS_INO_INVALID_DATA) { | 1127 | if (nfsi->cache_validity & NFS_INO_INVALID_DATA) { |
1126 | if (S_ISREG(inode->i_mode)) { | 1128 | if (S_ISREG(inode->i_mode)) { |
1127 | if (filemap_fdatawrite(mapping) == 0) | 1129 | if (filemap_fdatawrite(mapping) == 0) |
1128 | filemap_fdatawait(mapping); | 1130 | filemap_fdatawait(mapping); |
1129 | nfs_wb_all(inode); | 1131 | nfs_wb_all(inode); |
1130 | } | 1132 | } |
1131 | invalidate_inode_pages2(mapping); | 1133 | invalidate_inode_pages2(mapping); |
1132 | nfsi->flags &= ~NFS_INO_INVALID_DATA; | 1134 | nfsi->cache_validity &= ~NFS_INO_INVALID_DATA; |
1133 | if (S_ISDIR(inode->i_mode)) { | 1135 | if (S_ISDIR(inode->i_mode)) { |
1134 | memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf)); | 1136 | memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf)); |
1135 | /* This ensures we revalidate child dentries */ | 1137 | /* This ensures we revalidate child dentries */ |
@@ -1164,10 +1166,10 @@ void nfs_end_data_update(struct inode *inode) | |||
1164 | 1166 | ||
1165 | if (!nfs_have_delegation(inode, FMODE_READ)) { | 1167 | if (!nfs_have_delegation(inode, FMODE_READ)) { |
1166 | /* Mark the attribute cache for revalidation */ | 1168 | /* Mark the attribute cache for revalidation */ |
1167 | nfsi->flags |= NFS_INO_INVALID_ATTR; | 1169 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR; |
1168 | /* Directories and symlinks: invalidate page cache too */ | 1170 | /* Directories and symlinks: invalidate page cache too */ |
1169 | if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) | 1171 | if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) |
1170 | nfsi->flags |= NFS_INO_INVALID_DATA; | 1172 | nfsi->cache_validity |= NFS_INO_INVALID_DATA; |
1171 | } | 1173 | } |
1172 | nfsi->cache_change_attribute ++; | 1174 | nfsi->cache_change_attribute ++; |
1173 | atomic_dec(&nfsi->data_updates); | 1175 | atomic_dec(&nfsi->data_updates); |
@@ -1200,9 +1202,9 @@ int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
1200 | && nfsi->change_attr == fattr->pre_change_attr) | 1202 | && nfsi->change_attr == fattr->pre_change_attr) |
1201 | nfsi->change_attr = fattr->change_attr; | 1203 | nfsi->change_attr = fattr->change_attr; |
1202 | if (nfsi->change_attr != fattr->change_attr) { | 1204 | if (nfsi->change_attr != fattr->change_attr) { |
1203 | nfsi->flags |= NFS_INO_INVALID_ATTR; | 1205 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR; |
1204 | if (!data_unstable) | 1206 | if (!data_unstable) |
1205 | nfsi->flags |= NFS_INO_REVAL_PAGECACHE; | 1207 | nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE; |
1206 | } | 1208 | } |
1207 | } | 1209 | } |
1208 | 1210 | ||
@@ -1227,28 +1229,28 @@ int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
1227 | 1229 | ||
1228 | /* Verify a few of the more important attributes */ | 1230 | /* Verify a few of the more important attributes */ |
1229 | if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) { | 1231 | if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) { |
1230 | nfsi->flags |= NFS_INO_INVALID_ATTR; | 1232 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR; |
1231 | if (!data_unstable) | 1233 | if (!data_unstable) |
1232 | nfsi->flags |= NFS_INO_REVAL_PAGECACHE; | 1234 | nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE; |
1233 | } | 1235 | } |
1234 | if (cur_size != new_isize) { | 1236 | if (cur_size != new_isize) { |
1235 | nfsi->flags |= NFS_INO_INVALID_ATTR; | 1237 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR; |
1236 | if (nfsi->npages == 0) | 1238 | if (nfsi->npages == 0) |
1237 | nfsi->flags |= NFS_INO_REVAL_PAGECACHE; | 1239 | nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE; |
1238 | } | 1240 | } |
1239 | 1241 | ||
1240 | /* Have any file permissions changed? */ | 1242 | /* Have any file permissions changed? */ |
1241 | if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO) | 1243 | if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO) |
1242 | || inode->i_uid != fattr->uid | 1244 | || inode->i_uid != fattr->uid |
1243 | || inode->i_gid != fattr->gid) | 1245 | || inode->i_gid != fattr->gid) |
1244 | nfsi->flags |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL; | 1246 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL; |
1245 | 1247 | ||
1246 | /* Has the link count changed? */ | 1248 | /* Has the link count changed? */ |
1247 | if (inode->i_nlink != fattr->nlink) | 1249 | if (inode->i_nlink != fattr->nlink) |
1248 | nfsi->flags |= NFS_INO_INVALID_ATTR; | 1250 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR; |
1249 | 1251 | ||
1250 | if (!timespec_equal(&inode->i_atime, &fattr->atime)) | 1252 | if (!timespec_equal(&inode->i_atime, &fattr->atime)) |
1251 | nfsi->flags |= NFS_INO_INVALID_ATIME; | 1253 | nfsi->cache_validity |= NFS_INO_INVALID_ATIME; |
1252 | 1254 | ||
1253 | nfsi->read_cache_jiffies = fattr->timestamp; | 1255 | nfsi->read_cache_jiffies = fattr->timestamp; |
1254 | return 0; | 1256 | return 0; |
@@ -1384,7 +1386,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign | |||
1384 | || S_ISLNK(inode->i_mode))) | 1386 | || S_ISLNK(inode->i_mode))) |
1385 | invalid &= ~NFS_INO_INVALID_DATA; | 1387 | invalid &= ~NFS_INO_INVALID_DATA; |
1386 | if (!nfs_have_delegation(inode, FMODE_READ)) | 1388 | if (!nfs_have_delegation(inode, FMODE_READ)) |
1387 | nfsi->flags |= invalid; | 1389 | nfsi->cache_validity |= invalid; |
1388 | 1390 | ||
1389 | return 0; | 1391 | return 0; |
1390 | out_changed: | 1392 | out_changed: |
@@ -1961,7 +1963,8 @@ static struct inode *nfs_alloc_inode(struct super_block *sb) | |||
1961 | nfsi = (struct nfs_inode *)kmem_cache_alloc(nfs_inode_cachep, SLAB_KERNEL); | 1963 | nfsi = (struct nfs_inode *)kmem_cache_alloc(nfs_inode_cachep, SLAB_KERNEL); |
1962 | if (!nfsi) | 1964 | if (!nfsi) |
1963 | return NULL; | 1965 | return NULL; |
1964 | nfsi->flags = 0; | 1966 | nfsi->flags = 0UL; |
1967 | nfsi->cache_validity = 0UL; | ||
1965 | #ifdef CONFIG_NFS_V3_ACL | 1968 | #ifdef CONFIG_NFS_V3_ACL |
1966 | nfsi->acl_access = ERR_PTR(-EAGAIN); | 1969 | nfsi->acl_access = ERR_PTR(-EAGAIN); |
1967 | nfsi->acl_default = ERR_PTR(-EAGAIN); | 1970 | nfsi->acl_default = ERR_PTR(-EAGAIN); |
diff --git a/fs/nfs/nfs3acl.c b/fs/nfs/nfs3acl.c index 1b7a3ef2f813..a020e650ffc2 100644 --- a/fs/nfs/nfs3acl.c +++ b/fs/nfs/nfs3acl.c | |||
@@ -308,7 +308,7 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl, | |||
308 | nfs_begin_data_update(inode); | 308 | nfs_begin_data_update(inode); |
309 | status = rpc_call(server->client_acl, ACLPROC3_SETACL, | 309 | status = rpc_call(server->client_acl, ACLPROC3_SETACL, |
310 | &args, &fattr, 0); | 310 | &args, &fattr, 0); |
311 | NFS_FLAGS(inode) |= NFS_INO_INVALID_ACCESS; | 311 | NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ACCESS; |
312 | nfs_end_data_update(inode); | 312 | nfs_end_data_update(inode); |
313 | dprintk("NFS reply setacl: %d\n", status); | 313 | dprintk("NFS reply setacl: %d\n", status); |
314 | 314 | ||
diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 6f866b8aa2d5..90df0500ca1b 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c | |||
@@ -140,7 +140,7 @@ static int nfs_readpage_sync(struct nfs_open_context *ctx, struct inode *inode, | |||
140 | if (rdata->res.eof != 0 || result == 0) | 140 | if (rdata->res.eof != 0 || result == 0) |
141 | break; | 141 | break; |
142 | } while (count); | 142 | } while (count); |
143 | NFS_FLAGS(inode) |= NFS_INO_INVALID_ATIME; | 143 | NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME; |
144 | 144 | ||
145 | if (count) | 145 | if (count) |
146 | memclear_highpage_flush(page, rdata->args.pgbase, count); | 146 | memclear_highpage_flush(page, rdata->args.pgbase, count); |
@@ -473,7 +473,7 @@ void nfs_readpage_result(struct rpc_task *task) | |||
473 | } | 473 | } |
474 | task->tk_status = -EIO; | 474 | task->tk_status = -EIO; |
475 | } | 475 | } |
476 | NFS_FLAGS(data->inode) |= NFS_INO_INVALID_ATIME; | 476 | NFS_I(data->inode)->cache_validity |= NFS_INO_INVALID_ATIME; |
477 | data->complete(data, status); | 477 | data->complete(data, status); |
478 | } | 478 | } |
479 | 479 | ||
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 7d78a783c64a..229a1755842a 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -113,6 +113,7 @@ struct nfs_inode { | |||
113 | * Various flags | 113 | * Various flags |
114 | */ | 114 | */ |
115 | unsigned int flags; | 115 | unsigned int flags; |
116 | unsigned long cache_validity; | ||
116 | 117 | ||
117 | /* | 118 | /* |
118 | * read_cache_jiffies is when we started read-caching this inode, | 119 | * read_cache_jiffies is when we started read-caching this inode, |
@@ -188,17 +189,21 @@ struct nfs_inode { | |||
188 | }; | 189 | }; |
189 | 190 | ||
190 | /* | 191 | /* |
191 | * Legal inode flag values | 192 | * Cache validity bit flags |
192 | */ | 193 | */ |
193 | #define NFS_INO_STALE 0x0001 /* possible stale inode */ | 194 | #define NFS_INO_INVALID_ATTR 0x0001 /* cached attrs are invalid */ |
194 | #define NFS_INO_ADVISE_RDPLUS 0x0002 /* advise readdirplus */ | 195 | #define NFS_INO_INVALID_DATA 0x0002 /* cached data is invalid */ |
195 | #define NFS_INO_REVALIDATING 0x0004 /* revalidating attrs */ | 196 | #define NFS_INO_INVALID_ATIME 0x0004 /* cached atime is invalid */ |
196 | #define NFS_INO_INVALID_ATTR 0x0008 /* cached attrs are invalid */ | 197 | #define NFS_INO_INVALID_ACCESS 0x0008 /* cached access cred invalid */ |
197 | #define NFS_INO_INVALID_DATA 0x0010 /* cached data is invalid */ | 198 | #define NFS_INO_INVALID_ACL 0x0010 /* cached acls are invalid */ |
198 | #define NFS_INO_INVALID_ATIME 0x0020 /* cached atime is invalid */ | 199 | #define NFS_INO_REVAL_PAGECACHE 0x0020 /* must revalidate pagecache */ |
199 | #define NFS_INO_INVALID_ACCESS 0x0040 /* cached access cred invalid */ | 200 | |
200 | #define NFS_INO_INVALID_ACL 0x0080 /* cached acls are invalid */ | 201 | /* |
201 | #define NFS_INO_REVAL_PAGECACHE 0x1000 /* must revalidate pagecache */ | 202 | * Legal values of flags field |
203 | */ | ||
204 | #define NFS_INO_REVALIDATING 0x0001 /* revalidating attrs */ | ||
205 | #define NFS_INO_ADVISE_RDPLUS 0x0002 /* advise readdirplus */ | ||
206 | #define NFS_INO_STALE 0x0004 /* possible stale inode */ | ||
202 | 207 | ||
203 | static inline struct nfs_inode *NFS_I(struct inode *inode) | 208 | static inline struct nfs_inode *NFS_I(struct inode *inode) |
204 | { | 209 | { |
@@ -237,7 +242,7 @@ static inline int nfs_caches_unstable(struct inode *inode) | |||
237 | static inline void NFS_CACHEINV(struct inode *inode) | 242 | static inline void NFS_CACHEINV(struct inode *inode) |
238 | { | 243 | { |
239 | if (!nfs_caches_unstable(inode)) | 244 | if (!nfs_caches_unstable(inode)) |
240 | NFS_FLAGS(inode) |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS; | 245 | NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS; |
241 | } | 246 | } |
242 | 247 | ||
243 | static inline int nfs_server_capable(struct inode *inode, int cap) | 248 | static inline int nfs_server_capable(struct inode *inode, int cap) |