Re: Eureka! (was Re: UTF-8 and case-insensitivity)

Theodore Ts'o
2004-02-20T02:31:52Z

On Thu, Feb 19, 2004 at 11:48:50AM -0800, Linus Torvalds wrote:
> Let's leave the "check_or_create_name()" thing for now, and see how we can
> use this in user space (and realize that we only do this on cache failure,
> so this is the "slow case"):
>
> set_bit_one(dir);
> lseek(dir, 0, SEEK_SET);
> while (readdir(dir, de)) {
> stat(de->d_name);
> .. might also compare the name here with whatever it is
> working on right now..
> }
> set_bit_two_if_one_is_set(dirfd);
>
> Notice what the above does? After the above loop, bit two will be set IFF
> the dentry cache now contains every single name in the directory.
> Otherwise it will be clear. Bit two will basically be a "dcache complete"
> bit.

Why do this in user space? The set_bit_one() and
set_bit_two_if_one_is_set() can't really be used for anything else,
really, so why not let check_or_create_name() do the above loop if
necessary to populate all of the dcache entries in the dentry cache?

That way we only expose one system call (check_or_create_name()), and
we let the internal dcache flags be an internal implementation detail.
It will also make it much easier to avoid races.

- Ted