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