diff options
Diffstat (limited to 'fs/nfs/inode.c')
-rw-r--r-- | fs/nfs/inode.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index eddd0e982d23..69036ef39866 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -1220,7 +1220,7 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) | |||
1220 | status = -ESTALE; | 1220 | status = -ESTALE; |
1221 | /* Do we trust the cached ESTALE? */ | 1221 | /* Do we trust the cached ESTALE? */ |
1222 | if (NFS_ATTRTIMEO(inode) != 0) { | 1222 | if (NFS_ATTRTIMEO(inode) != 0) { |
1223 | if (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ATIME)) { | 1223 | if (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME)) { |
1224 | /* no */ | 1224 | /* no */ |
1225 | } else | 1225 | } else |
1226 | goto out; | 1226 | goto out; |
@@ -1251,8 +1251,6 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) | |||
1251 | } | 1251 | } |
1252 | spin_unlock(&inode->i_lock); | 1252 | spin_unlock(&inode->i_lock); |
1253 | 1253 | ||
1254 | nfs_revalidate_mapping(inode, inode->i_mapping); | ||
1255 | |||
1256 | if (nfsi->cache_validity & NFS_INO_INVALID_ACL) | 1254 | if (nfsi->cache_validity & NFS_INO_INVALID_ACL) |
1257 | nfs_zap_acl_cache(inode); | 1255 | nfs_zap_acl_cache(inode); |
1258 | 1256 | ||
@@ -1287,7 +1285,7 @@ int nfs_attribute_timeout(struct inode *inode) | |||
1287 | int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) | 1285 | int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) |
1288 | { | 1286 | { |
1289 | nfs_inc_stats(inode, NFSIOS_INODEREVALIDATE); | 1287 | nfs_inc_stats(inode, NFSIOS_INODEREVALIDATE); |
1290 | if (!(NFS_I(inode)->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA)) | 1288 | if (!(NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATTR) |
1291 | && !nfs_attribute_timeout(inode)) | 1289 | && !nfs_attribute_timeout(inode)) |
1292 | return NFS_STALE(inode) ? -ESTALE : 0; | 1290 | return NFS_STALE(inode) ? -ESTALE : 0; |
1293 | return __nfs_revalidate_inode(server, inode); | 1291 | return __nfs_revalidate_inode(server, inode); |
@@ -1298,9 +1296,16 @@ int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) | |||
1298 | * @inode - pointer to host inode | 1296 | * @inode - pointer to host inode |
1299 | * @mapping - pointer to mapping | 1297 | * @mapping - pointer to mapping |
1300 | */ | 1298 | */ |
1301 | void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) | 1299 | int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) |
1302 | { | 1300 | { |
1303 | struct nfs_inode *nfsi = NFS_I(inode); | 1301 | struct nfs_inode *nfsi = NFS_I(inode); |
1302 | int ret = 0; | ||
1303 | |||
1304 | if (NFS_STALE(inode)) | ||
1305 | ret = -ESTALE; | ||
1306 | if ((nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE) | ||
1307 | || nfs_attribute_timeout(inode)) | ||
1308 | ret = __nfs_revalidate_inode(NFS_SERVER(inode), inode); | ||
1304 | 1309 | ||
1305 | if (nfsi->cache_validity & NFS_INO_INVALID_DATA) { | 1310 | if (nfsi->cache_validity & NFS_INO_INVALID_DATA) { |
1306 | nfs_inc_stats(inode, NFSIOS_DATAINVALIDATE); | 1311 | nfs_inc_stats(inode, NFSIOS_DATAINVALIDATE); |
@@ -1321,6 +1326,7 @@ void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) | |||
1321 | inode->i_sb->s_id, | 1326 | inode->i_sb->s_id, |
1322 | (long long)NFS_FILEID(inode)); | 1327 | (long long)NFS_FILEID(inode)); |
1323 | } | 1328 | } |
1329 | return ret; | ||
1324 | } | 1330 | } |
1325 | 1331 | ||
1326 | /** | 1332 | /** |