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
|
@ -87,8 +87,7 @@ __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy,
|
|||
res = 0;
|
||||
break;
|
||||
case -ENOENT:
|
||||
if (res != 0)
|
||||
res = htonl(NFS4ERR_BAD_STATEID);
|
||||
res = htonl(NFS4ERR_BAD_STATEID);
|
||||
break;
|
||||
default:
|
||||
res = htonl(NFS4ERR_RESOURCE);
|
||||
|
@ -325,10 +324,11 @@ int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation, const n
|
|||
if (delegation == NULL)
|
||||
return 0;
|
||||
|
||||
if (stateid->stateid.seqid != 0)
|
||||
if (stateid->stateid.seqid != 0 &&
|
||||
stateid->stateid.seqid != delegation->stateid.stateid.seqid)
|
||||
return 0;
|
||||
if (memcmp(&delegation->stateid.stateid.other,
|
||||
&stateid->stateid.other,
|
||||
if (memcmp(delegation->stateid.stateid.other,
|
||||
stateid->stateid.other,
|
||||
NFS4_STATEID_OTHER_SIZE))
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -542,7 +542,7 @@ void nfs_expire_unreferenced_delegations(struct nfs_client *clp)
|
|||
/**
|
||||
* nfs_async_inode_return_delegation - asynchronously return a delegation
|
||||
* @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.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue