Module Name:    src
Committed By:   dholland
Date:           Sun Jan  2 05:09:33 UTC 2011

Modified Files:
        src/sys/fs/msdosfs: msdosfs_vnops.c
        src/sys/fs/udf: udf_vnops.c
        src/sys/fs/union: union_subr.c union_vnops.c
        src/sys/fs/unionfs: unionfs_subr.c
        src/sys/kern: vfs_lookup.c vfs_syscalls.c
        src/sys/nfs: nfs_serv.c
        src/sys/sys: namei.src
        src/sys/ufs/ext2fs: ext2fs_vnops.c
        src/sys/ufs/lfs: lfs_vnops.c
        src/sys/ufs/ufs: ufs_vnops.c ufs_wapbl.c

Log Message:
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.)


To generate a diff of this commit:
cvs rdiff -u -r1.70 -r1.71 src/sys/fs/msdosfs/msdosfs_vnops.c
cvs rdiff -u -r1.61 -r1.62 src/sys/fs/udf/udf_vnops.c
cvs rdiff -u -r1.41 -r1.42 src/sys/fs/union/union_subr.c
cvs rdiff -u -r1.38 -r1.39 src/sys/fs/union/union_vnops.c
cvs rdiff -u -r1.11 -r1.12 src/sys/fs/unionfs/unionfs_subr.c
cvs rdiff -u -r1.129 -r1.130 src/sys/kern/vfs_lookup.c
cvs rdiff -u -r1.411 -r1.412 src/sys/kern/vfs_syscalls.c
cvs rdiff -u -r1.153 -r1.154 src/sys/nfs/nfs_serv.c
cvs rdiff -u -r1.19 -r1.20 src/sys/sys/namei.src
cvs rdiff -u -r1.96 -r1.97 src/sys/ufs/ext2fs/ext2fs_vnops.c
cvs rdiff -u -r1.232 -r1.233 src/sys/ufs/lfs/lfs_vnops.c
cvs rdiff -u -r1.185 -r1.186 src/sys/ufs/ufs/ufs_vnops.c
cvs rdiff -u -r1.11 -r1.12 src/sys/ufs/ufs/ufs_wapbl.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/fs/msdosfs/msdosfs_vnops.c
diff -u src/sys/fs/msdosfs/msdosfs_vnops.c:1.70 src/sys/fs/msdosfs/msdosfs_vnops.c:1.71
--- src/sys/fs/msdosfs/msdosfs_vnops.c:1.70	Tue Nov 30 10:43:03 2010
+++ src/sys/fs/msdosfs/msdosfs_vnops.c	Sun Jan  2 05:09:30 2011
@@ -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 @@
 	struct msdosfsmount *pmp;
 	struct direntry *dotdotp;
 	struct buf *bp;
-	int fdvp_dorele = 0;
 
 	pmp = VFSTOMSDOSFS(fdvp->v_mount);
 
@@ -922,16 +921,6 @@
 	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 @@
 			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 @@
 	 */
 	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 @@
 		fstrans_done(fdvp->v_mount);
 		return 0;
 	}
-	fdvp_dorele = 1;
 	VOP_UNLOCK(fdvp);
 	xp = VTODE(fvp);
 	zp = VTODE(fdvp);
@@ -1133,8 +1116,7 @@
 	vrele(tdvp);
 out:
 	ip->de_flag &= ~DE_RENAME;
-	if (fdvp_dorele)
-		vrele(fdvp);
+	vrele(fdvp);
 	vrele(fvp);
 	fstrans_done(fdvp->v_mount);
 	return (error);

Index: src/sys/fs/udf/udf_vnops.c
diff -u src/sys/fs/udf/udf_vnops.c:1.61 src/sys/fs/udf/udf_vnops.c:1.62
--- src/sys/fs/udf/udf_vnops.c:1.61	Tue Nov 30 10:43:04 2010
+++ src/sys/fs/udf/udf_vnops.c	Sun Jan  2 05:09:30 2011
@@ -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 @@
 		 * 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;

Index: src/sys/fs/union/union_subr.c
diff -u src/sys/fs/union/union_subr.c:1.41 src/sys/fs/union/union_subr.c:1.42
--- src/sys/fs/union/union_subr.c:1.41	Tue Nov 30 10:43:04 2010
+++ src/sys/fs/union/union_subr.c	Sun Jan  2 05:09:31 2011
@@ -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 @@
 	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 @@
 	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);

Index: src/sys/fs/union/union_vnops.c
diff -u src/sys/fs/union/union_vnops.c:1.38 src/sys/fs/union/union_vnops.c:1.39
--- src/sys/fs/union/union_vnops.c:1.38	Fri Jul  2 07:56:46 2010
+++ src/sys/fs/union/union_vnops.c	Sun Jan  2 05:09:31 2011
@@ -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 @@
 				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;	/* ? */

Index: src/sys/fs/unionfs/unionfs_subr.c
diff -u src/sys/fs/unionfs/unionfs_subr.c:1.11 src/sys/fs/unionfs/unionfs_subr.c:1.12
--- src/sys/fs/unionfs/unionfs_subr.c:1.11	Tue Nov 30 10:43:04 2010
+++ src/sys/fs/unionfs/unionfs_subr.c	Sun Jan  2 05:09:31 2011
@@ -317,14 +317,12 @@
 	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 @@
 	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);
 

Index: src/sys/kern/vfs_lookup.c
diff -u src/sys/kern/vfs_lookup.c:1.129 src/sys/kern/vfs_lookup.c:1.130
--- src/sys/kern/vfs_lookup.c:1.129	Sun Jan  2 05:04:58 2011
+++ src/sys/kern/vfs_lookup.c	Sun Jan  2 05:09:31 2011
@@ -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 @@
  * *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 @@
 	const char *cp;			/* DEBUG: check name ptr/len */
 #endif /* DEBUG */
 
+	(void)dummy;
+
 	/*
 	 * Setup: break out flag bits into variables.
 	 */
@@ -1544,8 +1546,6 @@
 		}
 		goto bad;
 	}
-	if (cnp->cn_flags & SAVESTART)
-		vref(dvp);
 	return (0);
 
 bad:

Index: src/sys/kern/vfs_syscalls.c
diff -u src/sys/kern/vfs_syscalls.c:1.411 src/sys/kern/vfs_syscalls.c:1.412
--- src/sys/kern/vfs_syscalls.c:1.411	Sun Jan  2 05:01:20 2011
+++ src/sys/kern/vfs_syscalls.c	Sun Jan  2 05:09:31 2011
@@ -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 @@
 	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 @@
 	 * 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 @@
 		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);

Index: src/sys/nfs/nfs_serv.c
diff -u src/sys/nfs/nfs_serv.c:1.153 src/sys/nfs/nfs_serv.c:1.154
--- src/sys/nfs/nfs_serv.c:1.153	Sun Jan  2 05:01:21 2011
+++ src/sys/nfs/nfs_serv.c	Sun Jan  2 05:09:31 2011
@@ -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 @@
 	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 @@
 		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);

Index: src/sys/sys/namei.src
diff -u src/sys/sys/namei.src:1.19 src/sys/sys/namei.src:1.20
--- src/sys/sys/namei.src:1.19	Sun Jan  2 05:04:58 2011
+++ src/sys/sys/namei.src	Sun Jan  2 05:09:30 2011
@@ -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 @@
 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

Index: src/sys/ufs/ext2fs/ext2fs_vnops.c
diff -u src/sys/ufs/ext2fs/ext2fs_vnops.c:1.96 src/sys/ufs/ext2fs/ext2fs_vnops.c:1.97
--- src/sys/ufs/ext2fs/ext2fs_vnops.c:1.96	Tue Nov 30 10:43:06 2010
+++ src/sys/ufs/ext2fs/ext2fs_vnops.c	Sun Jan  2 05:09:32 2011
@@ -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 @@
 
 		/* 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 @@
 			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 @@
 	/*
 	 * 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);

Index: src/sys/ufs/lfs/lfs_vnops.c
diff -u src/sys/ufs/lfs/lfs_vnops.c:1.232 src/sys/ufs/lfs/lfs_vnops.c:1.233
--- src/sys/ufs/lfs/lfs_vnops.c:1.232	Sat Dec 18 00:01:46 2010
+++ src/sys/ufs/lfs/lfs_vnops.c	Sun Jan  2 05:09:32 2011
@@ -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 @@
 
 		/* 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);
 		}

Index: src/sys/ufs/ufs/ufs_vnops.c
diff -u src/sys/ufs/ufs/ufs_vnops.c:1.185 src/sys/ufs/ufs/ufs_vnops.c:1.186
--- src/sys/ufs/ufs/ufs_vnops.c:1.185	Tue Nov 30 10:43:06 2010
+++ src/sys/ufs/ufs/ufs_vnops.c	Sun Jan  2 05:09:32 2011
@@ -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 @@
 
 		/* 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 @@
 			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 @@
 	/*
 	 * 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;

Index: src/sys/ufs/ufs/ufs_wapbl.c
diff -u src/sys/ufs/ufs/ufs_wapbl.c:1.11 src/sys/ufs/ufs/ufs_wapbl.c:1.12
--- src/sys/ufs/ufs/ufs_wapbl.c:1.11	Tue Nov 30 10:43:06 2010
+++ src/sys/ufs/ufs/ufs_wapbl.c	Sun Jan  2 05:09:32 2011
@@ -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 @@
 
 		/* 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 @@
 			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 @@
 	 * 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 @@
 			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;

Reply via email to