mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-02 22:54:52 +00:00
Revert "nfsd: Fix NFSv4.1/4.2 Claim_Deleg_Cur_FH"
This reverts commitf300335d9a
. 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. (cherry picked from commit54c3aa02e9
)
This commit is contained in:
parent
1799750704
commit
fba90651e4
|
@ -3006,18 +3006,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;
|
||||
|
|
|
@ -2555,10 +2555,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
|
||||
|
@ -2569,8 +2565,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) ||
|
||||
|
@ -2821,10 +2817,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
|
||||
|
@ -2835,8 +2827,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) ||
|
||||
|
|
Loading…
Reference in a new issue