From nobody Fri Dec 23 23:18:42 2022 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 4Nf35b07gqz1LlNr; Fri, 23 Dec 2022 23:18:43 +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 4Nf35Z6ZbWz4DvJ; Fri, 23 Dec 2022 23:18:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1671837522; 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=2LEunGpCyAf5UwppFhm0r03kkCb3ZR/QOz6g/Mkvdsg=; b=PBkXKvSJQaLeL90+pcVYMfEs37b6YnYvDzqIaFYf2dhEsyCDZwIL1FNep3S4U2lThAZGrQ E339GHRml9heBkBYcycHllvYP6dU2MrggV/Ks0pk57ILttSpDCxlnwiBXK7lpETUCROpBE geVhOIbiVOdv+tOHLrLRCg2+F4eFJG42ARTJ3IyLpL1vv48dEQx8j0mZay/112OqRH04Bw 8ZBcaZgrhZOyv0TPNUQWArSpJJUw3deQc6DNzrCJJAFEYU4Kt7PEw11lC8OeJ/8UGxTY2V V6/f0ZMIUbHLSbpW2WQfmsJiuwRfbW/v0leFVRDHDlBxXxs0ct7QVjGUlEJg6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1671837522; 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=2LEunGpCyAf5UwppFhm0r03kkCb3ZR/QOz6g/Mkvdsg=; b=dnR/QrOUrdhBDvD2IVoc2lCtXuGVzIyorhA54CcBj4vyus+P4ArW3lm+haT9cU+SdCUp7i PRn8byUqKfjYYJ99EIE0bEuCDOyOa/LS2duZ23UarUgEXMv0eLNWsY7NqC5ZQh+qoUzPZN NuXqzc1i/Qpg6ioUl8yt4hbWWC6FmrME/I/rLBWCVDo65sfjIOkEyiXiprSrYA+/hvubbH nfot2CEWRCS5dJyLNhBr0P98P719gYHxDkKDY4OXoeB46+axtx9tuMRDS0cQXyz/MROd25 6znLb/G+JnAbiONKIQErMucO6efa51UBWwduUpMNK4+KDB/idds4wM/xrt0MIw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1671837522; a=rsa-sha256; cv=none; b=aEA3ZjSoKYWicAYqKLh91QI6nq3nQb1IOyAIWZd7gsA1H6nG3rzQPuCYugcA36DTPSucOa RD8gEYrOpQ8yxUvEC0xmlNQD9f/XPzbETVMcIkSP8FfnRNaYNMFjSvRb2C9j1R8eSIqKHl yaqX101GXGI+/DhnAhJKCYHqQ3gMkWwen9W6nHN/2E5txE0DtuFMJnbqB/mq1GrgrpJBNH 7pvmHsWN/eUGdu8twogV+occd84GRB0uOxZxRYL5L7p8MvQV1v8Ltp1bqjBtq5oE/1aNWR pqWY2YvQMIVixLhenC5w47ZGuWMP1ymj2etehFLuBPqWTnYNHHwhhSih2fi81A== 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 4Nf35Z5fJSzrvb; Fri, 23 Dec 2022 23:18:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 2BNNIgig083931; Fri, 23 Dec 2022 23:18:42 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 2BNNIgcK083930; Fri, 23 Dec 2022 23:18:42 GMT (envelope-from git) Date: Fri, 23 Dec 2022 23:18:42 GMT Message-Id: <202212232318.2BNNIgcK083930@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Rick Macklem Subject: git: 6fd6a0e342fb - main - nfsd: Handle file systems without a VOP_VPTOFH() 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: 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/main X-Git-Reftype: branch X-Git-Commit: 6fd6a0e342fbfb8513ae56105cf0f85f55c6276e Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=6fd6a0e342fbfb8513ae56105cf0f85f55c6276e commit 6fd6a0e342fbfb8513ae56105cf0f85f55c6276e Author: Rick Macklem AuthorDate: 2022-12-23 23:17:34 +0000 Commit: Rick Macklem CommitDate: 2022-12-23 23:17:34 +0000 nfsd: Handle file systems without a VOP_VPTOFH() Unlike NFSv3, the NFSv4 server follows mount points within the file system tree below the NFSv4 root directory. If there is a file system mounted within this subtree that returns EOPNOTSUPP for VOP_VPTOFH(), the NFSv4 server would return an error for the mount point entry. This resulted in an "I/O error" report from the Linux NFSv4 client. It also put an error code in the Readdir reply that is not defined in the NFSv4 RFCs. For the FreeBSD NFSv4 client, the entry with the error would be ignored, which I think is reasonable behaviour for a mounted file system that can never be exported. This patch changes the NFSv4 server behaviour to ignore the mount point entry and not send it in the Readdir reply. It also changes the behaviour of Lookup for the entry so that it replies ENOENT for the mount point directory, so that it is consistent with no entry in the Readdir reply. With these two changes, the Linux client behaviour is the same as the FreeBSD client behaviour. It also avoids putting an unknown error on the wire to the client. MFC after: 1 week --- sys/fs/nfsserver/nfs_nfsdport.c | 11 +++++++++-- sys/fs/nfsserver/nfs_nfsdserv.c | 9 ++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index e11477b20ee2..665e2c00ce08 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -2699,15 +2699,22 @@ again: * For NFSv4 the behavior is controlled by * RDATTRERROR: we either ignore the error or * fail the request. + * The exception is EOPNOTSUPP, which can be + * returned by nfsvno_getfh() for certain + * file systems, such as devfs. This indicates + * that the file system cannot be exported, + * so just skip over the entry. * Note that RDATTRERROR is never set for NFSv3. */ if (r != 0) { if (!NFSISSET_ATTRBIT(&attrbits, - NFSATTRBIT_RDATTRERROR)) { + NFSATTRBIT_RDATTRERROR) || + r == EOPNOTSUPP) { vput(nvp); if (needs_unbusy != 0) vfs_unbusy(new_mp); - if ((nd->nd_flag & ND_NFSV3)) + if ((nd->nd_flag & ND_NFSV3) || + r == EOPNOTSUPP) goto invalid; nd->nd_repstat = r; break; diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index 5a547fabb541..709dc84d5d91 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -645,8 +645,15 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram, * non-exported volumes during NFSv4 mounting. */ nd->nd_repstat = ENOENT; - if (nd->nd_repstat == 0) + if (nd->nd_repstat == 0) { nd->nd_repstat = nfsvno_getfh(vp, fhp, p); + /* + * EOPNOTSUPP indicates the file system cannot be exported, + * so just pretend the entry does not exist. + */ + if (nd->nd_repstat == EOPNOTSUPP) + nd->nd_repstat = ENOENT; + } if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, NULL); if (vpp != NULL && nd->nd_repstat == 0)