Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/kern description:
details: https://anonhg.NetBSD.org/src/rev/45d8cb40694f
branches: trunk
changeset: 764087:45d8cb40694f
user: dholland <dholland%NetBSD.org@localhost>
date: Mon Apr 11 02:21:17 2011 +0000
description:
description:
Update comments.
diffstat:
sys/kern/vfs_lookup.c | 157 ++++++++++++++++++++++++++++++++-----------------
1 files changed, 103 insertions(+), 54 deletions(-)
diffs (280 lines):
diff -r d97b2a8a7652 -r 45d8cb40694f sys/kern/vfs_lookup.c
--- a/sys/kern/vfs_lookup.c Mon Apr 11 02:21:01 2011 +0000
+++ b/sys/kern/vfs_lookup.c Mon Apr 11 02:21:17 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_lookup.c,v 1.172 2011/04/11 02:21:01 dholland Exp $ */
+/* $NetBSD: vfs_lookup.c,v 1.173 2011/04/11 02:21:17 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.172 2011/04/11 02:21:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.173 2011/04/11 02:21:17 dholland Exp $");
#include "opt_magiclinks.h"
@@ -317,7 +317,10 @@
}
/*
- * XXX should not exist
+ * XXX should not exist:
+ * 1. whether a pointer is kernel or user should be statically checkable
+ * 2. copyin should be handled by the upper part of the syscall layer,
+ * not in here.
*/
int
pathbuf_maybe_copyin(const char *path, enum uio_seg seg, struct pathbuf **ret)
@@ -376,7 +379,10 @@
////////////////////////////////////////////////////////////
/*
- * Convert a pathname into a pointer to a locked vnode.
+ * namei: convert a pathname into a pointer to a (maybe-locked) vnode,
+ * and maybe also its parent directory vnode, and assorted other guff.
+ * See namei(9) for the interface documentation.
+ *
*
* The FOLLOW flag is set when symbolic links are to be followed
* when they occur at the end of the name translation process.
@@ -397,7 +403,47 @@
*/
/*
+ * Search a pathname.
+ * This is a very central and rather complicated routine.
+ *
+ * The pathname is pointed to by ni_ptr and is of length ni_pathlen.
+ * The starting directory is passed in. The pathname is descended
+ * until done, or a symbolic link is encountered. The variable ni_more
+ * is clear if the path is completed; it is set to one if a symbolic
+ * link needing interpretation is encountered.
+ *
+ * The flag argument is LOOKUP, CREATE, RENAME, or DELETE depending on
+ * whether the name is to be looked up, created, renamed, or deleted.
+ * When CREATE, RENAME, or DELETE is specified, information usable in
+ * creating, renaming, or deleting a directory entry may be calculated.
+ * If flag has LOCKPARENT or'ed into it, the parent directory is returned
+ * locked. Otherwise the parent directory is not returned. If the target
+ * of the pathname exists and LOCKLEAF is or'ed into the flag the target
+ * is returned locked, otherwise it is returned unlocked. When creating
+ * or renaming and LOCKPARENT is specified, the target may not be ".".
+ * When deleting and LOCKPARENT is specified, the target may be ".".
+ *
+ * Overall outline of lookup:
+ *
+ * dirloop:
+ * identify next component of name at ndp->ni_ptr
+ * handle degenerate case where name is null string
+ * if .. and crossing mount points and on mounted filesys, find parent
+ * call VOP_LOOKUP routine for next component name
+ * directory vnode returned in ni_dvp, locked.
+ * component vnode returned in ni_vp (if it exists), locked.
+ * if result vnode is mounted on and crossing mount points,
+ * find mounted on vnode
+ * if more components of name, do next level at dirloop
+ * return the answer in ni_vp, locked if LOCKLEAF set
+ * if LOCKPARENT set, return locked parent in ni_dvp
+ */
+
+
+/*
* Internal state for a namei operation.
+ *
+ * cnp is always equal to &ndp->ni_cnp.
*/
struct namei_state {
struct nameidata *ndp;
@@ -527,7 +573,7 @@
/*
* Get the directory context for the nfsd case, in parallel to
* getstartdir. Initializes the rootdir and erootdir state and
- * returns a reference to the passed-instarting dir.
+ * returns a reference to the passed-in starting dir.
*/
static struct vnode *
namei_getstartdir_for_nfsd(struct namei_state *state, struct vnode *startdir)
@@ -613,7 +659,7 @@
}
/*
- * Check for being at a symlink.
+ * Check for being at a symlink that we're going to follow.
*/
static inline int
namei_atsymlink(struct namei_state *state, struct vnode *foundobj)
@@ -624,6 +670,9 @@
/*
* Follow a symlink.
+ *
+ * Updates searchdir. inhibitmagic causes magic symlinks to not be
+ * interpreted; this is used by nfsd.
*/
static inline int
namei_follow(struct namei_state *state, int inhibitmagic,
@@ -721,42 +770,8 @@
//////////////////////////////
/*
- * Search a pathname.
- * This is a very central and rather complicated routine.
- *
- * The pathname is pointed to by ni_ptr and is of length ni_pathlen.
- * The starting directory is passed in. The pathname is descended
- * until done, or a symbolic link is encountered. The variable ni_more
- * is clear if the path is completed; it is set to one if a symbolic
- * link needing interpretation is encountered.
- *
- * The flag argument is LOOKUP, CREATE, RENAME, or DELETE depending on
- * whether the name is to be looked up, created, renamed, or deleted.
- * When CREATE, RENAME, or DELETE is specified, information usable in
- * creating, renaming, or deleting a directory entry may be calculated.
- * If flag has LOCKPARENT or'ed into it, the parent directory is returned
- * locked. Otherwise the parent directory is not returned. If the target
- * of the pathname exists and LOCKLEAF is or'ed into the flag the target
- * is returned locked, otherwise it is returned unlocked. When creating
- * or renaming and LOCKPARENT is specified, the target may not be ".".
- * When deleting and LOCKPARENT is specified, the target may be ".".
- *
- * Overall outline of lookup:
- *
- * dirloop:
- * identify next component of name at ndp->ni_ptr
- * handle degenerate case where name is null string
- * if .. and crossing mount points and on mounted filesys, find parent
- * call VOP_LOOKUP routine for next component name
- * directory vnode returned in ni_dvp, locked.
- * component vnode returned in ni_vp (if it exists), locked.
- * if result vnode is mounted on and crossing mount points,
- * find mounted on vnode
- * if more components of name, do next level at dirloop
- * return the answer in ni_vp, locked if LOCKLEAF set
- * if LOCKPARENT set, return locked parent in ni_dvp
+ * Inspect the leading path component and update the state accordingly.
*/
-
static int
lookup_parsepath(struct namei_state *state)
{
@@ -834,6 +849,11 @@
return 0;
}
+/*
+ * Call VOP_LOOKUP for a single lookup; return a new search directory
+ * (used when crossing mountpoints up or searching union mounts down) and
+ * the found object, which for create operations may be NULL on success.
+ */
static int
lookup_once(struct namei_state *state,
struct vnode *searchdir,
@@ -965,8 +985,8 @@
/*
* We return success and a NULL foundobj to indicate
* that the entry doesn't currently exist, leaving a
- * pointer to the (possibly locked) directory vnode as
- * searchdir.
+ * pointer to the (normally, locked) directory vnode
+ * as searchdir.
*/
*foundobj_ret = NULL;
return (0);
@@ -1025,6 +1045,10 @@
//////////////////////////////
+/*
+ * Do a complete path search from a single root directory.
+ * (This is called up to twice if TRYEMULROOT is in effect.)
+ */
static int
namei_oneroot(struct namei_state *state, struct vnode *forcecwd,
int neverfollow, int inhibitmagic)
@@ -1330,6 +1354,9 @@
return 0;
}
+/*
+ * Do namei; wrapper layer that handles TRYEMULROOT.
+ */
static int
namei_tryemulroot(struct namei_state *state, struct vnode *forcecwd,
int neverfollow, int inhibitmagic)
@@ -1375,6 +1402,9 @@
return error;
}
+/*
+ * External interface.
+ */
int
namei(struct nameidata *ndp)
{
@@ -1398,19 +1428,16 @@
////////////////////////////////////////////////////////////
/*
- * Externally visible interfaces used by nfsd (bletch, yuk, XXX)
- *
- * The "index" version differs from the "main" version in that it's
- * called from a different place in a different context. For now I
- * want to be able to shuffle code in from one call site without
- * affecting the other.
+ * External interface used by nfsd. This is basically different from
+ * namei only in that it has the ability to pass in the "current
+ * directory", and uses an extra flag "neverfollow" for which there's
+ * no physical flag defined in namei.h. (There used to be a cut&paste
+ * copy of about half of namei in nfsd to allow these minor
+ * adjustments to exist.)
*
- * It turns out that the "main" version was a cut and pasted copy of
- * namei with a few changes; the "index" version on the other hand
- * always takes a single component and is an elaborate form of calling
- * VOP_LOOKUP once.
+ * XXX: the namei interface should be adjusted so nfsd can just use
+ * ordinary namei().
*/
-
int
lookup_for_nfsd(struct nameidata *ndp, struct vnode *forcecwd, int neverfollow)
{
@@ -1431,6 +1458,22 @@
return error;
}
+/*
+ * A second external interface used by nfsd. This turns out to be a
+ * single lookup used by the WebNFS code (ha!) to get "index.html" or
+ * equivalent when asked for a directory. It should eventually evolve
+ * into some kind of namei_once() call; for the time being it's kind
+ * of a mess. XXX.
+ *
+ * dholland 20110109: I don't think it works, and I don't think it
+ * worked before I started hacking and slashing either, and I doubt
+ * anyone will ever notice.
+ */
+
+/*
+ * Internals. This calls lookup_once() after setting up the assorted
+ * pieces of state the way they ought to be.
+ */
static int
do_lookup_for_nfsd_index(struct namei_state *state, struct vnode *startdir)
{
@@ -1494,6 +1537,12 @@
return (error);
}
+/*
+ * External interface. The partitioning between this function and the
+ * above isn't very clear - the above function exists mostly so code
+ * that uses "state->" can be shuffled around without having to change
+ * it to "state.".
+ */
int
lookup_for_nfsd_index(struct nameidata *ndp, struct vnode *startdir)
{
Home |
Main Index |
Thread Index |
Old Index