Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/kern Use locals/args instead of state->dp in namei_once(...



details:   https://anonhg.NetBSD.org/src/rev/cebc76fd0a39
branches:  trunk
changeset: 764060:cebc76fd0a39
user:      dholland <dholland%NetBSD.org@localhost>
date:      Mon Apr 11 01:40:13 2011 +0000

description:
Use locals/args instead of state->dp in namei_once(). Remove
state->dp.

diffstat:

 sys/kern/vfs_lookup.c |  100 ++++++++++++++++++++++++++-----------------------
 1 files changed, 53 insertions(+), 47 deletions(-)

diffs (259 lines):

diff -r e6a2435532c5 -r cebc76fd0a39 sys/kern/vfs_lookup.c
--- a/sys/kern/vfs_lookup.c     Mon Apr 11 01:40:01 2011 +0000
+++ b/sys/kern/vfs_lookup.c     Mon Apr 11 01:40:13 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vfs_lookup.c,v 1.146 2011/04/11 01:40:01 dholland Exp $        */
+/*     $NetBSD: vfs_lookup.c,v 1.147 2011/04/11 01:40:13 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.146 2011/04/11 01:40:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.147 2011/04/11 01:40:13 dholland Exp $");
 
 #include "opt_magiclinks.h"
 
@@ -411,7 +411,6 @@
 
        int docache;                    /* == 0 do not cache last component */
        int rdonly;                     /* lookup read-only flag bit */
-       struct vnode *dp;               /* the directory we are searching */
        int slashes;
 
        unsigned attempt_retry:1;       /* true if error allows emul retry */
@@ -434,7 +433,6 @@
 
        state->docache = 0;
        state->rdonly = 0;
-       state->dp = NULL;
        state->slashes = 0;
 
 #ifdef DIAGNOSTIC
@@ -798,7 +796,8 @@
         * the name set the SAVENAME flag. When done, they assume
         * responsibility for freeing the pathname buffer.
         *
-        * At this point, our only vnode state is that "dp" is held and locked.
+        * At this point, our only vnode state is that the search dir
+        * is held and locked.
         */
        cnp->cn_consume = 0;
        cp = NULL;
@@ -856,8 +855,11 @@
 }
 
 static int
-lookup_once(struct namei_state *state)
+lookup_once(struct namei_state *state,
+           struct vnode *searchdir,
+           struct vnode **foundobj_ret)
 {
+       struct vnode *foundobj;
        struct vnode *tdp;              /* saved dp */
        struct mount *mp;               /* mount table entry */
        struct lwp *l = curlwp;
@@ -886,18 +888,20 @@
                struct proc *p = l->l_proc;
 
                for (;;) {
-                       if (state->dp == ndp->ni_rootdir || state->dp == rootvnode) {
-                               ndp->ni_dvp = state->dp;
-                               ndp->ni_vp = state->dp;
-                               vref(state->dp);
+                       if (searchdir == ndp->ni_rootdir || searchdir == rootvnode) {
+                               foundobj = searchdir;
+                               vref(foundobj);
+                               ndp->ni_dvp = searchdir;
+                               ndp->ni_vp = foundobj;
+                               *foundobj_ret = foundobj;
                                return 0;
                        }
                        if (ndp->ni_rootdir != rootvnode) {
                                int retval;
 
-                               VOP_UNLOCK(state->dp);
-                               retval = vn_isunder(state->dp, ndp->ni_rootdir, l);
-                               vn_lock(state->dp, LK_EXCLUSIVE | LK_RETRY);
+                               VOP_UNLOCK(searchdir);
+                               retval = vn_isunder(searchdir, ndp->ni_rootdir, l);
+                               vn_lock(searchdir, LK_EXCLUSIVE | LK_RETRY);
                                if (!retval) {
                                    /* Oops! We got out of jail! */
                                    log(LOG_WARNING,
@@ -906,35 +910,37 @@
                                        p->p_pid, kauth_cred_geteuid(l->l_cred),
                                        p->p_comm);
                                    /* Put us at the jail root. */
-                                   vput(state->dp);
-                                   state->dp = ndp->ni_rootdir;
-                                   ndp->ni_dvp = state->dp;
-                                   ndp->ni_vp = state->dp;
-                                   vref(state->dp);
-                                   vref(state->dp);
-                                   vn_lock(state->dp, LK_EXCLUSIVE | LK_RETRY);
+                                   vput(searchdir);
+                                   searchdir = NULL;
+                                   foundobj = ndp->ni_rootdir;
+                                   vref(foundobj);
+                                   vref(foundobj);
+                                   ndp->ni_dvp = foundobj;
+                                   ndp->ni_vp = foundobj;
+                                   vn_lock(foundobj, LK_EXCLUSIVE | LK_RETRY);
+                                   *foundobj_ret = foundobj;
                                    return 0;
                                }
                        }
-                       if ((state->dp->v_vflag & VV_ROOT) == 0 ||
+                       if ((searchdir->v_vflag & VV_ROOT) == 0 ||
                            (cnp->cn_flags & NOCROSSMOUNT))
                                break;
-                       tdp = state->dp;
-                       state->dp = state->dp->v_mount->mnt_vnodecovered;
+                       tdp = searchdir;
+                       searchdir = searchdir->v_mount->mnt_vnodecovered;
                        vput(tdp);
-                       vref(state->dp);
-                       vn_lock(state->dp, LK_EXCLUSIVE | LK_RETRY);
+                       vref(searchdir);
+                       vn_lock(searchdir, LK_EXCLUSIVE | LK_RETRY);
                }
        }
 
        /*
         * We now have a segment name to search for, and a directory to search.
-        * Again, our only vnode state is that "dp" is held and locked.
+        * Our vnode state here is that "searchdir" is held and locked.
         */
 unionlookup:
-       ndp->ni_dvp = state->dp;
+       ndp->ni_dvp = searchdir;
        ndp->ni_vp = NULL;
-       error = VOP_LOOKUP(state->dp, &ndp->ni_vp, cnp);
+       error = VOP_LOOKUP(searchdir, &ndp->ni_vp, cnp);
        if (error != 0) {
 #ifdef DIAGNOSTIC
                if (ndp->ni_vp != NULL)
@@ -944,13 +950,13 @@
                printf("not found\n");
 #endif /* NAMEI_DIAGNOSTIC */
                if ((error == ENOENT) &&
-                   (state->dp->v_vflag & VV_ROOT) &&
-                   (state->dp->v_mount->mnt_flag & MNT_UNION)) {
-                       tdp = state->dp;
-                       state->dp = state->dp->v_mount->mnt_vnodecovered;
+                   (searchdir->v_vflag & VV_ROOT) &&
+                   (searchdir->v_mount->mnt_flag & MNT_UNION)) {
+                       tdp = searchdir;
+                       searchdir = searchdir->v_mount->mnt_vnodecovered;
                        vput(tdp);
-                       vref(state->dp);
-                       vn_lock(state->dp, LK_EXCLUSIVE | LK_RETRY);
+                       vref(searchdir);
+                       vn_lock(searchdir, LK_EXCLUSIVE | LK_RETRY);
                        goto unionlookup;
                }
 
@@ -980,6 +986,7 @@
                 * (possibly locked) directory vnode in ndp->ni_dvp.
                 */
                state->lookup_alldone = 1;
+               *foundobj_ret = NULL;
                return (0);
        }
 #ifdef NAMEI_DIAGNOSTIC
@@ -999,10 +1006,10 @@
                        cnp->cn_flags |= ISLASTCN;
        }
 
-       state->dp = ndp->ni_vp;
+       foundobj = ndp->ni_vp;
 
        /*
-        * "state->dp" and "ndp->ni_dvp" are both locked and held,
+        * "foundobj" and "ndp->ni_dvp" are both locked and held,
         * and may be the same vnode.
         */
 
@@ -1010,16 +1017,16 @@
         * Check to see if the vnode has been mounted on;
         * if so find the root of the mounted file system.
         */
-       while (state->dp->v_type == VDIR && (mp = state->dp->v_mountedhere) &&
+       while (foundobj->v_type == VDIR && (mp = foundobj->v_mountedhere) &&
               (cnp->cn_flags & NOCROSSMOUNT) == 0) {
                error = vfs_busy(mp, NULL);
                if (error != 0) {
-                       vput(state->dp);
+                       vput(foundobj);
                        return error;
                }
-               KASSERT(ndp->ni_dvp != state->dp);
+               KASSERT(ndp->ni_dvp != foundobj);
                VOP_UNLOCK(ndp->ni_dvp);
-               vput(state->dp);
+               vput(foundobj);
                error = VFS_ROOT(mp, &tdp);
                vfs_unbusy(mp, false, NULL);
                if (error) {
@@ -1027,11 +1034,12 @@
                        return error;
                }
                VOP_UNLOCK(tdp);
-               ndp->ni_vp = state->dp = tdp;
+               ndp->ni_vp = foundobj = tdp;
                vn_lock(ndp->ni_dvp, LK_EXCLUSIVE | LK_RETRY);
                vn_lock(ndp->ni_vp, LK_EXCLUSIVE | LK_RETRY);
        }
 
+       *foundobj_ret = foundobj;
        return 0;
 }
 
@@ -1138,9 +1146,7 @@
                        return (error);
                }
 
-               state->dp = searchdir;
-               error = lookup_once(state);
-               foundobj = state->dp;
+               error = lookup_once(state, searchdir, &foundobj);
                if (error) {
                        ndp->ni_vp = NULL;
                        /* XXX this should use namei_end() */
@@ -1419,6 +1425,7 @@
 
        struct componentname *cnp = state->cnp;
        struct nameidata *ndp = state->ndp;
+       struct vnode *foundobj;
        const char *cp;                 /* pointer into pathname argument */
 
        KASSERT(cnp == &ndp->ni_cnd);
@@ -1429,7 +1436,6 @@
        state->rdonly = cnp->cn_flags & RDONLY;
        ndp->ni_dvp = NULL;
        cnp->cn_flags &= ~ISSYMLINK;
-       state->dp = startdir;
 
        cnp->cn_consume = 0;
        cp = NULL;
@@ -1448,7 +1454,7 @@
        else
                cnp->cn_flags &= ~ISDOTDOT;
 
-       error = lookup_once(state);
+       error = lookup_once(state, startdir, &foundobj);
        if (error) {
                goto bad;
        }
@@ -1459,7 +1465,7 @@
        }
 
        if ((cnp->cn_flags & LOCKLEAF) == 0) {
-               VOP_UNLOCK(state->dp);
+               VOP_UNLOCK(foundobj);
        }
        return (0);
 



Home | Main Index | Thread Index | Old Index