git: fba90651e430 - stable/13 - Revert "nfsd: Fix NFSv4.1/4.2 Claim_Deleg_Cur_FH"

From: Rick Macklem <rmacklem_at_FreeBSD.org>
Date: Sun, 28 Apr 2024 01:42:07 UTC
The branch stable/13 has been updated by rmacklem:

URL: https://cgit.FreeBSD.org/src/commit/?id=fba90651e4308508465d7bb02b8d55759922a312

commit fba90651e4308508465d7bb02b8d55759922a312
Author:     Rick Macklem <rmacklem@FreeBSD.org>
AuthorDate: 2024-04-25 16:41:23 +0000
Commit:     Rick Macklem <rmacklem@FreeBSD.org>
CommitDate: 2024-04-28 01:41:12 +0000

    Revert "nfsd: Fix NFSv4.1/4.2 Claim_Deleg_Cur_FH"
    
    This reverts commit f300335d9aebf2e99862bf783978bd44ede23550.
    
    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 commit 54c3aa02e926268ba5551cd7d28fddf38b3589a2)
---
 sys/fs/nfsserver/nfs_nfsdserv.c  | 10 ++--------
 sys/fs/nfsserver/nfs_nfsdstate.c | 16 ++++------------
 2 files changed, 6 insertions(+), 20 deletions(-)

diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c
index c1ba36347b4c..437f4b1c685d 100644
--- a/sys/fs/nfsserver/nfs_nfsdserv.c
+++ b/sys/fs/nfsserver/nfs_nfsdserv.c
@@ -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;
diff --git a/sys/fs/nfsserver/nfs_nfsdstate.c b/sys/fs/nfsserver/nfs_nfsdstate.c
index f54459947f44..06d0b79f10d5 100644
--- a/sys/fs/nfsserver/nfs_nfsdstate.c
+++ b/sys/fs/nfsserver/nfs_nfsdstate.c
@@ -2555,10 +2555,6 @@ tryagain:
 	    /*
 	     * 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 @@ tryagain:
 		    (((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 @@ tryagain:
 	    /*
 	     * 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 @@ tryagain:
 		    (((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) ||