aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/inode.c19
1 files changed, 6 insertions, 13 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 4f12c57456f..eddd0e982d2 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1406,18 +1406,12 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat
1406 nfs_wcc_update_inode(inode, fattr); 1406 nfs_wcc_update_inode(inode, fattr);
1407 1407
1408 if ((fattr->valid & NFS_ATTR_FATTR_V4) != 0 && 1408 if ((fattr->valid & NFS_ATTR_FATTR_V4) != 0 &&
1409 nfsi->change_attr != fattr->change_attr) { 1409 nfsi->change_attr != fattr->change_attr)
1410 nfsi->cache_validity |= NFS_INO_INVALID_ATTR; 1410 nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
1411 if (!data_unstable)
1412 nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE;
1413 }
1414 1411
1415 /* Verify a few of the more important attributes */ 1412 /* Verify a few of the more important attributes */
1416 if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) { 1413 if (!timespec_equal(&inode->i_mtime, &fattr->mtime))
1417 nfsi->cache_validity |= NFS_INO_INVALID_ATTR; 1414 nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
1418 if (!data_unstable)
1419 nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE;
1420 }
1421 1415
1422 cur_size = i_size_read(inode); 1416 cur_size = i_size_read(inode);
1423 new_isize = nfs_size_to_loff_t(fattr->size); 1417 new_isize = nfs_size_to_loff_t(fattr->size);
@@ -1459,7 +1453,6 @@ int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
1459 if ((fattr->valid & NFS_ATTR_FATTR) == 0) 1453 if ((fattr->valid & NFS_ATTR_FATTR) == 0)
1460 return 0; 1454 return 0;
1461 spin_lock(&inode->i_lock); 1455 spin_lock(&inode->i_lock);
1462 nfsi->cache_validity &= ~NFS_INO_REVAL_PAGECACHE;
1463 if (time_after(fattr->time_start, nfsi->last_updated)) 1456 if (time_after(fattr->time_start, nfsi->last_updated))
1464 status = nfs_update_inode(inode, fattr); 1457 status = nfs_update_inode(inode, fattr);
1465 else 1458 else
@@ -1484,7 +1477,7 @@ int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr)
1484 1477
1485 spin_lock(&inode->i_lock); 1478 spin_lock(&inode->i_lock);
1486 if (unlikely((fattr->valid & NFS_ATTR_FATTR) == 0)) { 1479 if (unlikely((fattr->valid & NFS_ATTR_FATTR) == 0)) {
1487 nfsi->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS; 1480 nfsi->cache_validity |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
1488 goto out; 1481 goto out;
1489 } 1482 }
1490 status = nfs_update_inode(inode, fattr); 1483 status = nfs_update_inode(inode, fattr);
@@ -1534,7 +1527,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
1534 /* Are we racing with known updates of the metadata on the server? */ 1527 /* Are we racing with known updates of the metadata on the server? */
1535 data_stable = nfs_verify_change_attribute(inode, fattr->time_start); 1528 data_stable = nfs_verify_change_attribute(inode, fattr->time_start);
1536 if (data_stable) 1529 if (data_stable)
1537 nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME); 1530 nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_ATIME);
1538 1531
1539 /* Do atomic weak cache consistency updates */ 1532 /* Do atomic weak cache consistency updates */
1540 nfs_wcc_update_inode(inode, fattr); 1533 nfs_wcc_update_inode(inode, fattr);