--- src/sys/vfs/nullfs/null_vfsops.c 2004/10/12 19:21:04 1.13 +++ src/sys/vfs/nullfs/null_vfsops.c 2004/11/12 00:09:40 1.14 @@ -52,7 +52,7 @@ #include #include #include -#include +#include #include "null.h" extern struct vnodeopv_entry_desc null_vnodeop_entries[]; @@ -91,7 +91,7 @@ nullfs_mount(struct mount *mp, char *pat struct null_mount *xmp; u_int size; int isvnunlocked = 0; - struct nameidata nd; + struct nlookupdata nd; NULLFSDEBUG("nullfs_mount(mp = %p)\n", (void *)mp); @@ -121,28 +121,27 @@ nullfs_mount(struct mount *mp, char *pat /* * Find lower node */ - NDINIT(&nd, NAMEI_LOOKUP, CNP_FOLLOW | CNP_WANTPARENT | CNP_LOCKLEAF, - UIO_USERSPACE, args.target, td); - error = namei(&nd); + lowerrootvp = NULL; + error = nlookup_init(&nd, args.target, UIO_USERSPACE, NLC_FOLLOW); + if (error == 0) + error = nlookup(&nd); + if (error == 0) { + error = cache_vget(nd.nl_ncp, nd.nl_cred, LK_EXCLUSIVE, + &lowerrootvp); + } + nlookup_done(&nd); + /* * Re-lock vnode. */ if (isvnunlocked && !VOP_ISLOCKED(mp->mnt_vnodecovered, NULL)) vn_lock(mp->mnt_vnodecovered, LK_EXCLUSIVE | LK_RETRY, td); - if (error) return (error); - NDFREE(&nd, NDF_ONLY_PNBUF); - + /* * Sanity check on lower vnode - */ - lowerrootvp = nd.ni_vp; - - vrele(nd.ni_dvp); - nd.ni_dvp = NULLVP; - - /* + * * Check multi null mount to avoid `lock against myself' panic. */ if (lowerrootvp == VTONULL(mp->mnt_vnodecovered)->null_lowervp) {