From nobody Wed Jun 18 20:12:41 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bMvzt0T0vz5q6BN; Wed, 18 Jun 2025 20:12:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bMvzs71T1z3YJV; Wed, 18 Jun 2025 20:12:41 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1750277562; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=L6otd2ksLwQr3ec0jvVEcvUEcVZLr1h4S81UCeJ6LQI=; b=mD6WCOGTt5o0QRcs1j6zyMFcF3nnsrqnudoR9ENWEfnjIiye8iHWufEJmNShhR/LeB24m+ 9PX11rZNhxzbAjI0YnSeKxVV2832BR+w/2TSyQoHdr6pXLi4yG6KCExCYbTgiW8Msj0fSL 9roXHNz9d5m9umCanp4x61YdviVOamJWILvokW+3LCfarHhhZzlibkY5tPK2iVBB0SI6Pe sU4cTM7Ipsxkf33NLIE+/c2k69HMMrgnlxddGHqFJ4Vtsq3+s1nTKPAMovaDAO3hmZGAOE LgojQcyPNW55KrYvr+7eBodFB9EINd7tM1WAY/l9im8cAuDACoLtLnwQQ4ineQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1750277562; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=L6otd2ksLwQr3ec0jvVEcvUEcVZLr1h4S81UCeJ6LQI=; b=NG4OwjM1Nk23wGsO5NudoXCsxpuF5HVSVJVw33eG+gtxbm9bGyIFv+m+7QNVRT2oo5HH89 9K+duVCfNv0GDb3uZXS63W23vsve11zhqD4RU9YJmnRDAWm7apDomi6Yy9FKVjIxD8Ubkr JsrWGMi/ubrFkLTIh6k5Mme540GZNQ24+5vuH3ByQqrxI8Zsuz3RsToVq6Kx29L5/iIhZS odZN7/bF6p/AUupUQrkTfnYGvgT8yrWVMnlbUPA09EDExjahlc9OS6xKoNs7Ywpb2Xjq/Q 7Ygh16Mef6Qu/RGCd9XxAMP+2aKhAbtqBmPslH+l4YvbRNobCUUNNrYjU46TSQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1750277562; a=rsa-sha256; cv=none; b=WqhrtgXl7/FXpTsdtN9fF+/DPrC0YCdaXkLX+uAlWsXNs8Abcv2kpTf/rpLUIWiU6feXwV PfDJw5GRVL/pX9xTioiedLWAoQh/DXxNTi2r6xdunxyDR0/jlDgwKW2AuvqIqThcGv0OZR pWLHhdhvN9LWdSysQDEp0ONOULhWGIj4mUQn130yRFJKcM5DNrDUbWQ+ulWxTTi+98H1S4 nNa1o9mXOH0Hqdv5YKwuoJHYQ8PduHBAvkAL4jqeTZYgMhDuEKuohWXu+hBRHt8kss+I1G cN5OvCwbTukQ0CL8A3bEZFA81oduk2kRE28BsO6LE5IUV0S71X5kGl/2T3tNjQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4bMvzs6GHmzl2t; Wed, 18 Jun 2025 20:12:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 55IKCf71054999; Wed, 18 Jun 2025 20:12:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 55IKCfKB054996; Wed, 18 Jun 2025 20:12:41 GMT (envelope-from git) Date: Wed, 18 Jun 2025 20:12:41 GMT Message-Id: <202506182012.55IKCfKB054996@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Rick Macklem Subject: git: a2408c4e976a - stable/14 - nfsd: Fix accumulating nfslockfile structures List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: rmacklem X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: a2408c4e976a9499358e40cc326cb1ce4bd6de7a Auto-Submitted: auto-generated The branch stable/14 has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=a2408c4e976a9499358e40cc326cb1ce4bd6de7a commit a2408c4e976a9499358e40cc326cb1ce4bd6de7a Author: Rick Macklem AuthorDate: 2025-06-04 23:09:01 +0000 Commit: Rick Macklem CommitDate: 2025-06-18 20:09:54 +0000 nfsd: Fix accumulating nfslockfile structures If a NFSv4 client does an exclusive open where the file already exists, the server returns EEXIST. However, without this patch, a partially filled in nfslockfile structure is allocated, but is not referenced by any open and, as such, never gets freed. This patch fixes the bug by checking for EEXIST before calling nfsvno_open(). (cherry picked from commit 1749465947a807caa53ce09b90a30b820eaab62e) --- sys/fs/nfsserver/nfs_nfsdserv.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index a38ef3d47946..7ac5b61b0ae9 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -2829,7 +2829,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, int how = NFSCREATE_UNCHECKED; int32_t cverf[2], tverf[2] = { 0, 0 }; vnode_t vp = NULL, dirp = NULL; - struct nfsvattr nva, dirfor, diraft; + struct nfsvattr nva, dirfor, diraft, nva2; struct nameidata named; nfsv4stateid_t stateid, delegstateid; nfsattrbit_t attrbits; @@ -3076,11 +3076,23 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, } break; case NFSCREATE_EXCLUSIVE: - exclusive_flag = 1; if (nd->nd_repstat == 0 && named.ni_vp == NULL) nva.na_mode = 0; - break; + /* FALLTHROUGH */ case NFSCREATE_EXCLUSIVE41: + if (nd->nd_repstat == 0 && named.ni_vp != NULL) { + nd->nd_repstat = nfsvno_getattr(named.ni_vp, + &nva2, nd, p, 1, NULL); + if (nd->nd_repstat == 0) { + tverf[0] = nva2.na_atime.tv_sec; + tverf[1] = nva2.na_atime.tv_nsec; + if (cverf[0] != tverf[0] || + cverf[1] != tverf[1])) + nd->nd_repstat = EEXIST; + } + if (nd->nd_repstat != 0) + done_namei = true; + } exclusive_flag = 1; break; } @@ -3170,16 +3182,8 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, NFSACCCHK_VPISLOCKED, NULL); } - if (!nd->nd_repstat) { + if (!nd->nd_repstat) nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, NULL); - if (!nd->nd_repstat) { - tverf[0] = nva.na_atime.tv_sec; - tverf[1] = nva.na_atime.tv_nsec; - } - } - if (!nd->nd_repstat && exclusive_flag && (cverf[0] != tverf[0] || - cverf[1] != tverf[1])) - nd->nd_repstat = EEXIST; /* * Do the open locking/delegation stuff. */