Various FreeBSD Coda fixes
Robert Watson
rwatson at FreeBSD.org
Wed Feb 13 11:12:13 UTC 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.
>
>> - 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.
I explored this issue a bit more, and have some local patches to make Coda on
FreeBSD use the global VFS namecache, which seems to help with some of these
problems.
However, there is one case it's not helping with: stat("..", &sb) on the root
of /coda/testserver.coda.cs.cmu.edu returns ENOENT once the namecache is
flushed as a result of a CODA_PURGEUSER (i.e., cunlog). It looks like Venus
is returning a lookup error:
cinnamon-coda# clog guest
username: guest at testserver.coda.cs.cmu.edu
Password:
cinnamon-coda# cd /coda/testserver.coda.cs.cmu.edu/
cinnamon-coda# cul
cinnamon-coda# cunlog
cinnamon-coda# stat ..
stat: ..: stat: No such file or directory
Here's the kernel module debug output:
Doing a call for 9.663
vcwrite got a call for 9.663
lookup: .. in [2.7f000000.1.1]
Doing a call for 10.664
vcwrite got a call for 10.664
lookup error on [2.7f000000.1.1] (..)2
So it looks like venus_lookup() isn't returning /coda's fid on a lookup of
".." in /coda/testserver.coda.cs.cmu.edu. The BSD Coda kernel module (and
presumably the original Mach code it was based on) has a credential-tagged
namecache, so actually flushes the namecache for the uid passed into
CODA_PURGEUSER. Linux's Coda module has an access cache that it flushes for
all users on CODA_PURGEUSER, but doesn't touch the namecache. I can adopt the
same approach in FreeBSD, but I think venus probably should know how to
resolve ".." for the kernel module, rather than relying solely on the
namecache.
Robert N M Watson
Computer Laboratory
University of Cambridge
More information about the freebsd-fs
mailing list