|
@@ -1113,8 +1113,16 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
|
nfs_force_lookup_revalidate(inode);
|
|
|
}
|
|
|
/* If ctime has changed we should definitely clear access+acl caches */
|
|
|
- if (!timespec_equal(&inode->i_ctime, &fattr->ctime))
|
|
|
+ if (!timespec_equal(&inode->i_ctime, &fattr->ctime)) {
|
|
|
invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
|
|
|
+ /* and probably clear data for a directory too as utimes can cause
|
|
|
+ * havoc with our cache.
|
|
|
+ */
|
|
|
+ if (S_ISDIR(inode->i_mode)) {
|
|
|
+ invalid |= NFS_INO_INVALID_DATA;
|
|
|
+ nfs_force_lookup_revalidate(inode);
|
|
|
+ }
|
|
|
+ }
|
|
|
} else if (nfsi->change_attr != fattr->change_attr) {
|
|
|
dprintk("NFS: change_attr change on server for file %s/%ld\n",
|
|
|
inode->i_sb->s_id, inode->i_ino);
|
|
@@ -1148,8 +1156,11 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
|
inode->i_gid != fattr->gid)
|
|
|
invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
|
|
|
|
|
|
- if (inode->i_nlink != fattr->nlink)
|
|
|
+ if (inode->i_nlink != fattr->nlink) {
|
|
|
invalid |= NFS_INO_INVALID_ATTR;
|
|
|
+ if (S_ISDIR(inode->i_mode))
|
|
|
+ invalid |= NFS_INO_INVALID_DATA;
|
|
|
+ }
|
|
|
|
|
|
inode->i_mode = fattr->mode;
|
|
|
inode->i_nlink = fattr->nlink;
|