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  			nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATTR);  		if (fattr->valid & NFS_ATTR_FATTR_CHANGE)  			inode->i_version = fattr->change_attr; -		else if (nfs_server_capable(inode, NFS_CAP_CHANGE_ATTR)) -			nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATTR); +		else +			nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATTR +				| NFS_INO_REVAL_PAGECACHE);  		if (fattr->valid & NFS_ATTR_FATTR_SIZE)  			inode->i_size = nfs_size_to_loff_t(fattr->size);  		else @@ -1244,9 +1245,11 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat  	if (fattr->valid & NFS_ATTR_FATTR_SIZE) {  		cur_size = i_size_read(inode);  		new_isize = nfs_size_to_loff_t(fattr->size); -		if (cur_size != new_isize && nfsi->nrequests == 0) +		if (cur_size != new_isize)  			invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;  	} +	if (nfsi->nrequests != 0) +		invalid &= ~NFS_INO_REVAL_PAGECACHE;  	/* Have any file permissions changed? */  	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)  			invalid |= NFS_INO_INVALID_ATTR  				| NFS_INO_INVALID_DATA  				| NFS_INO_INVALID_ACCESS -				| NFS_INO_INVALID_ACL -				| NFS_INO_REVAL_PAGECACHE; +				| NFS_INO_INVALID_ACL;  			if (S_ISDIR(inode->i_mode))  				nfs_force_lookup_revalidate(inode);  			inode->i_version = fattr->change_attr;  		} -	} else if (server->caps & NFS_CAP_CHANGE_ATTR) +	} else  		nfsi->cache_validity |= save_cache_validity;  	if (fattr->valid & NFS_ATTR_FATTR_MTIME) { @@ -1717,7 +1719,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)  			if ((nfsi->nrequests == 0) || new_isize > cur_isize) {  				i_size_write(inode, new_isize);  				invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA; -				invalid &= ~NFS_INO_REVAL_PAGECACHE;  			}  			dprintk("NFS: isize change on server for file %s/%ld "  					"(%Ld to %Ld)\n",  |