|
@@ -1729,12 +1729,15 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
if (inode->i_version != fattr->change_attr) {
|
|
if (inode->i_version != fattr->change_attr) {
|
|
dprintk("NFS: change_attr change on server for file %s/%ld\n",
|
|
dprintk("NFS: change_attr change on server for file %s/%ld\n",
|
|
inode->i_sb->s_id, inode->i_ino);
|
|
inode->i_sb->s_id, inode->i_ino);
|
|
- invalid |= NFS_INO_INVALID_ATTR
|
|
|
|
- | NFS_INO_INVALID_DATA
|
|
|
|
- | NFS_INO_INVALID_ACCESS
|
|
|
|
- | NFS_INO_INVALID_ACL;
|
|
|
|
- if (S_ISDIR(inode->i_mode))
|
|
|
|
- nfs_force_lookup_revalidate(inode);
|
|
|
|
|
|
+ /* Could it be a race with writeback? */
|
|
|
|
+ if (nfsi->nrequests == 0) {
|
|
|
|
+ invalid |= NFS_INO_INVALID_ATTR
|
|
|
|
+ | NFS_INO_INVALID_DATA
|
|
|
|
+ | NFS_INO_INVALID_ACCESS
|
|
|
|
+ | NFS_INO_INVALID_ACL;
|
|
|
|
+ if (S_ISDIR(inode->i_mode))
|
|
|
|
+ nfs_force_lookup_revalidate(inode);
|
|
|
|
+ }
|
|
inode->i_version = fattr->change_attr;
|
|
inode->i_version = fattr->change_attr;
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|