Module Name:    src
Committed By:   dholland
Date:           Sun Jan  2 05:04:59 UTC 2011

Modified Files:
        src/lib/libp2k: p2k.c
        src/sys/kern: vfs_lookup.c
        src/sys/sys: namei.src

Log Message:
Add an INRELOOKUP namei flag. Sigh. (We don't need more namei flags.)

However, because of a protocol deficiency puffs relies on being able
to keep track of VOP_LOOKUP calls by inspecting their contents, and
this at least allows it to use something vaguely principled instead of
making wild guesses based on whether SAVESTART is set.

Update libp2k to use INRELOOKUP instead of SAVESTART.


To generate a diff of this commit:
cvs rdiff -u -r1.47 -r1.48 src/lib/libp2k/p2k.c
cvs rdiff -u -r1.128 -r1.129 src/sys/kern/vfs_lookup.c
cvs rdiff -u -r1.18 -r1.19 src/sys/sys/namei.src

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libp2k/p2k.c
diff -u src/lib/libp2k/p2k.c:1.47 src/lib/libp2k/p2k.c:1.48
--- src/lib/libp2k/p2k.c:1.47	Tue Nov 30 15:42:11 2010
+++ src/lib/libp2k/p2k.c	Sun Jan  2 05:04:59 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: p2k.c,v 1.47 2010/11/30 15:42:11 pooka Exp $	*/
+/*	$NetBSD: p2k.c,v 1.48 2011/01/02 05:04:59 dholland Exp $	*/
 
 /*
  * Copyright (c) 2007, 2008, 2009  Antti Kantee.  All Rights Reserved.
@@ -680,8 +680,8 @@
 
 	/*
 	 * XXX the rename lookup protocol is currently horribly
-	 * broken.  We get 1) DELETE with SAVESTART 2) DELETE
-	 * without SAVESTART 3) RENAME.  Hold on to this like
+	 * broken.  We get 1) DELETE 2) DELETE with INRELOOKUP
+	 * 3) RENAME.  Hold on to this like
 	 * it were the absolute truth for now.  However, do
 	 * not sprinkle asserts based on this due to abovementioned
 	 * brokenness -- some file system drivers might not
@@ -691,7 +691,7 @@
 	if (pcn->pcn_flags & RUMP_NAMEI_INRENAME) {
 		if (pcn->pcn_nameiop == RUMP_NAMEI_DELETE) {
 			/* save path from the first lookup */
-			if (pcn->pcn_flags & RUMP_NAMEI_SAVESTART) {
+			if ((pcn->pcn_flags & RUMP_NAMEI_INRELOOKUP) == 0) {
 				if (p2n_dir->p2n_cn_ren_src)
 					freecn(p2n_dir->p2n_cn_ren_src);
 				p2n_dir->p2n_cn_ren_src = cn;

Index: src/sys/kern/vfs_lookup.c
diff -u src/sys/kern/vfs_lookup.c:1.128 src/sys/kern/vfs_lookup.c:1.129
--- src/sys/kern/vfs_lookup.c:1.128	Sun Jan  2 05:01:20 2011
+++ src/sys/kern/vfs_lookup.c	Sun Jan  2 05:04:58 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_lookup.c,v 1.128 2011/01/02 05:01:20 dholland Exp $	*/
+/*	$NetBSD: vfs_lookup.c,v 1.129 2011/01/02 05:04:58 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.128 2011/01/02 05:01:20 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.129 2011/01/02 05:04:58 dholland Exp $");
 
 #include "opt_magiclinks.h"
 
@@ -399,6 +399,7 @@
 {
 	state->ndp = ndp;
 	state->cnp = &ndp->ni_cnd;
+	KASSERT((state->cnp->cn_flags & INRELOOKUP) == 0);
 
 	state->namei_startdir = NULL;
 
@@ -1513,7 +1514,10 @@
 	/*
 	 * We now have a segment name to search for, and a directory to search.
 	 */
-	if ((error = VOP_LOOKUP(dvp, vpp, cnp)) != 0) {
+	cnp->cn_flags |= INRELOOKUP;
+	error = VOP_LOOKUP(dvp, vpp, cnp);
+	cnp->cn_flags &= ~INRELOOKUP;
+	if ((error) != 0) {
 #ifdef DIAGNOSTIC
 		if (*vpp != NULL)
 			panic("leaf `%s' should be empty", cnp->cn_nameptr);

Index: src/sys/sys/namei.src
diff -u src/sys/sys/namei.src:1.18 src/sys/sys/namei.src:1.19
--- src/sys/sys/namei.src:1.18	Sun Jan  2 05:01:20 2011
+++ src/sys/sys/namei.src	Sun Jan  2 05:04:58 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: namei.src,v 1.18 2011/01/02 05:01:20 dholland Exp $	*/
+/*	$NetBSD: namei.src,v 1.19 2011/01/02 05:04:58 dholland Exp $	*/
 
 /*
  * Copyright (c) 1985, 1989, 1991, 1993
@@ -166,7 +166,8 @@
 NAMEIFL	REQUIREDIR	0x0080000	/* must be a directory */
 NAMEIFL	CREATEDIR	0x0200000	/* trailing slashes are ok */
 NAMEIFL	INRENAME	0x0400000	/* operation is a part of ``rename'' */
-NAMEIFL	PARAMASK	0x06fff00	/* mask of parameter descriptors */
+NAMEIFL	INRELOOKUP	0x0800000	/* set while inside relookup() */
+NAMEIFL	PARAMASK	0x0efff00	/* mask of parameter descriptors */
 
 /*
  * Initialization of an nameidata structure.

Reply via email to