Subject: Re: namei(".") behaviour
To: Juergen Hannken-Illjes <hannken@eis.cs.tu-bs.de>
From: Greywolf <greywolf@starwolf.com>
List: tech-kern
Date: 07/29/2003 12:47:01
Thus spake Juergen Hannken-Illjes ("JH> ") sometime Today...
JH> > While looking over the filesystem snapshot code from FreeBSD I discovered a
JH> > somewhat strange behaviour of namei():
JH> >
JH> > If called for a DOT directory ("." or "...path/.") it returns with
JH> >
JH> > nd.ni_dvp == nd.ni_vp
JH> >
JH> > Even if called with LOCKPARENT flag both (identical) vnodes are not locked.
JH> > This leads to a bunch of code like
JH> >
JH> > if (nd.ni_dvp == nd.ni_vp)
JH> > vrele(nd.ni_dvp);
JH> > else
JH> > vput(nd.ni_dvp);
JH> >
JH> > Is there a reason why the parent directory (nd.ni_dvp) is returned unlocked?
(kernel_t) (clue *) 404 question:
Why would you need to lock a parent if you're referencing "."?
JH> > If the parent directory was locked this code would become as simple as
JH> >
JH> > vput(nd.ni_dvp);
JH>
JH> To follow up myself...
JH>
JH> With Rev. 1.23 (mycroft) of kern/vfs_lookup.c a check for degenerate name
JH> was removed. This check (in lookup) returned:
JH>
JH> ENOTDIR if the last component was "" and not a directory
JH> EISDIR if the last component was "" and mode != LOOKUP
?!?
Do you mean
(nd = namei("/path/to/file/")) == ENOTDIR;
That makes sense.
I don't follow why (nd = namei("/path/to/dir/")) == EISDIR), though.
--*greywolf;
--
NetBSD: Someday, we won't burn your toast.