From nobody Thu Mar 24 13:11:49 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 5D0E61A38730; Thu, 24 Mar 2022 13:11:49 +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 4KPQbn25fpz3Lnk; Thu, 24 Mar 2022 13:11:49 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1648127509; 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=S5tyAfOifIBKm5RZQhWGTVpyjQ8Wzsi6FygyHNxDMKc=; b=qZuxKI00Rmpv9319z9tMNFztmLlw640xX3sBwnRU5giw8yUUa3UT7Mb3u8JJS54tDEal9D f8Qo8Zi7u5jvRQh+gIN6zEAWeq7c53jcRPLEq/FVfAEf1uPPXPg7yJUtrln7URc2Zgu+Vz gQ+i+WI/lkc7nE0zU6LlF62ueihuTSagqE6zAtFBe4J+CtL7yjtH12v0ukBMwQhsnPzFep zoOX/cy8Cxn20oN9BRZ+1OSyBhqFvLDJraTPrtGa7Cqcfyd5b2J5pw9JzxduNwTVJ4p5wP ku3GU6vZwXKWImNpOF1H1TYT+jedG+E3utT4zf3/4Yv5SfOvA/DpCkdnTdmp8A== 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 28F15180F7; Thu, 24 Mar 2022 13:11:49 +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 22ODBn46030684; Thu, 24 Mar 2022 13:11:49 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 22ODBnWu030683; Thu, 24 Mar 2022 13:11:49 GMT (envelope-from git) Date: Thu, 24 Mar 2022 13:11:49 GMT Message-Id: <202203241311.22ODBnWu030683@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mateusz Guzik Subject: git: 3b6792d28ac1 - main - vfs: factor symlink traversal out of namei 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: mjg X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 3b6792d28ac16b38c6b56d1385b31b9c49a45723 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1648127509; 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=S5tyAfOifIBKm5RZQhWGTVpyjQ8Wzsi6FygyHNxDMKc=; b=nL6QDij1/goYKpADQd612uyfwfvTcrmmq46lGTooR6xE+D3QwPJS8q+pg0BRw2YFutC5nJ HHTm5Nb2rWJAhwbQxYnpeAcdD4z7GumXcWhmp5363rFOfhlhifthyBXWVqHMYKLCp69rRM PgeQ3CW72wP1+06Xw5c08zf859AyO/MVdXIvlAleuMDoiEhNHzs7XColmdlxUv6mcBILiC HWdGxc4xCneCCBZsdKfXNfu75BTO8yVlOIt32Wn9swd5jHdZFs1QTkC8/00HskWR+RBuma qO9z36Duf2jklfVVjruOHU5A32L0HBlkHABTNTCWsnITdjAg98lILfr3QUt/Gg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1648127509; a=rsa-sha256; cv=none; b=Fbs5hXKVsm02f5VxHp4rXbE0j7wxLE3NTEGKfLp/LgUYubRW48qbOLEuT3iH3y+Wi45frW UfXn17vneAx/U6onHjsWmPqQAjQJRbRM/lnntTgMRD739BiPVLmjY65zJvarFJcKcsZ7Hh RMCpxiOQJXHm7BuOgWhOgWhzTKz5rlQgMUy/NJn6o+YnU8l6UIISSGscyziH2RG6gRVRj+ Vyq3KPyjQXNr/SE2jSBvDvOqCs6dJ7xS7HvgDmH1632RpqH6pSixROS9kNrpLaYYRMfwpP Nnml00/p+Mg6WTRlDP7+m9j4Bn3lAMFliEotvCM69f40pbz1n1yuLWfg7LxEsQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by mjg: URL: https://cgit.FreeBSD.org/src/commit/?id=3b6792d28ac16b38c6b56d1385b31b9c49a45723 commit 3b6792d28ac16b38c6b56d1385b31b9c49a45723 Author: Mateusz Guzik AuthorDate: 2022-03-24 12:57:30 +0000 Commit: Mateusz Guzik CommitDate: 2022-03-24 13:11:22 +0000 vfs: factor symlink traversal out of namei The intent down the road is to eliminate the loop to begin with, pushing traversal down to vfs_lookup, all while not allocating the extra buffer. --- sys/kern/vfs_lookup.c | 125 ++++++++++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 54 deletions(-) diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c index 29db916382b1..8b4ceecce462 100644 --- a/sys/kern/vfs_lookup.c +++ b/sys/kern/vfs_lookup.c @@ -511,6 +511,74 @@ errout: return (error); } +static int __noinline +namei_follow_link(struct nameidata *ndp) +{ + char *cp; + struct iovec aiov; + struct uio auio; + struct componentname *cnp; + struct thread *td; + int error, linklen; + + error = 0; + cnp = &ndp->ni_cnd; + td = curthread; + + if (ndp->ni_loopcnt++ >= MAXSYMLINKS) { + error = ELOOP; + goto out; + } +#ifdef MAC + if ((cnp->cn_flags & NOMACCHECK) == 0) { + error = mac_vnode_check_readlink(td->td_ucred, ndp->ni_vp); + if (error != 0) + goto out; + } +#endif + if (ndp->ni_pathlen > 1) + cp = uma_zalloc(namei_zone, M_WAITOK); + else + cp = cnp->cn_pnbuf; + aiov.iov_base = cp; + aiov.iov_len = MAXPATHLEN; + auio.uio_iov = &aiov; + auio.uio_iovcnt = 1; + auio.uio_offset = 0; + auio.uio_rw = UIO_READ; + auio.uio_segflg = UIO_SYSSPACE; + auio.uio_td = td; + auio.uio_resid = MAXPATHLEN; + error = VOP_READLINK(ndp->ni_vp, &auio, cnp->cn_cred); + if (error != 0) { + if (ndp->ni_pathlen > 1) + uma_zfree(namei_zone, cp); + goto out; + } + linklen = MAXPATHLEN - auio.uio_resid; + if (linklen == 0) { + if (ndp->ni_pathlen > 1) + uma_zfree(namei_zone, cp); + error = ENOENT; + goto out; + } + if (linklen + ndp->ni_pathlen > MAXPATHLEN) { + if (ndp->ni_pathlen > 1) + uma_zfree(namei_zone, cp); + error = ENAMETOOLONG; + goto out; + } + if (ndp->ni_pathlen > 1) { + bcopy(ndp->ni_next, cp + linklen, ndp->ni_pathlen); + uma_zfree(namei_zone, cnp->cn_pnbuf); + cnp->cn_pnbuf = cp; + } else + cnp->cn_pnbuf[linklen] = '\0'; + ndp->ni_pathlen += linklen; +out: + return (error); +} + /* * Convert a pathname into a pointer to a locked vnode. * @@ -534,14 +602,11 @@ errout: int namei(struct nameidata *ndp) { - char *cp; /* pointer into pathname argument */ struct vnode *dp; /* the directory we are searching */ - struct iovec aiov; /* uio for reading symbolic links */ struct componentname *cnp; struct thread *td; struct pwd *pwd; - struct uio auio; - int error, linklen; + int error; enum cache_fpl_status status; cnp = &ndp->ni_cnd; @@ -675,57 +740,9 @@ namei(struct nameidata *ndp) NDVALIDATE(ndp); return (error); } - if (ndp->ni_loopcnt++ >= MAXSYMLINKS) { - error = ELOOP; - break; - } -#ifdef MAC - if ((cnp->cn_flags & NOMACCHECK) == 0) { - error = mac_vnode_check_readlink(td->td_ucred, - ndp->ni_vp); - if (error != 0) - break; - } -#endif - if (ndp->ni_pathlen > 1) - cp = uma_zalloc(namei_zone, M_WAITOK); - else - cp = cnp->cn_pnbuf; - aiov.iov_base = cp; - aiov.iov_len = MAXPATHLEN; - auio.uio_iov = &aiov; - auio.uio_iovcnt = 1; - auio.uio_offset = 0; - auio.uio_rw = UIO_READ; - auio.uio_segflg = UIO_SYSSPACE; - auio.uio_td = td; - auio.uio_resid = MAXPATHLEN; - error = VOP_READLINK(ndp->ni_vp, &auio, cnp->cn_cred); - if (error != 0) { - if (ndp->ni_pathlen > 1) - uma_zfree(namei_zone, cp); - break; - } - linklen = MAXPATHLEN - auio.uio_resid; - if (linklen == 0) { - if (ndp->ni_pathlen > 1) - uma_zfree(namei_zone, cp); - error = ENOENT; - break; - } - if (linklen + ndp->ni_pathlen > MAXPATHLEN) { - if (ndp->ni_pathlen > 1) - uma_zfree(namei_zone, cp); - error = ENAMETOOLONG; + error = namei_follow_link(ndp); + if (error != 0) break; - } - if (ndp->ni_pathlen > 1) { - bcopy(ndp->ni_next, cp + linklen, ndp->ni_pathlen); - uma_zfree(namei_zone, cnp->cn_pnbuf); - cnp->cn_pnbuf = cp; - } else - cnp->cn_pnbuf[linklen] = '\0'; - ndp->ni_pathlen += linklen; vput(ndp->ni_vp); dp = ndp->ni_dvp; /*