NFSv4.1: Fix matching of the stateids when returning a delegation
nfs41_validate_delegation_stateid is broken if we supply a stateid with a non-zero sequence id. Instead of trying to match the sequence id, the function assumes that we always want to error. While this is true for a delegation callback, it is not true in general. Also fix a typo in nfs4_callback_recall. Reported-by: Andy Adamson <andros@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
a1d0b5eebc
commit
8e663f0e5f
2 changed files with 6 additions and 6 deletions
|
@ -87,8 +87,7 @@ __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy,
|
||||||
res = 0;
|
res = 0;
|
||||||
break;
|
break;
|
||||||
case -ENOENT:
|
case -ENOENT:
|
||||||
if (res != 0)
|
res = htonl(NFS4ERR_BAD_STATEID);
|
||||||
res = htonl(NFS4ERR_BAD_STATEID);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
res = htonl(NFS4ERR_RESOURCE);
|
res = htonl(NFS4ERR_RESOURCE);
|
||||||
|
@ -325,10 +324,11 @@ int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation, const n
|
||||||
if (delegation == NULL)
|
if (delegation == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (stateid->stateid.seqid != 0)
|
if (stateid->stateid.seqid != 0 &&
|
||||||
|
stateid->stateid.seqid != delegation->stateid.stateid.seqid)
|
||||||
return 0;
|
return 0;
|
||||||
if (memcmp(&delegation->stateid.stateid.other,
|
if (memcmp(delegation->stateid.stateid.other,
|
||||||
&stateid->stateid.other,
|
stateid->stateid.other,
|
||||||
NFS4_STATEID_OTHER_SIZE))
|
NFS4_STATEID_OTHER_SIZE))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -542,7 +542,7 @@ void nfs_expire_unreferenced_delegations(struct nfs_client *clp)
|
||||||
/**
|
/**
|
||||||
* nfs_async_inode_return_delegation - asynchronously return a delegation
|
* nfs_async_inode_return_delegation - asynchronously return a delegation
|
||||||
* @inode: inode to process
|
* @inode: inode to process
|
||||||
* @stateid: state ID information from CB_RECALL arguments
|
* @stateid: state ID information
|
||||||
*
|
*
|
||||||
* Returns zero on success, or a negative errno value.
|
* Returns zero on success, or a negative errno value.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue