Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/kern Tsort functions and remove a small #if 0 block left...
details: https://anonhg.NetBSD.org/src/rev/98c44493dd6b
branches: trunk
changeset: 760382:98c44493dd6b
user: dholland <dholland%NetBSD.org@localhost>
date: Tue Jan 04 07:43:42 2011 +0000
description:
Tsort functions and remove a small #if 0 block leftover from earlier cleanup.
No functional change.
diffstat:
sys/kern/vfs_lookup.c | 299 +++++++++++++++++++++++++------------------------
1 files changed, 151 insertions(+), 148 deletions(-)
diffs (truncated from 348 to 300 lines):
diff -r 58f2daf78567 -r 98c44493dd6b sys/kern/vfs_lookup.c
--- a/sys/kern/vfs_lookup.c Tue Jan 04 06:54:59 2011 +0000
+++ b/sys/kern/vfs_lookup.c Tue Jan 04 07:43:42 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_lookup.c,v 1.130 2011/01/02 05:09:31 dholland Exp $ */
+/* $NetBSD: vfs_lookup.c,v 1.131 2011/01/04 07:43:42 dholland Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.130 2011/01/02 05:09:31 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.131 2011/01/04 07:43:42 dholland Exp $");
#include "opt_magiclinks.h"
@@ -194,6 +194,36 @@
////////////////////////////////////////////////////////////
/*
+ * Determine the namei hash (for cn_hash) for name.
+ * If *ep != NULL, hash from name to ep-1.
+ * If *ep == NULL, hash from name until the first NUL or '/', and
+ * return the location of this termination character in *ep.
+ *
+ * This function returns an equivalent hash to the MI hash32_strn().
+ * The latter isn't used because in the *ep == NULL case, determining
+ * the length of the string to the first NUL or `/' and then calling
+ * hash32_strn() involves unnecessary double-handling of the data.
+ */
+uint32_t
+namei_hash(const char *name, const char **ep)
+{
+ uint32_t hash;
+
+ hash = HASH32_STR_INIT;
+ if (*ep != NULL) {
+ for (; name < *ep; name++)
+ hash = hash * 33 + *(const uint8_t *)name;
+ } else {
+ for (; *name != '\0' && *name != '/'; name++)
+ hash = hash * 33 + *(const uint8_t *)name;
+ *ep = name;
+ }
+ return (hash + (hash >> 5));
+}
+
+////////////////////////////////////////////////////////////
+
+/*
* Sealed abstraction for pathnames.
*
* System-call-layer level code that is going to call namei should
@@ -466,11 +496,6 @@
struct cwdinfo *cwdi; /* pointer to cwd state */
struct lwp *self = curlwp; /* thread doing namei() */
-#if 0 /* not any more */
- /* as both buffers are size PATH_MAX this cannot overflow */
- strcpy(cnp->cn_pnbuf, ndp->ni_pathbuf->pb_path);
-#endif
-
/* length includes null terminator (was originally from copyinstr) */
ndp->ni_pathlen = strlen(ndp->ni_pnbuf) + 1;
@@ -664,147 +689,6 @@
//////////////////////////////
-static int
-do_namei(struct namei_state *state)
-{
- int error;
-
- struct nameidata *ndp = state->ndp;
- struct componentname *cnp = state->cnp;
- const char *savepath = NULL;
-
- KASSERT(cnp == &ndp->ni_cnd);
-
- namei_start1(state);
-
- if (cnp->cn_flags & TRYEMULROOT) {
- savepath = pathbuf_stringcopy_get(ndp->ni_pathbuf);
- }
-
- emul_retry:
-
- if (savepath != NULL) {
- /* kinda gross */
- strcpy(ndp->ni_pathbuf->pb_path, savepath);
- pathbuf_stringcopy_put(ndp->ni_pathbuf, savepath);
- savepath = NULL;
- }
-
- error = namei_start2(state);
- if (error) {
- if (savepath != NULL) {
- pathbuf_stringcopy_put(ndp->ni_pathbuf, savepath);
- }
- return error;
- }
-
- /* Loop through symbolic links */
- for (;;) {
- if (state->namei_startdir->v_mount == NULL) {
- /* Give up if the directory is no longer mounted */
- if (savepath != NULL) {
- pathbuf_stringcopy_put(ndp->ni_pathbuf, savepath);
- }
- namei_end(state);
- return (ENOENT);
- }
- cnp->cn_nameptr = ndp->ni_pnbuf;
- error = do_lookup(state, state->namei_startdir);
- if (error != 0) {
- /* XXX this should use namei_end() */
- if (ndp->ni_dvp) {
- vput(ndp->ni_dvp);
- }
- if (ndp->ni_erootdir != NULL) {
- /* Retry the whole thing from the normal root */
- cnp->cn_flags &= ~TRYEMULROOT;
- goto emul_retry;
- }
- KASSERT(savepath == NULL);
- return (error);
- }
-
- /*
- * Check for symbolic link
- */
- if (namei_atsymlink(state)) {
- error = namei_follow(state);
- if (error) {
- KASSERT(ndp->ni_dvp != ndp->ni_vp);
- vput(ndp->ni_dvp);
- vput(ndp->ni_vp);
- ndp->ni_vp = NULL;
- if (savepath != NULL) {
- pathbuf_stringcopy_put(ndp->ni_pathbuf, savepath);
- }
- return error;
- }
- }
- else {
- break;
- }
- }
-
- /*
- * Done
- */
-
- if ((cnp->cn_flags & LOCKPARENT) == 0 && ndp->ni_dvp) {
- if (ndp->ni_dvp == ndp->ni_vp) {
- vrele(ndp->ni_dvp);
- } else {
- vput(ndp->ni_dvp);
- }
- }
-
- if (savepath != NULL) {
- pathbuf_stringcopy_put(ndp->ni_pathbuf, savepath);
- }
-
- return 0;
-}
-
-int
-namei(struct nameidata *ndp)
-{
- struct namei_state state;
- int error;
-
- namei_init(&state, ndp);
- error = do_namei(&state);
- namei_cleanup(&state);
-
- return error;
-}
-
-/*
- * Determine the namei hash (for cn_hash) for name.
- * If *ep != NULL, hash from name to ep-1.
- * If *ep == NULL, hash from name until the first NUL or '/', and
- * return the location of this termination character in *ep.
- *
- * This function returns an equivalent hash to the MI hash32_strn().
- * The latter isn't used because in the *ep == NULL case, determining
- * the length of the string to the first NUL or `/' and then calling
- * hash32_strn() involves unnecessary double-handling of the data.
- */
-uint32_t
-namei_hash(const char *name, const char **ep)
-{
- uint32_t hash;
-
- hash = HASH32_STR_INIT;
- if (*ep != NULL) {
- for (; name < *ep; name++)
- hash = hash * 33 + *(const uint8_t *)name;
- } else {
- for (; *name != '\0' && *name != '/'; name++)
- hash = hash * 33 + *(const uint8_t *)name;
- *ep = name;
- }
- return (hash + (hash >> 5));
-}
-
/*
* Search a pathname.
* This is a very central and rather complicated routine.
@@ -1298,6 +1182,123 @@
return (error);
}
+//////////////////////////////
+
+static int
+do_namei(struct namei_state *state)
+{
+ int error;
+
+ struct nameidata *ndp = state->ndp;
+ struct componentname *cnp = state->cnp;
+ const char *savepath = NULL;
+
+ KASSERT(cnp == &ndp->ni_cnd);
+
+ namei_start1(state);
+
+ if (cnp->cn_flags & TRYEMULROOT) {
+ savepath = pathbuf_stringcopy_get(ndp->ni_pathbuf);
+ }
+
+ emul_retry:
+
+ if (savepath != NULL) {
+ /* kinda gross */
+ strcpy(ndp->ni_pathbuf->pb_path, savepath);
+ pathbuf_stringcopy_put(ndp->ni_pathbuf, savepath);
+ savepath = NULL;
+ }
+
+ error = namei_start2(state);
+ if (error) {
+ if (savepath != NULL) {
+ pathbuf_stringcopy_put(ndp->ni_pathbuf, savepath);
+ }
+ return error;
+ }
+
+ /* Loop through symbolic links */
+ for (;;) {
+ if (state->namei_startdir->v_mount == NULL) {
+ /* Give up if the directory is no longer mounted */
+ if (savepath != NULL) {
+ pathbuf_stringcopy_put(ndp->ni_pathbuf, savepath);
+ }
+ namei_end(state);
+ return (ENOENT);
+ }
+ cnp->cn_nameptr = ndp->ni_pnbuf;
+ error = do_lookup(state, state->namei_startdir);
+ if (error != 0) {
+ /* XXX this should use namei_end() */
+ if (ndp->ni_dvp) {
+ vput(ndp->ni_dvp);
+ }
+ if (ndp->ni_erootdir != NULL) {
+ /* Retry the whole thing from the normal root */
+ cnp->cn_flags &= ~TRYEMULROOT;
+ goto emul_retry;
+ }
+ KASSERT(savepath == NULL);
+ return (error);
+ }
+
+ /*
+ * Check for symbolic link
+ */
+ if (namei_atsymlink(state)) {
+ error = namei_follow(state);
+ if (error) {
+ KASSERT(ndp->ni_dvp != ndp->ni_vp);
+ vput(ndp->ni_dvp);
+ vput(ndp->ni_vp);
+ ndp->ni_vp = NULL;
+ if (savepath != NULL) {
+ pathbuf_stringcopy_put(ndp->ni_pathbuf, savepath);
+ }
+ return error;
+ }
+ }
+ else {
+ break;
+ }
Home |
Main Index |
Thread Index |
Old Index