svn commit: r368375 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Sun Dec 6 04:59:25 UTC 2020
Author: mjg
Date: Sun Dec 6 04:59:24 2020
New Revision: 368375
URL: https://svnweb.freebsd.org/changeset/base/368375
Log:
vfs: factor buffer allocation/copyin out of namei
Modified:
head/sys/kern/vfs_lookup.c
Modified: head/sys/kern/vfs_lookup.c
==============================================================================
--- head/sys/kern/vfs_lookup.c Sat Dec 5 22:04:30 2020 (r368374)
+++ head/sys/kern/vfs_lookup.c Sun Dec 6 04:59:24 2020 (r368375)
@@ -464,6 +464,43 @@ namei_setup(struct nameidata *ndp, struct vnode **dpp,
return (0);
}
+static int
+namei_getpath(struct nameidata *ndp)
+{
+ struct componentname *cnp;
+ int error;
+
+ cnp = &ndp->ni_cnd;
+
+ /*
+ * Get a buffer for the name to be translated, and copy the
+ * name into the buffer.
+ */
+ cnp->cn_pnbuf = uma_zalloc(namei_zone, M_WAITOK);
+ if (ndp->ni_segflg == UIO_SYSSPACE) {
+ error = copystr(ndp->ni_dirp, cnp->cn_pnbuf, MAXPATHLEN,
+ &ndp->ni_pathlen);
+ } else {
+ error = copyinstr(ndp->ni_dirp, cnp->cn_pnbuf, MAXPATHLEN,
+ &ndp->ni_pathlen);
+ }
+
+ if (__predict_false(error != 0)) {
+ return (error);
+ }
+
+ /*
+ * Don't allow empty pathnames.
+ */
+ if (__predict_false(*cnp->cn_pnbuf == '\0')) {
+ namei_cleanup_cnp(cnp);
+ return (ENOENT);
+ }
+
+ cnp->cn_nameptr = cnp->cn_pnbuf;
+ return (0);
+}
+
/*
* Convert a pathname into a pointer to a locked vnode.
*
@@ -531,31 +568,11 @@ namei(struct nameidata *ndp)
ndp->ni_lcf = 0;
ndp->ni_vp = NULL;
- /*
- * Get a buffer for the name to be translated, and copy the
- * name into the buffer.
- */
- cnp->cn_pnbuf = uma_zalloc(namei_zone, M_WAITOK);
- if (ndp->ni_segflg == UIO_SYSSPACE)
- error = copystr(ndp->ni_dirp, cnp->cn_pnbuf, MAXPATHLEN,
- &ndp->ni_pathlen);
- else
- error = copyinstr(ndp->ni_dirp, cnp->cn_pnbuf, MAXPATHLEN,
- &ndp->ni_pathlen);
-
+ error = namei_getpath(ndp);
if (__predict_false(error != 0)) {
- namei_cleanup_cnp(cnp);
return (error);
}
- /*
- * Don't allow empty pathnames.
- */
- if (__predict_false(*cnp->cn_pnbuf == '\0')) {
- namei_cleanup_cnp(cnp);
- return (ENOENT);
- }
-
#ifdef KTRACE
if (KTRPOINT(td, KTR_NAMEI)) {
KASSERT(cnp->cn_thread == curthread,
@@ -563,8 +580,6 @@ namei(struct nameidata *ndp)
ktrnamei(cnp->cn_pnbuf);
}
#endif
-
- cnp->cn_nameptr = cnp->cn_pnbuf;
/*
* First try looking up the target without locking any vnodes.
More information about the svn-src-all
mailing list