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
2 changed files with 26 additions and 9 deletions
|
@ -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 a new issue