Revert "nfsd: Fix NFSv4.1/4.2 Claim_Deleg_Cur_FH"

This reverts commit f300335d9a.

It turns out that the old code was correct and it was wireshark
that was broken and indicated that the RPC's XDR was bogus.
Found during IETF bakeathon testing this week.
This commit is contained in:
Rick Macklem 2024-04-25 09:41:23 -07:00
parent 514773a548
commit 54c3aa02e9
2 changed files with 6 additions and 20 deletions

View file

@ -3003,18 +3003,12 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
*/
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
claim = fxdr_unsigned(int, *tl);
if (claim == NFSV4OPEN_CLAIMDELEGATECUR) {
if (claim == NFSV4OPEN_CLAIMDELEGATECUR || claim ==
NFSV4OPEN_CLAIMDELEGATECURFH) {
NFSM_DISSECT(tl, u_int32_t *, NFSX_STATEID);
stateid.seqid = fxdr_unsigned(u_int32_t, *tl++);
NFSBCOPY((caddr_t)tl,(caddr_t)stateid.other,NFSX_STATEIDOTHER);
stp->ls_flags |= NFSLCK_DELEGCUR;
} else if (claim == NFSV4OPEN_CLAIMDELEGATECURFH) {
/* Fill in most of the stateid from the clientid. */
stateid.seqid = 0;
stateid.other[0] = clientid.lval[0];
stateid.other[1] = clientid.lval[1];
stateid.other[2] = 0;
stp->ls_flags |= NFSLCK_DELEGCUR;
} else if (claim == NFSV4OPEN_CLAIMDELEGATEPREV || claim ==
NFSV4OPEN_CLAIMDELEGATEPREVFH) {
stp->ls_flags |= NFSLCK_DELEGPREV;

View file

@ -2568,10 +2568,6 @@ nfsrv_opencheck(nfsquad_t clientid, nfsv4stateid_t *stateidp,
/*
* For Delegate_Cur, search for the matching Delegation,
* which indicates no conflict.
* For NFSv4.1/4.2 Claim_Deleg_Cur_FH only provides
* the clientid, which is the first two "other" elements
* for the stateid. This should be sufficient, since there
* is only one delegation per client and file.
* An old delegation should have been recovered by the
* client doing a Claim_DELEGATE_Prev, so I won't let
* it match and return NFSERR_EXPIRED. Should I let it
@ -2582,8 +2578,8 @@ nfsrv_opencheck(nfsquad_t clientid, nfsv4stateid_t *stateidp,
(((nd->nd_flag & ND_NFSV41) != 0 &&
stateidp->seqid == 0) ||
stateidp->seqid == stp->ls_stateid.seqid) &&
stateidp->other[0] == stp->ls_stateid.other[0] &&
stateidp->other[1] == stp->ls_stateid.other[1])
!NFSBCMP(stateidp->other, stp->ls_stateid.other,
NFSX_STATEIDOTHER))
break;
}
if (stp == LIST_END(&lfp->lf_deleg) ||
@ -2834,10 +2830,6 @@ nfsrv_openctrl(struct nfsrv_descript *nd, vnode_t vp,
/*
* For Delegate_Cur, search for the matching Delegation,
* which indicates no conflict.
* For NFSv4.1/4.2 Claim_Deleg_Cur_FH only provides
* the clientid, which is the first two "other" elements
* for the stateid. This should be sufficient, since there
* is only one delegation per client and file.
* An old delegation should have been recovered by the
* client doing a Claim_DELEGATE_Prev, so I won't let
* it match and return NFSERR_EXPIRED. Should I let it
@ -2848,8 +2840,8 @@ nfsrv_openctrl(struct nfsrv_descript *nd, vnode_t vp,
(((nd->nd_flag & ND_NFSV41) != 0 &&
stateidp->seqid == 0) ||
stateidp->seqid == stp->ls_stateid.seqid) &&
stateidp->other[0] == stp->ls_stateid.other[0] &&
stateidp->other[1] == stp->ls_stateid.other[1])
!NFSBCMP(stateidp->other, stp->ls_stateid.other,
NFSX_STATEIDOTHER))
break;
}
if (stp == LIST_END(&lfp->lf_deleg) ||