aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2007-09-27 15:57:24 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2007-10-09 17:18:57 -0400
commit47aabaa7e45385fee4a535a6f6e523ff944e1684 (patch)
tree7f780c414b5037b45cc1eb3fee64e083913fb45c
parent17cadc95372e28024be0874e67329c1862912c5d (diff)
NFSv4: Don't use ctime/mtime for determining when to invalidate the caches
In NFSv4 we should only be looking at the change attribute. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/nfs/inode.c47
1 files changed, 24 insertions, 23 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 7e73edc1751f..cd57f795229e 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -976,6 +976,27 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
976 /* Do atomic weak cache consistency updates */ 976 /* Do atomic weak cache consistency updates */
977 nfs_wcc_update_inode(inode, fattr); 977 nfs_wcc_update_inode(inode, fattr);
978 978
979 /* More cache consistency checks */
980 if (!(fattr->valid & NFS_ATTR_FATTR_V4)) {
981 /* NFSv2/v3: Check if the mtime agrees */
982 if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) {
983 dprintk("NFS: mtime change on server for file %s/%ld\n",
984 inode->i_sb->s_id, inode->i_ino);
985 invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
986 nfsi->cache_change_attribute = now;
987 }
988 /* If ctime has changed we should definitely clear access+acl caches */
989 if (!timespec_equal(&inode->i_ctime, &fattr->ctime)) {
990 invalid |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
991 nfsi->cache_change_attribute = now;
992 }
993 } else if (nfsi->change_attr != fattr->change_attr) {
994 dprintk("NFS: change_attr change on server for file %s/%ld\n",
995 inode->i_sb->s_id, inode->i_ino);
996 invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
997 nfsi->cache_change_attribute = now;
998 }
999
979 /* Check if our cached file size is stale */ 1000 /* Check if our cached file size is stale */
980 new_isize = nfs_size_to_loff_t(fattr->size); 1001 new_isize = nfs_size_to_loff_t(fattr->size);
981 cur_isize = i_size_read(inode); 1002 cur_isize = i_size_read(inode);
@@ -997,22 +1018,11 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
997 inode->i_sb->s_id, inode->i_ino); 1018 inode->i_sb->s_id, inode->i_ino);
998 } 1019 }
999 1020
1000 /* Check if the mtime agrees */
1001 if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) {
1002 memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
1003 dprintk("NFS: mtime change on server for file %s/%ld\n",
1004 inode->i_sb->s_id, inode->i_ino);
1005 invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
1006 nfsi->cache_change_attribute = now;
1007 }
1008 1021
1009 /* If ctime has changed we should definitely clear access+acl caches */ 1022 memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
1010 if (!timespec_equal(&inode->i_ctime, &fattr->ctime)) { 1023 memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
1011 invalid |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
1012 memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
1013 nfsi->cache_change_attribute = now;
1014 }
1015 memcpy(&inode->i_atime, &fattr->atime, sizeof(inode->i_atime)); 1024 memcpy(&inode->i_atime, &fattr->atime, sizeof(inode->i_atime));
1025 nfsi->change_attr = fattr->change_attr;
1016 1026
1017 if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO) || 1027 if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO) ||
1018 inode->i_uid != fattr->uid || 1028 inode->i_uid != fattr->uid ||
@@ -1033,15 +1043,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
1033 inode->i_blocks = fattr->du.nfs2.blocks; 1043 inode->i_blocks = fattr->du.nfs2.blocks;
1034 } 1044 }
1035 1045
1036 if ((fattr->valid & NFS_ATTR_FATTR_V4) != 0 &&
1037 nfsi->change_attr != fattr->change_attr) {
1038 dprintk("NFS: change_attr change on server for file %s/%ld\n",
1039 inode->i_sb->s_id, inode->i_ino);
1040 nfsi->change_attr = fattr->change_attr;
1041 invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
1042 nfsi->cache_change_attribute = now;
1043 }
1044
1045 /* Update attrtimeo value if we're out of the unstable period */ 1046 /* Update attrtimeo value if we're out of the unstable period */
1046 if (invalid & NFS_INO_INVALID_ATTR) { 1047 if (invalid & NFS_INO_INVALID_ATTR) {
1047 nfs_inc_stats(inode, NFSIOS_ATTRINVALIDATE); 1048 nfs_inc_stats(inode, NFSIOS_ATTRINVALIDATE);