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.