Various FreeBSD Coda fixes
Robert Watson
rwatson at FreeBSD.org
Tue Jan 22 01:34:22 PST 2008
On Mon, 21 Jan 2008, Jan Harkes wrote:
>> - ".." and "." sometimes appear to have problems in the root directory of the
>> root volume of a realm (i.e., /coda/testserver.coda.cs.cmu.edu). I'm not
>> sure if this is a Coda client bug or a kernel bug, quite possibly the
>> latter. This most likely won't be fixed for 7.0 unless it jumps out at me
>> tomorrow.
>
> Known Coda client problem. Across the volume mount we have 2 different
> objects, the root of the volume and the mountlink object on which is it
> mounted. If you do a low-level readdir on the parent you see the identifier
> of the mountlink and not the volume root. So stat('.') in the volume root
> cannot be found in the readdir('..') information, the only way to match it
> up right now is to stat() every entry you got back from readdir.
Well, there are two problems -- one is the lack of matching inode numbers
causing problems for getcwd(), the other is that sometimes stat("..") fails
with ENOENT in /coda/testserver.coda.cs.cmu.edu. I was assuming that was a
namecache or related bug in the FreeBSD version of the module, and should take
a look and see if something similar was fixed in NetBSD.
>> - getpwd() appears to have problems, possibly related to the previous bug
>> if
>> it's unable to recurse to the root. Because Coda doesn't use the global
>
> Correct. I really see this as a Coda client issue, although is has been
> fixed in the Linux kernel module by peeking in the in-kernel directory
> cache. Effectively similar to calling stat(2) on all children as long as
> they are cached, and the components of the path we're looking up are
> guaranteed to be cached because they are held pinned down by the cwd
> reference of the process that calls getcwd.
It used to be the case that the "inode number" exposed by Coda was a hash of
the viceid, which reduced 96 bits (now more) to 32 bits, leading to two
problems: (a) that if a vnode spanned two volumes, it had two viceid's
representing the historic "mounted on" and "mounted over", and (b) the
possibility of colliding inode numbers. Maintaining a database of viceids to
inode numbers is undesirable both because of the size and general feasibility
of such a database, but have you thought about maintaining a special database
of mapped inode numbers for just the volume grafting points? There are quite
a lot fewer of them running around so they could perhaps be generated and used
specifically.
Robert N M Watson
Computer Laboratory
University of Cambridge
More information about the freebsd-fs
mailing list