Remove the special refcount behavior (adding an extra reference to the

parent dir) associated with SAVESTART in relookup().

Check all call sites to make sure that SAVESTART wasn't set while
calling relookup(); if it was, adjust the refcount behavior. Remove
related references to SAVESTART.

The only code that was reaching the extra ref was msdosfs_rename,
where the refcount behavior was already fairly broken and/or gross;
repair it.

Add a dummy 4th argument to relookup to make sure code that hasn't
been inspected won't compile. (This will go away next time the
relookup semantics change, which they will.)
This commit is contained in:
dholland 2011-01-02 05:09:30 +00:00
parent 04a4956fe1
commit 13fc777536
13 changed files with 61 additions and 96 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: msdosfs_vnops.c,v 1.70 2010/11/30 10:43:03 dholland Exp $ */
/* $NetBSD: msdosfs_vnops.c,v 1.71 2011/01/02 05:09:30 dholland Exp $ */
/*-
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.70 2010/11/30 10:43:03 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.71 2011/01/02 05:09:30 dholland Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -829,7 +829,6 @@ msdosfs_rename(void *v)
struct msdosfsmount *pmp;
struct direntry *dotdotp;
struct buf *bp;
int fdvp_dorele = 0;
pmp = VFSTOMSDOSFS(fdvp->v_mount);
@ -922,16 +921,6 @@ abortit:
if (VTODE(fdvp)->de_StartCluster != VTODE(tdvp)->de_StartCluster)
newparent = 1;
/*
* XXX: We can do this here because rename uses SAVEFART and
* therefore fdvp has at least two references (one doesn't
* belong to us, though, and that's evil). We'll get
* another "extra" reference when we do relookup(), so we
* need to compensate. We should *NOT* be doing this, but
* it works, so whatever.
*/
vrele(fdvp);
if (doingdirectory && newparent) {
if (error) /* write access check above */
goto tdvpbad;
@ -939,22 +928,19 @@ abortit:
vput(tvp);
tvp = NULL;
/*
* doscheckpath() vput()'s dp,
* so we have to do a relookup afterwards
* doscheckpath() vput()'s tdvp (dp == VTODE(tdvp)),
* so we have to get an extra ref to it first, and
* because it's been unlocked we need to do a relookup
* afterwards in case tvp has changed.
*/
vref(tdvp);
if ((error = doscheckpath(ip, dp)) != 0)
goto out;
if ((tcnp->cn_flags & SAVESTART) == 0)
panic("msdosfs_rename: lost to startdir");
vn_lock(tdvp, LK_EXCLUSIVE | LK_RETRY);
if ((error = relookup(tdvp, &tvp, tcnp)) != 0) {
if ((error = relookup(tdvp, &tvp, tcnp, 0)) != 0) {
VOP_UNLOCK(tdvp);
goto out;
}
/*
* XXX: SAVESTART causes us to get a reference, but
* that's released already above in doscheckpath()
*/
dp = VTODE(tdvp);
xp = tvp ? VTODE(tvp) : NULL;
}
@ -1004,11 +990,9 @@ abortit:
*/
fcnp->cn_flags &= ~MODMASK;
fcnp->cn_flags |= LOCKPARENT | LOCKLEAF;
if ((fcnp->cn_flags & SAVESTART) == 0)
panic("msdosfs_rename: lost from startdir");
VOP_UNLOCK(tdvp);
vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY);
if ((error = relookup(fdvp, &fvp, fcnp))) {
if ((error = relookup(fdvp, &fvp, fcnp, 0))) {
VOP_UNLOCK(fdvp);
vrele(ap->a_fvp);
vrele(tdvp);
@ -1027,7 +1011,6 @@ abortit:
fstrans_done(fdvp->v_mount);
return 0;
}
fdvp_dorele = 1;
VOP_UNLOCK(fdvp);
xp = VTODE(fvp);
zp = VTODE(fdvp);
@ -1133,8 +1116,7 @@ bad:
vrele(tdvp);
out:
ip->de_flag &= ~DE_RENAME;
if (fdvp_dorele)
vrele(fdvp);
vrele(fdvp);
vrele(fvp);
fstrans_done(fdvp->v_mount);
return (error);

View File

@ -1,4 +1,4 @@
/* $NetBSD: udf_vnops.c,v 1.61 2010/11/30 10:43:04 dholland Exp $ */
/* $NetBSD: udf_vnops.c,v 1.62 2011/01/02 05:09:30 dholland Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#ifndef lint
__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.61 2010/11/30 10:43:04 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.62 2011/01/02 05:09:30 dholland Exp $");
#endif /* not lint */
@ -2042,8 +2042,7 @@ udf_rename(void *v)
* re-lookup tvp since the parent has been unlocked, so could
* have changed/removed in the meantime.
*/
tcnp->cn_flags &= ~SAVESTART;
error = relookup(tdvp, &tvp, tcnp);
error = relookup(tdvp, &tvp, tcnp, 0);
if (error) {
vput(tdvp);
goto out;

View File

@ -1,4 +1,4 @@
/* $NetBSD: union_subr.c,v 1.41 2010/11/30 10:43:04 dholland Exp $ */
/* $NetBSD: union_subr.c,v 1.42 2011/01/02 05:09:31 dholland Exp $ */
/*
* Copyright (c) 1994
@ -72,7 +72,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: union_subr.c,v 1.41 2010/11/30 10:43:04 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: union_subr.c,v 1.42 2011/01/02 05:09:31 dholland Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -815,7 +815,7 @@ union_relookup(
cn->cn_hash = cnp->cn_hash;
cn->cn_consume = cnp->cn_consume;
error = relookup(dvp, vpp, cn);
error = relookup(dvp, vpp, cn, 0);
if (error) {
PNBUF_PUT(pnbuf);
*pnbuf_ret = NULL;
@ -972,7 +972,7 @@ union_vn_create(struct vnode **vpp, struct union_node *un, struct lwp *l)
cn.cn_consume = 0;
vn_lock(un->un_dirvp, LK_EXCLUSIVE | LK_RETRY);
error = relookup(un->un_dirvp, &vp, &cn);
error = relookup(un->un_dirvp, &vp, &cn, 0);
if (error) {
PNBUF_PUT(pnbuf);
VOP_UNLOCK(un->un_dirvp);

View File

@ -1,4 +1,4 @@
/* $NetBSD: union_vnops.c,v 1.38 2010/07/02 07:56:46 hannken Exp $ */
/* $NetBSD: union_vnops.c,v 1.39 2011/01/02 05:09:31 dholland Exp $ */
/*
* Copyright (c) 1992, 1993, 1994, 1995
@ -72,7 +72,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: union_vnops.c,v 1.38 2010/07/02 07:56:46 hannken Exp $");
__KERNEL_RCSID(0, "$NetBSD: union_vnops.c,v 1.39 2011/01/02 05:09:31 dholland Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -1228,7 +1228,7 @@ union_link(void *v)
vp = NULLVP;
if (dun->un_uppervp == NULLVP)
panic("union: null upperdvp?");
error = relookup(ap->a_dvp, &vp, ap->a_cnp);
error = relookup(ap->a_dvp, &vp, ap->a_cnp, 0);
if (error) {
VOP_UNLOCK(ap->a_vp);
return EROFS; /* ? */

View File

@ -317,14 +317,12 @@ unionfs_relookup(struct vnode *dvp, struct vnode **vpp,
cn->cn_consume = cnp->cn_consume;
if (nameiop == DELETE)
cn->cn_flags |= (cnp->cn_flags & (DOWHITEOUT | SAVESTART));
else if (RENAME == nameiop)
cn->cn_flags |= (cnp->cn_flags & SAVESTART);
cn->cn_flags |= (cnp->cn_flags & DOWHITEOUT);
vref(dvp);
VOP_UNLOCK(dvp);
if ((error = relookup(dvp, vpp, cn))) {
if ((error = relookup(dvp, vpp, cn, 0))) {
PNBUF_PUT(pnbuf);
*pnbuf_ret = NULL;
vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY);
@ -631,7 +629,7 @@ unionfs_vn_create_on_upper(struct vnode **vpp, struct vnode *udvp,
cn.cn_consume = 0;
vref(udvp);
if ((error = relookup(udvp, &vp, &cn)) != 0)
if ((error = relookup(udvp, &vp, &cn, 0)) != 0)
goto unionfs_vn_create_on_upper_free_out2;
vrele(udvp);

View File

@ -1,4 +1,4 @@
/* $NetBSD: vfs_lookup.c,v 1.129 2011/01/02 05:04:58 dholland Exp $ */
/* $NetBSD: vfs_lookup.c,v 1.130 2011/01/02 05:09:31 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.129 2011/01/02 05:04:58 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.130 2011/01/02 05:09:31 dholland Exp $");
#include "opt_magiclinks.h"
@ -1463,7 +1463,7 @@ lookup_for_nfsd_index(struct nameidata *ndp, struct vnode *startdir)
* *vpp is locked on exit unless it's NULL.
*/
int
relookup(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp)
relookup(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp, int dummy)
{
int rdonly; /* lookup read-only flag bit */
int error = 0;
@ -1472,6 +1472,8 @@ relookup(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp)
const char *cp; /* DEBUG: check name ptr/len */
#endif /* DEBUG */
(void)dummy;
/*
* Setup: break out flag bits into variables.
*/
@ -1544,8 +1546,6 @@ relookup(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp)
}
goto bad;
}
if (cnp->cn_flags & SAVESTART)
vref(dvp);
return (0);
bad:

View File

@ -1,4 +1,4 @@
/* $NetBSD: vfs_syscalls.c,v 1.411 2011/01/02 05:01:20 dholland Exp $ */
/* $NetBSD: vfs_syscalls.c,v 1.412 2011/01/02 05:09:31 dholland Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.411 2011/01/02 05:01:20 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.412 2011/01/02 05:09:31 dholland Exp $");
#ifdef _KERNEL_OPT
#include "opt_fileassoc.h"
@ -3438,7 +3438,6 @@ do_sys_rename(const char *from, const char *to, enum uio_seg seg, int retain)
struct mount *fs;
struct lwp *l = curlwp;
struct proc *p;
uint32_t saveflag;
int error;
error = pathbuf_maybe_copyin(from, seg, &frompb);
@ -3482,9 +3481,6 @@ do_sys_rename(const char *from, const char *to, enum uio_seg seg, int retain)
* order and do the lookups in the right places, but that's a
* major rototill.
*
* Preserve the SAVESTART in cn_flags, because who knows what
* might happen if we don't.
*
* Note: this logic (as well as this whole function) is cloned
* in nfs_serv.c. Proceed accordingly.
*/
@ -3500,11 +3496,8 @@ do_sys_rename(const char *from, const char *to, enum uio_seg seg, int retain)
vrele(fromnd.ni_dvp);
goto out1;
}
saveflag = fromnd.ni_cnd.cn_flags & SAVESTART;
fromnd.ni_cnd.cn_flags &= ~SAVESTART;
vn_lock(fromnd.ni_dvp, LK_EXCLUSIVE | LK_RETRY);
error = relookup(fromnd.ni_dvp, &fromnd.ni_vp, &fromnd.ni_cnd);
fromnd.ni_cnd.cn_flags |= saveflag;
error = relookup(fromnd.ni_dvp, &fromnd.ni_vp, &fromnd.ni_cnd, 0);
if (error) {
VOP_UNLOCK(fromnd.ni_dvp);
VFS_RENAMELOCK_EXIT(fs);

View File

@ -1,4 +1,4 @@
/* $NetBSD: nfs_serv.c,v 1.153 2011/01/02 05:01:21 dholland Exp $ */
/* $NetBSD: nfs_serv.c,v 1.154 2011/01/02 05:09:31 dholland Exp $ */
/*
* Copyright (c) 1989, 1993
@ -55,7 +55,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nfs_serv.c,v 1.153 2011/01/02 05:01:21 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: nfs_serv.c,v 1.154 2011/01/02 05:09:31 dholland Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -1898,7 +1898,6 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, struct lwp *l
nfsrvfh_t fnsfh, tnsfh;
u_quad_t frev;
uid_t saved_uid;
uint32_t saveflag;
#ifndef nolint
fvp = (struct vnode *)0;
@ -1956,11 +1955,8 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, struct lwp *l
vrele(fromnd.ni_dvp);
goto out1;
}
saveflag = fromnd.ni_cnd.cn_flags & SAVESTART;
fromnd.ni_cnd.cn_flags &= ~SAVESTART;
vn_lock(fromnd.ni_dvp, LK_EXCLUSIVE | LK_RETRY);
error = relookup(fromnd.ni_dvp, &fromnd.ni_vp, &fromnd.ni_cnd);
fromnd.ni_cnd.cn_flags |= saveflag;
error = relookup(fromnd.ni_dvp, &fromnd.ni_vp, &fromnd.ni_cnd, 0);
if (error) {
VOP_UNLOCK(fromnd.ni_dvp);
VFS_RENAMELOCK_EXIT(localfs);

View File

@ -1,4 +1,4 @@
/* $NetBSD: namei.src,v 1.19 2011/01/02 05:04:58 dholland Exp $ */
/* $NetBSD: namei.src,v 1.20 2011/01/02 05:09:30 dholland Exp $ */
/*
* Copyright (c) 1985, 1989, 1991, 1993
@ -257,7 +257,7 @@ int namei(struct nameidata *);
uint32_t namei_hash(const char *, const char **);
int lookup_for_nfsd(struct nameidata *, struct vnode *, int neverfollow);
int lookup_for_nfsd_index(struct nameidata *, struct vnode *);
int relookup(struct vnode *, struct vnode **, struct componentname *);
int relookup(struct vnode *, struct vnode **, struct componentname *, int);
void cache_purge1(struct vnode *, const struct componentname *, int);
#define PURGE_PARENTS 1
#define PURGE_CHILDREN 2

View File

@ -1,4 +1,4 @@
/* $NetBSD: ext2fs_vnops.c,v 1.96 2010/11/30 10:43:06 dholland Exp $ */
/* $NetBSD: ext2fs_vnops.c,v 1.97 2011/01/02 05:09:32 dholland Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.96 2010/11/30 10:43:06 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.97 2011/01/02 05:09:32 dholland Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -700,11 +700,11 @@ abortit:
/* Delete source. */
vrele(fvp);
fcnp->cn_flags &= ~(MODMASK | SAVESTART);
fcnp->cn_flags &= ~(MODMASK);
fcnp->cn_flags |= LOCKPARENT | LOCKLEAF;
fcnp->cn_nameiop = DELETE;
vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY);
if ((error = relookup(fdvp, &fvp, fcnp))) {
if ((error = relookup(fdvp, &fvp, fcnp, 0))) {
vput(fdvp);
return (error);
}
@ -799,9 +799,8 @@ abortit:
vrele(tdvp);
goto out;
}
tcnp->cn_flags &= ~SAVESTART;
vn_lock(tdvp, LK_EXCLUSIVE | LK_RETRY);
if ((error = relookup(tdvp, &tvp, tcnp)) != 0) {
if ((error = relookup(tdvp, &tvp, tcnp, 0)) != 0) {
vput(tdvp);
goto out;
}
@ -931,10 +930,10 @@ abortit:
/*
* 3) Unlink the source.
*/
fcnp->cn_flags &= ~(MODMASK | SAVESTART);
fcnp->cn_flags &= ~(MODMASK);
fcnp->cn_flags |= LOCKPARENT | LOCKLEAF;
vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY);
if ((error = relookup(fdvp, &fvp, fcnp))) {
if ((error = relookup(fdvp, &fvp, fcnp, 0))) {
vput(fdvp);
vrele(ap->a_fvp);
return (error);

View File

@ -1,4 +1,4 @@
/* $NetBSD: lfs_vnops.c,v 1.232 2010/12/18 00:01:46 eeh Exp $ */
/* $NetBSD: lfs_vnops.c,v 1.233 2011/01/02 05:09:32 dholland Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.232 2010/12/18 00:01:46 eeh Exp $");
__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.233 2011/01/02 05:09:32 dholland Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@ -852,11 +852,11 @@ lfs_rename(void *v)
/* Delete source. */
vrele(fvp);
fcnp->cn_flags &= ~(MODMASK | SAVESTART);
fcnp->cn_flags &= ~(MODMASK);
fcnp->cn_flags |= LOCKPARENT | LOCKLEAF;
fcnp->cn_nameiop = DELETE;
vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY);
if ((error = relookup(fdvp, &fvp, fcnp))) {
if ((error = relookup(fdvp, &fvp, fcnp, 0))) {
vput(fdvp);
return (error);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: ufs_vnops.c,v 1.185 2010/11/30 10:43:06 dholland Exp $ */
/* $NetBSD: ufs_vnops.c,v 1.186 2011/01/02 05:09:32 dholland Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.185 2010/11/30 10:43:06 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.186 2011/01/02 05:09:32 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@ -1024,11 +1024,11 @@ ufs_rename(void *v)
/* Delete source. */
vrele(fvp);
fcnp->cn_flags &= ~(MODMASK | SAVESTART);
fcnp->cn_flags &= ~(MODMASK);
fcnp->cn_flags |= LOCKPARENT | LOCKLEAF;
fcnp->cn_nameiop = DELETE;
vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY);
if ((error = relookup(fdvp, &fvp, fcnp))) {
if ((error = relookup(fdvp, &fvp, fcnp, 0))) {
vput(fdvp);
return (error);
}
@ -1118,9 +1118,8 @@ ufs_rename(void *v)
vrele(tdvp);
goto out;
}
tcnp->cn_flags &= ~SAVESTART;
vn_lock(tdvp, LK_EXCLUSIVE | LK_RETRY);
error = relookup(tdvp, &tvp, tcnp);
error = relookup(tdvp, &tvp, tcnp, 0);
if (error != 0) {
vput(tdvp);
goto out;
@ -1253,10 +1252,10 @@ ufs_rename(void *v)
/*
* 3) Unlink the source.
*/
fcnp->cn_flags &= ~(MODMASK | SAVESTART);
fcnp->cn_flags &= ~(MODMASK);
fcnp->cn_flags |= LOCKPARENT | LOCKLEAF;
vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY);
if ((error = relookup(fdvp, &fvp, fcnp))) {
if ((error = relookup(fdvp, &fvp, fcnp, 0))) {
vput(fdvp);
vrele(ap->a_fvp);
goto out2;

View File

@ -1,4 +1,4 @@
/* $NetBSD: ufs_wapbl.c,v 1.11 2010/11/30 10:43:06 dholland Exp $ */
/* $NetBSD: ufs_wapbl.c,v 1.12 2011/01/02 05:09:32 dholland Exp $ */
/*-
* Copyright (c) 2003,2006,2008 The NetBSD Foundation, Inc.
@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ufs_wapbl.c,v 1.11 2010/11/30 10:43:06 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: ufs_wapbl.c,v 1.12 2011/01/02 05:09:32 dholland Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -219,11 +219,11 @@ wapbl_ufs_rename(void *v)
/* Delete source. */
vrele(fvp);
fcnp->cn_flags &= ~(MODMASK | SAVESTART);
fcnp->cn_flags &= ~(MODMASK);
fcnp->cn_flags |= LOCKPARENT | LOCKLEAF;
fcnp->cn_nameiop = DELETE;
vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY);
if ((error = relookup(fdvp, &fvp, fcnp))) {
if ((error = relookup(fdvp, &fvp, fcnp, 0))) {
vput(fdvp);
return (error);
}
@ -301,10 +301,9 @@ wapbl_ufs_rename(void *v)
tdp = NULL;
goto out;
}
tcnp->cn_flags &= ~SAVESTART;
tdp = NULL;
vn_lock(tdvp, LK_EXCLUSIVE | LK_RETRY);
error = relookup(tdvp, &tvp, tcnp);
error = relookup(tdvp, &tvp, tcnp, 0);
if (error != 0) {
vput(tdvp);
goto out;
@ -330,7 +329,7 @@ wapbl_ufs_rename(void *v)
* This was moved up to before the journal lock to
* avoid potential deadlock
*/
fcnp->cn_flags &= ~(MODMASK | SAVESTART);
fcnp->cn_flags &= ~(MODMASK);
fcnp->cn_flags |= LOCKPARENT | LOCKLEAF;
if (newparent) {
/* Check for the rename("foo/foo", "foo") case. */
@ -339,7 +338,7 @@ wapbl_ufs_rename(void *v)
goto out;
}
vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY);
if ((error = relookup(fdvp, &fvp, fcnp))) {
if ((error = relookup(fdvp, &fvp, fcnp, 0))) {
vput(fdvp);
vrele(ap->a_fvp);
goto out2;