From nobody Sat Mar 30 01:06:32 2024 X-Original-To: dev-commits-src-branches@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 4V5zcn3vXsz5Fk7k; Sat, 30 Mar 2024 01:06:33 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4V5zcn0czPz4jtn; Sat, 30 Mar 2024 01:06:33 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1711760793; 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=mJ1PJUWhedAtJUR/BHJz5aK4FtBJeaww9KAexA1bdzU=; b=gPi+9ycV8dpu/6seYmslkidOpPFUuOfiA4CNtSY4x6t3fMd27RCaZl6JFtMWpG1Oz67uTV F1TAOieXMNHen2pAiIF0JVDKMsf+Qxr2fsif2Jq/YOepUyYeLB2wJg0uyosOz4bktwGmKw xamM4NEPj77p4aNdsjYqSR/ANzOBL/wPMKaKAjMNo9LFuh5hzdXEkpW4WGEygUCUHjU9W8 hfeG0Q4uFmGX8d5f8F4uncsg4H2i49sgFAYWeOhTKxLIMPu6edTKvjtFaf7w/3zm8YhpYX xZk2S5thu8zC5S7tm4TEjqhx+HlPxa7FRG0Pa2EEry5LNTvXDcMxe2z6uwKLLw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1711760793; a=rsa-sha256; cv=none; b=qka2BbRZst/ubLcNcw6qN3prYdS2xxVRr0swOhNPULFe/CefMeGA07bKHIAJ5Ji0SV9vmC 3bTKWY7afzeGtmrvrMvGbsHN4e+NtCfsFqc0OEJkEPZ/4GOJBmjnjqz6gM93wdjcbd7p1y CNUbZG0WbktqsKsWbJ72tHBI9YAnsbqilQP+0hnBu6qplF93T2BuKqHSxqg1F75Qi4t4Rm Ohp00RhnJuhoqQfNJBtybLcjmSTmuJHRQOLZf8/rHsC0SKQ3afYWPafv/XPS2FxJW+0kZk irMxq8LGi/FXFiAgdi7qk4Bk976DbzuwOdrldhXamlsI6PqrvZ5OcKFJm2GTmQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1711760793; 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=mJ1PJUWhedAtJUR/BHJz5aK4FtBJeaww9KAexA1bdzU=; b=KUKyTiWjH3ceakAlr+51UQIA7DfjMz7TAi+ukTheCGDXiT3cLLJqDOEGbWUQsNfK/AGTUa D0tVHS6r5jf2VWG0lyYMan97p8KoquJ7c4cg1j11eh95HoOSM0aJARBn2NZe48FV8zUUh5 XPZiVqNYMJpihuTgp5T8CWaUMSwaXOuMca1gdVDAb2NJaQE7EwD6nfVmHjBlpuuJgL0gRY m2vwotCbj+026FI8ATKaicj/Q25ryZ1pxd8JQh56vpWHqpre7YLomZlUWt0t4QyLX/tFWh igkPVYHXlr/YeyAjLWjmjoaI84iAiKCMGzS6wsTGKznkY+N3R/zLb8GTQzxmcg== 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 4V5zcm74DHzYvw; Sat, 30 Mar 2024 01:06:32 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 42U16WK3081201; Sat, 30 Mar 2024 01:06:32 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 42U16Wiu081198; Sat, 30 Mar 2024 01:06:32 GMT (envelope-from git) Date: Sat, 30 Mar 2024 01:06:32 GMT Message-Id: <202403300106.42U16Wiu081198@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: d3db309653aa - stable/13 - nfsd: Add a sysctl to limit NFSv4.2 Copy RPC size List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@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/13 X-Git-Reftype: branch X-Git-Commit: d3db309653aa5eb263220296757fdf514efb55c2 Auto-Submitted: auto-generated The branch stable/13 has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=d3db309653aa5eb263220296757fdf514efb55c2 commit d3db309653aa5eb263220296757fdf514efb55c2 Author: Rick Macklem AuthorDate: 2024-03-16 01:04:37 +0000 Commit: Rick Macklem CommitDate: 2024-03-30 01:05:31 +0000 nfsd: Add a sysctl to limit NFSv4.2 Copy RPC size NFSv4.2 supports a Copy operation, which avoids file data being read to the client and then written back to the server, if both input and output files are on the same NFSv4.2 mount for copy_file_range(2). Unfortunately, this Copy operation can take a long time under certain circumstances. If this occurs concurrently with a RPC that requires an exclusive lock on the nfsd such as ExchangeID done for a new mount, the result can be an nfsd "stall" until the Copy completes. This patch adds a sysctl that can be set to limit the size of a Copy operation or, if set to 0, disable Copy operations. The use of this sysctl and other ways to avoid Copy operations taking too long will be documented in the nfsd.4 man page by a separate commit. (cherry picked from commit 748f56c53f4286e0b140c1b779ff8ade1cf4fec9) --- sys/fs/nfsserver/nfs_nfsdserv.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index 7020053be330..c1ba36347b4c 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -97,6 +97,9 @@ static bool nfsrv_doallocate = false; SYSCTL_BOOL(_vfs_nfsd, OID_AUTO, enable_v42allocate, CTLFLAG_RW, &nfsrv_doallocate, 0, "Enable NFSv4.2 Allocate operation"); +static uint64_t nfsrv_maxcopyrange = SSIZE_MAX; +SYSCTL_U64(_vfs_nfsd, OID_AUTO, maxcopyrange, CTLFLAG_RW, + &nfsrv_maxcopyrange, 0, "Max size of a Copy so RPC times reasonable"); /* * This list defines the GSS mechanisms supported. @@ -5475,10 +5478,11 @@ nfsrvd_copy_file_range(struct nfsrv_descript *nd, __unused int isdgram, void *rl_rcookie, *rl_wcookie; rl_rcookie = rl_wcookie = NULL; - if (nfsrv_devidcnt > 0) { + if (nfsrv_maxcopyrange == 0 || nfsrv_devidcnt > 0) { /* * For a pNFS server, reply NFSERR_NOTSUPP so that the client * will do the copy via I/O on the DS(s). + * If vfs.nfsd.maxcopyrange set to 0, disable Copy. */ nd->nd_repstat = NFSERR_NOTSUPP; goto nfsmout; @@ -5641,7 +5645,15 @@ nfsrvd_copy_file_range(struct nfsrv_descript *nd, __unused int isdgram, nd->nd_repstat = error; } - xfer = len; + /* + * Do the actual copy to an upper limit of vfs.nfsd.maxcopyrange. + * This size limit can be set to limit the time a copy RPC will + * take. + */ + if (len > nfsrv_maxcopyrange) + xfer = nfsrv_maxcopyrange; + else + xfer = len; if (nd->nd_repstat == 0) { nd->nd_repstat = vn_copy_file_range(vp, &inoff, tovp, &outoff, &xfer, COPY_FILE_RANGE_TIMEO1SEC, nd->nd_cred, nd->nd_cred,