NFS: Fix a connectathon regression in NFSv3 and NFSv4

We're failing basic test6 against Linux servers because they lack a correct
change attribute. The fix is to assume that we always want to invalidate
the readdir caches when we call update_changeattr and/or
nfs_post_op_update_inode on a directory.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

+13 -7
+9 -1
fs/nfs/inode.c
··· 876 876 { 877 877 struct nfs_inode *nfsi = NFS_I(inode); 878 878 879 - if (fattr->valid & NFS_ATTR_FATTR) 879 + if (fattr->valid & NFS_ATTR_FATTR) { 880 + if (S_ISDIR(inode->i_mode)) { 881 + spin_lock(&inode->i_lock); 882 + nfsi->cache_validity |= NFS_INO_INVALID_DATA; 883 + spin_unlock(&inode->i_lock); 884 + } 880 885 return nfs_refresh_inode(inode, fattr); 886 + } 881 887 882 888 spin_lock(&inode->i_lock); 883 889 nfsi->cache_validity |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; 890 + if (S_ISDIR(inode->i_mode)) 891 + nfsi->cache_validity |= NFS_INO_INVALID_DATA; 884 892 spin_unlock(&inode->i_lock); 885 893 return 0; 886 894 }
+4 -6
fs/nfs/nfs4proc.c
··· 208 208 struct nfs_inode *nfsi = NFS_I(dir); 209 209 210 210 spin_lock(&dir->i_lock); 211 - if (cinfo->after != nfsi->change_attr) { 212 - nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA; 213 - if (!cinfo->atomic || cinfo->before != nfsi->change_attr) 214 - nfsi->cache_change_attribute = jiffies; 215 - nfsi->change_attr = cinfo->after; 216 - } 211 + nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA; 212 + if (!cinfo->atomic || cinfo->before != nfsi->change_attr) 213 + nfsi->cache_change_attribute = jiffies; 214 + nfsi->change_attr = cinfo->after; 217 215 spin_unlock(&dir->i_lock); 218 216 } 219 217