Date: Mon, 18 Feb 2002 21:47:10 -0800 From: Alfred Perlstein <bright@mu.org> To: Bruce Evans <bde@zeta.org.au> Cc: fs@FreeBSD.ORG Subject: Re: mkdir / == odd Message-ID: <20020219054710.GD12136@elvis.mu.org> In-Reply-To: <20020219162133.D858-100000@gamplex.bde.org> References: <20020218132751.GX12136@elvis.mu.org> <20020219162133.D858-100000@gamplex.bde.org>
next in thread | previous in thread | raw e-mail | index | archive | help
* Bruce Evans <bde@zeta.org.au> [020218 21:33] wrote:
> On Mon, 18 Feb 2002, Alfred Perlstein wrote:
>
> > # mkdir /
> > mkdir: /: Is a directory
> >
> > shouldn't mkdir get a EEXIST error back?
>
> Looks like I didn't fix this special case when I fixed trailing slash
> handling in rev.1.8 of vfs_lookup.c.
>
> > this patch to mkdir also fixes it.
>
> Um, kernel bugs can't be fixed in userland.
I wasn't sure if this error was there for hysterical raisins or
not, hence the userland work-around.
> > Index: mkdir.c
> > ===================================================================
> > RCS file: /home/ncvs/src/bin/mkdir/mkdir.c,v
> > retrieving revision 1.23
> > diff -u -r1.23 mkdir.c
> > --- mkdir.c 5 Feb 2002 21:55:12 -0000 1.23
> > +++ mkdir.c 18 Feb 2002 13:28:06 -0000
> > @@ -143,7 +143,7 @@
> > p = path;
> > oumask = 0;
> > retval = 0;
> > - if (p[0] == '/') /* Skip leading '/'. */
> > + while (p[0] == '/') /* Skip leading '/'. */
> > ++p;
> > for (first = 1, last = 0; !last ; ++p) {
> > if (p[0] == '\0')
> >
>
> Skipping even one slash here probably breaks mkdir(1) on systems where a
> leading "//" is special.
*nod*
I was looking at something like this: (untested)
Index: vfs_lookup.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/vfs_lookup.c,v
retrieving revision 1.49
diff -u -r1.49 vfs_lookup.c
--- vfs_lookup.c 13 Jan 2002 21:37:48 -0000 1.49
+++ vfs_lookup.c 18 Feb 2002 20:59:59 -0000
@@ -386,7 +386,11 @@
goto bad;
}
if (cnp->cn_nameiop != LOOKUP) {
- error = EISDIR;
+ if (cnp->cn_nameiop == CREATE &&
+ (ndp->ni_cnd.cn_flags & WILLBEDIR) != 0)
+ error = EEXIST;
+ else
+ error = EISDIR;
goto bad;
}
if (wantparent) {
--
-Alfred Perlstein [alfred@freebsd.org]
'Instead of asking why a piece of software is using "1970s technology,"
start asking why software is ignoring 30 years of accumulated wisdom.'
Tax deductible donations for FreeBSD: http://www.freebsdfoundation.org/
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-fs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020219054710.GD12136>
