Module Name: src Committed By: dholland Date: Mon Apr 11 02:15:09 UTC 2011
Modified Files: src/sys/kern: vfs_lookup.c Log Message: description: In lookup_once(), assign newsearchdir_ret when searchdir is updated, instead of upon return. To generate a diff of this commit: cvs rdiff -u -r1.153 -r1.154 src/sys/kern/vfs_lookup.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/vfs_lookup.c diff -u src/sys/kern/vfs_lookup.c:1.153 src/sys/kern/vfs_lookup.c:1.154 --- src/sys/kern/vfs_lookup.c:1.153 Mon Apr 11 02:14:57 2011 +++ src/sys/kern/vfs_lookup.c Mon Apr 11 02:15:09 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_lookup.c,v 1.153 2011/04/11 02:14:57 dholland Exp $ */ +/* $NetBSD: vfs_lookup.c,v 1.154 2011/04/11 02:15:09 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.153 2011/04/11 02:14:57 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.154 2011/04/11 02:15:09 dholland Exp $"); #include "opt_magiclinks.h" @@ -854,6 +854,7 @@ struct nameidata *ndp = state->ndp; KASSERT(cnp == &ndp->ni_cnd); + *newsearchdir_ret = searchdir; /* * Handle "..": two special cases. @@ -873,10 +874,10 @@ struct proc *p = l->l_proc; for (;;) { - if (searchdir == ndp->ni_rootdir || searchdir == rootvnode) { + if (searchdir == ndp->ni_rootdir || + searchdir == rootvnode) { foundobj = searchdir; vref(foundobj); - *newsearchdir_ret = searchdir; *foundobj_ret = foundobj; return 0; } @@ -913,6 +914,7 @@ vref(searchdir); vput(tdp); vn_lock(searchdir, LK_EXCLUSIVE | LK_RETRY); + *newsearchdir_ret = searchdir; } } @@ -923,6 +925,7 @@ unionlookup: foundobj = NULL; error = VOP_LOOKUP(searchdir, &foundobj, cnp); + if (error != 0) { #ifdef DIAGNOSTIC if (foundobj != NULL) @@ -939,6 +942,7 @@ vref(searchdir); vput(tdp); vn_lock(searchdir, LK_EXCLUSIVE | LK_RETRY); + *newsearchdir_ret = searchdir; goto unionlookup; } @@ -968,7 +972,6 @@ * (possibly locked) directory vnode as searchdir. */ state->lookup_alldone = 1; - *newsearchdir_ret = searchdir; *foundobj_ret = NULL; return (0); } @@ -1020,7 +1023,6 @@ vn_lock(foundobj, LK_EXCLUSIVE | LK_RETRY); } - *newsearchdir_ret = searchdir; *foundobj_ret = foundobj; return 0; }