On Wed, 2008-06-04 at 10:42 +0800, Ian Kent wrote: > On Wed, 2008-06-04 at 00:00 +0100, Al Viro wrote: > > On Tue, Jun 03, 2008 at 03:53:36PM -0400, Jeff Moyer wrote: > > > > > autofs4_lookup is called on behalf a process trying to walk into an > > > automounted directory. That dentry's d_flags is set to > > > DCACHE_AUTOFS_PENDING but not hashed. A waitqueue entry is created, > > > indexed off of the name of the dentry. A callout is made to the > > > automount daemon (via autofs4_wait). > > > > > > The daemon looks up the directory name in its configuration. If it > > > finds a valid map entry, it will then create the directory using > > > sys_mkdir. The autofs4_lookup call on behalf of the daemon (oz_mode == > > > 1) will return NULL, and then the mkdir call will be made. The > > > autofs4_mkdir function then instantiates the dentry which, by the way, > > > is different from the original dentry passed to autofs4_lookup. (This > > > dentry also does not get the PENDING flag set, which is a bug addressed > > > by a patch set that Ian and I have been working on; specifically, the > > > idea is to reuse the dentry from the original lookup, but I digress). > > > > > > The daemon then mounts the share on the given directory and issues an > > > ioctl to wakeup the waiter. When awakened, the waiter clears the > > > DCACHE_AUTOFS_PENDING flag, does another lookup of the name in the > > > dcache and returns that dentry if found. > > > Later, the dentry gets expired via another ioctl. That path sets > > > the AUTOFS_INF_EXPIRING flag in the d_fsdata associated with the dentry. > > > It then calls out to the daemon to perform the unmount and rmdir. The > > > rmdir unhashes the dentry (and places it on the rehash list). > > > > > > The dentry is removed from the rehash list if there was a racing expire > > > and mount or if the dentry is released. > > > > > > This description is valid for the tree as it stands today. Ian and I > > > have been working on fixing some other race conditions which will change > > > the dentry life cycle (for the better, I hope). > > > > So what happens if new lookup hits between umount and rmdir? > > It will wait for the expire to complete and then wait for a mount > request to the daemon. Actually, that explanation is a bit simple minded. It should wait for the expire in ->revalidate(). Following the expire completion d_invalidate() should return 0, since the dentry is now unhashed, which causes ->revalidate() to return 0. do_lookup() should see this and call a ->lookup(). But maybe I've missed something as I'm seeing a problem now. Ian -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html