diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
| -rw-r--r-- | fs/nfs/nfs4proc.c | 13 | 
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 0f24cdf2cb1..4435e5e1f90 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -2852,8 +2852,10 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,  	nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);  	res.pgbase = args.pgbase;  	status = nfs4_call_sync(NFS_SERVER(dir), &msg, &args, &res, 0); -	if (status == 0) +	if (status >= 0) {  		memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE); +		status += args.pgbase; +	}  	nfs_invalidate_atime(dir); @@ -3359,6 +3361,8 @@ static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen)  	ret = nfs_revalidate_inode(server, inode);  	if (ret < 0)  		return ret; +	if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL) +		nfs_zap_acl_cache(inode);  	ret = nfs4_read_cached_acl(inode, buf, buflen);  	if (ret != -ENOENT)  		return ret; @@ -3387,6 +3391,13 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl  	nfs_inode_return_delegation(inode);  	buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase);  	ret = nfs4_call_sync(server, &msg, &arg, &res, 1); +	/* +	 * Acl update can result in inode attribute update. +	 * so mark the attribute cache invalid. +	 */ +	spin_lock(&inode->i_lock); +	NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR; +	spin_unlock(&inode->i_lock);  	nfs_access_zap_cache(inode);  	nfs_zap_acl_cache(inode);  	return ret;  |