mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
				synced 2025-11-04 16:52:06 +10:00 
			
		
		
		
	nfs4: add nfs4_check_delegation
Signed-off-by: Peng Tao <tao.peng@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
		
							parent
							
								
									0b0bc6ea77
								
							
						
					
					
						commit
						15bb3afe90
					
				@ -41,14 +41,8 @@ void nfs_mark_delegation_referenced(struct nfs_delegation *delegation)
 | 
			
		||||
	set_bit(NFS_DELEGATION_REFERENCED, &delegation->flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * nfs_have_delegation - check if inode has a delegation
 | 
			
		||||
 * @inode: inode to check
 | 
			
		||||
 * @flags: delegation types to check for
 | 
			
		||||
 *
 | 
			
		||||
 * Returns one if inode has the indicated delegation, otherwise zero.
 | 
			
		||||
 */
 | 
			
		||||
int nfs4_have_delegation(struct inode *inode, fmode_t flags)
 | 
			
		||||
static int
 | 
			
		||||
nfs4_do_check_delegation(struct inode *inode, fmode_t flags, bool mark)
 | 
			
		||||
{
 | 
			
		||||
	struct nfs_delegation *delegation;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
@ -58,12 +52,34 @@ int nfs4_have_delegation(struct inode *inode, fmode_t flags)
 | 
			
		||||
	delegation = rcu_dereference(NFS_I(inode)->delegation);
 | 
			
		||||
	if (delegation != NULL && (delegation->type & flags) == flags &&
 | 
			
		||||
	    !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) {
 | 
			
		||||
		nfs_mark_delegation_referenced(delegation);
 | 
			
		||||
		if (mark)
 | 
			
		||||
			nfs_mark_delegation_referenced(delegation);
 | 
			
		||||
		ret = 1;
 | 
			
		||||
	}
 | 
			
		||||
	rcu_read_unlock();
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * nfs_have_delegation - check if inode has a delegation, mark it
 | 
			
		||||
 * NFS_DELEGATION_REFERENCED if there is one.
 | 
			
		||||
 * @inode: inode to check
 | 
			
		||||
 * @flags: delegation types to check for
 | 
			
		||||
 *
 | 
			
		||||
 * Returns one if inode has the indicated delegation, otherwise zero.
 | 
			
		||||
 */
 | 
			
		||||
int nfs4_have_delegation(struct inode *inode, fmode_t flags)
 | 
			
		||||
{
 | 
			
		||||
	return nfs4_do_check_delegation(inode, flags, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * nfs4_check_delegation - check if inode has a delegation, do not mark
 | 
			
		||||
 * NFS_DELEGATION_REFERENCED if it has one.
 | 
			
		||||
 */
 | 
			
		||||
int nfs4_check_delegation(struct inode *inode, fmode_t flags)
 | 
			
		||||
{
 | 
			
		||||
	return nfs4_do_check_delegation(inode, flags, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -59,6 +59,7 @@ bool nfs4_copy_delegation_stateid(nfs4_stateid *dst, struct inode *inode, fmode_
 | 
			
		||||
 | 
			
		||||
void nfs_mark_delegation_referenced(struct nfs_delegation *delegation);
 | 
			
		||||
int nfs4_have_delegation(struct inode *inode, fmode_t flags);
 | 
			
		||||
int nfs4_check_delegation(struct inode *inode, fmode_t flags);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user