From nobody Sat Mar 30 00:59:55 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 4V5zT80Lwlz5Fj6b; Sat, 30 Mar 2024 00:59:56 +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 4V5zT75ZHdz4j7K; Sat, 30 Mar 2024 00:59:55 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1711760395; 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=TtscYrEtXERfM01gZ3aN1+dQi5d9th4Qa65TFWRzc+k=; b=qAPsV2/0IdEPFf/DZvlKcSSrZlmbWEohOLCnM8nJ11QoKXP0Ym/rdiF0E0cqBybf245pfm NnXb66XdgygQDJK/Rzr55fT45iZfvlk4RrqdyjG48srfM149/DttwTHKHB93cMvVWnhfMg xYeqQ1tC6zvUb8NKrqKrhJbmuO3zE+sg2S9hce+zvrJ22H52h4i+T6TfHmX4iTeW8Twlxd Qt4jpdlN8UEPdRwAfgVqEjMzFDcwPfDijGRPUJfVzTDqkSO+XXDs6mqSUv1tnQFfcqLyxt nLBVEDEB8cv/TN4HhMW/Fmk6hmqSgiX+H7c7spU9bkyAdBtPRxSket5NadicFg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1711760395; a=rsa-sha256; cv=none; b=ucYhZzo2amPol0RiN2/s1u77Lcb8m9pQgisME9mfM/M8IfDrekiwVat76Kz9yF2kEAQuzG KikVM8Q+0UEZlkRShi7fd4/HfCVlbZHPpunsBexXLxXvqryB7d/nR3fJO7MRsekDL3bkdM kF0IfSPKImk8xf9WsvfXoJJ8XN0jo+NYRMg3FIBNjKVzVmv9wh0jPwE2JN2MFSsEflwLPG 7GCx47gfX6A4QFKU+Zb6ihcsJmXlGwrnBfvbfr8D0x1XLS7mTRlmLKoisnGeZZHWrYpfK6 g6u5Kwt2Fxyk6oZys8/JUKzs20Bxa/5+5gDuC9pLZWrEGCaigkb9XM5soWn1Vg== 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=1711760395; 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=TtscYrEtXERfM01gZ3aN1+dQi5d9th4Qa65TFWRzc+k=; b=T+hpU61gXUAabfoGSG4gJKYpuYLmxUlHXhwV3WwYphvI+b16aJ7Q4iIssEAloEGtyqnTA7 +cq1pA2jDYDNrEsWHGjL+DEiQJJgk55rK0W0m9AHCWYfABvfulzI+rjbGDcK9j1SqVBGJy 9/NgCfzvAthDJSgd09ity8KQArn9keBZJ0L2xlUlXxtbXh5JbYIXz4OwseNPGv6Fznvyyb QsCtxuV4IewsIBGimPesEMi/uMQwbuIHu0dr5p1dmQ8gbcbqK46ybLfgQT5R8LLc/n6uzN 0kxohgk015prMIonbY8EH9ncV4plcdQ1jjkvApeR6U92igsdLOdkVy43gK8U4A== 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 4V5zT74vTxzYsF; Sat, 30 Mar 2024 00:59:55 +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 42U0xtSm063360; Sat, 30 Mar 2024 00:59:55 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 42U0xtcv063356; Sat, 30 Mar 2024 00:59:55 GMT (envelope-from git) Date: Sat, 30 Mar 2024 00:59:55 GMT Message-Id: <202403300059.42U0xtcv063356@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: b525301850f2 - stable/14 - 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/14 X-Git-Reftype: branch X-Git-Commit: b525301850f2e39389bdad45fc327b5f8708129d Auto-Submitted: auto-generated The branch stable/14 has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=b525301850f2e39389bdad45fc327b5f8708129d commit b525301850f2e39389bdad45fc327b5f8708129d Author: Rick Macklem AuthorDate: 2024-03-16 01:04:37 +0000 Commit: Rick Macklem CommitDate: 2024-03-30 00:58:33 +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 3daee65ab83a..899e88508b60 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. @@ -5598,10 +5601,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; @@ -5764,7 +5768,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,