diff options
Diffstat (limited to 'fs/nfs/inode.c')
-rw-r--r-- | fs/nfs/inode.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index b77b328a06d7..0adc7d245b3d 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -442,8 +442,9 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st | |||
442 | nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATTR); | 442 | nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATTR); |
443 | if (fattr->valid & NFS_ATTR_FATTR_CHANGE) | 443 | if (fattr->valid & NFS_ATTR_FATTR_CHANGE) |
444 | inode->i_version = fattr->change_attr; | 444 | inode->i_version = fattr->change_attr; |
445 | else if (nfs_server_capable(inode, NFS_CAP_CHANGE_ATTR)) | 445 | else |
446 | nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATTR); | 446 | nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATTR |
447 | | NFS_INO_REVAL_PAGECACHE); | ||
447 | if (fattr->valid & NFS_ATTR_FATTR_SIZE) | 448 | if (fattr->valid & NFS_ATTR_FATTR_SIZE) |
448 | inode->i_size = nfs_size_to_loff_t(fattr->size); | 449 | inode->i_size = nfs_size_to_loff_t(fattr->size); |
449 | else | 450 | else |
@@ -1244,9 +1245,11 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat | |||
1244 | if (fattr->valid & NFS_ATTR_FATTR_SIZE) { | 1245 | if (fattr->valid & NFS_ATTR_FATTR_SIZE) { |
1245 | cur_size = i_size_read(inode); | 1246 | cur_size = i_size_read(inode); |
1246 | new_isize = nfs_size_to_loff_t(fattr->size); | 1247 | new_isize = nfs_size_to_loff_t(fattr->size); |
1247 | if (cur_size != new_isize && nfsi->nrequests == 0) | 1248 | if (cur_size != new_isize) |
1248 | invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; | 1249 | invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; |
1249 | } | 1250 | } |
1251 | if (nfsi->nrequests != 0) | ||
1252 | invalid &= ~NFS_INO_REVAL_PAGECACHE; | ||
1250 | 1253 | ||
1251 | /* Have any file permissions changed? */ | 1254 | /* Have any file permissions changed? */ |
1252 | if ((fattr->valid & NFS_ATTR_FATTR_MODE) && (inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO)) | 1255 | if ((fattr->valid & NFS_ATTR_FATTR_MODE) && (inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO)) |
@@ -1684,13 +1687,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
1684 | invalid |= NFS_INO_INVALID_ATTR | 1687 | invalid |= NFS_INO_INVALID_ATTR |
1685 | | NFS_INO_INVALID_DATA | 1688 | | NFS_INO_INVALID_DATA |
1686 | | NFS_INO_INVALID_ACCESS | 1689 | | NFS_INO_INVALID_ACCESS |
1687 | | NFS_INO_INVALID_ACL | 1690 | | NFS_INO_INVALID_ACL; |
1688 | | NFS_INO_REVAL_PAGECACHE; | ||
1689 | if (S_ISDIR(inode->i_mode)) | 1691 | if (S_ISDIR(inode->i_mode)) |
1690 | nfs_force_lookup_revalidate(inode); | 1692 | nfs_force_lookup_revalidate(inode); |
1691 | inode->i_version = fattr->change_attr; | 1693 | inode->i_version = fattr->change_attr; |
1692 | } | 1694 | } |
1693 | } else if (server->caps & NFS_CAP_CHANGE_ATTR) | 1695 | } else |
1694 | nfsi->cache_validity |= save_cache_validity; | 1696 | nfsi->cache_validity |= save_cache_validity; |
1695 | 1697 | ||
1696 | if (fattr->valid & NFS_ATTR_FATTR_MTIME) { | 1698 | if (fattr->valid & NFS_ATTR_FATTR_MTIME) { |
@@ -1717,7 +1719,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
1717 | if ((nfsi->nrequests == 0) || new_isize > cur_isize) { | 1719 | if ((nfsi->nrequests == 0) || new_isize > cur_isize) { |
1718 | i_size_write(inode, new_isize); | 1720 | i_size_write(inode, new_isize); |
1719 | invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA; | 1721 | invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA; |
1720 | invalid &= ~NFS_INO_REVAL_PAGECACHE; | ||
1721 | } | 1722 | } |
1722 | dprintk("NFS: isize change on server for file %s/%ld " | 1723 | dprintk("NFS: isize change on server for file %s/%ld " |
1723 | "(%Ld to %Ld)\n", | 1724 | "(%Ld to %Ld)\n", |