Hi Ian, Al, I've done some updating to consolidate the patches and update the documentation. I've also added a patch to attempt to make d_manage() capable of handling RCU-walk (can you test that Ian?).
The patches are committed to: http://git.kernel.org/?p=linux/kernel/git/dhowells/linux-2.6-automount.git;a=summary and should appear there eventually. --- The attached patches implement VFS support for automounting - which several filesystems, including autofs, can use to resolve problems with their current implementations. This means that these filesystems no longer have to abuse lookup(), follow_link() and d_revalidate() to achieve the desired effects. Probably the most significant advantage for autofs is a long standing potential deadlock can be removed which otherwise cannot be resolved. These patches introduce a couple of new dentry operations for use by automounters and make AFS, NFS, CIFS and autofs4 use them. There are two dentry operations provided: (1) struct vfsmount *(*d_automount)(struct path *path); This is used by follow_automount() in fs/namei.c to ask the filesystem that owns the dentry at the current path point to mount something on @path. It is called if DCACHE_NEED_AUTOMOUNT (which is propagated from the S_AUTOMOUNT inode flag) is flagged on a dentry and if that dentry has nothing mounted on it in the current namespace when someone attempts to use that dentry. No locks will be held when this is called. d_op->d_automount() may return one of: (a) The vfsmount mounted upon that dentry, in which case pathwalk will move to the root dentry of that vfsmount. ->d_automount() must have in some manner mounted this before returning. (b) NULL if something was already mounted there, in which case pathwalk will loop around and recheck the mountings. (c) -EISDIR, in which case pathwalk will stop at this point and attempt to use that dentry as the object of interest. If the current dentry is not terminal within the path, -EREMOTE will be returned. (d) An error value, to be returned immediately. Automount transits are counted as symlinks to prevent circular references from being a problem. If one is detected, -ELOOP will be returned. If stat() is given AT_NO_AUTOMOUNT then d_op->d_automount() will not be invoked on a terminal dentry; instead that dentry will be returned by pathwalk. follow_automount() also does not invoke d_op->d_automount() if the caller gave AT_SYMLINK_NOFOLLOW to stat(), but rather returns the base dentry. (2) int (*d_manage)(struct path *path, bool mounting_here); This is called by managed_dentry() or follow_down() in fs/namei.c to indicate to a filesystem that pathwalk is about to step off of the current path point and walk to another point in the path. This is called if DCACHE_MANAGE_TRANSIT is set on a dentry. This can then be used by autofs to stop non-daemon processes from walking until it has finished constructing or expiring the tree behind the dentry. It could also be used to prevent undesirables from mounting on this dentry. @mounting_here is true if called from follow_down() from mount, in which case namespace_sem is held exclusively by the caller of follow_down(). Otherwise, no locks are held. d_op->d_manage() may return one of: (a) 0 to continue the pathwalk as normal. (b) -EISDIR to prevent managed_dentry() from crossing to a mounted filesystem or calling d_op->d_automount(), in which case the dentry will be treated as an ordinary directory. (c) With the final (and provisional) patch of the series, -ECHILD to ask the caller to break out of RCU-pathwalk mode (d_manage() acquires a third parameter which is true if it is being called in RCU-walk mode). (d) Another error to abort the pathwalk completely. To make this work for autofs a couple of additional dentry d_flags have been defined: DCACHE_MANAGE_TRANSIT and DCACHE_NEED_AUTOMOUNT. This allows follow_managed() to test all three conditions with minimumal overhead if none of them are true. For other filesystems, setting S_AUTOMOUNT is sufficient. This is noted by d_set_d_op() which will set DCACHE_NEED_AUTOMOUNT automatically if it is seen. Checking S_AUTOMOUNT doesn't work for autofs, however, since the dentry might not have an inode, hence why a dentry flag also. S_AUTOMOUNT and d_automount() are introduced in patch 1; d_manage(), DCACHE_MANAGE_TRANSIT and DCACHE_NEED_AUTOMOUNT are introduced in patch 7. ======= UPDATES ======= [ver #4] - Rearranged and merged the patches a bit and updated the documentation, both that to be added into the kernel and the patch descriptions. - Looked at making d_manage() able to handle RCU-walk mode pathwalk. [ver #3] - Update to take account of Nick Piggin's RCU-based pathwalk changes. [ver #2] - Fixed a EXDEV in patch 6 to be EISDIR. We were previously using EXDEV to indicate we wanted to handle a directory as a directory and not to process it as a mountpoint. - Move some autofs v4 pseudo mount bits into the v4 pseudo direct mount patch [patch 16]. - Move a comment fix to the autofs d_automount() patch [patch 10 -> 9]. - Adjust the patch titles of the last three autofs patches. David --- David Howells (9): Allow d_manage() to be used in RCU-walk mode Remove a further kludge from __do_follow_link() Remove the automount through follow_link() kludge code from pathwalk CIFS: Use d_automount() rather than abusing follow_link() NFS: Use d_automount() rather than abusing follow_link() AFS: Use d_automount() rather than abusing follow_link() From: David Howells <dhowe...@redhat.com> Add a dentry op to allow processes to be held during pathwalk transit Add a dentry op to handle automounting rather than abusing follow_link() Ian Kent (9): autofs4: Bump version autofs4: Add v4 pseudo direct mount support autofs4: Fix wait validation autofs4: Clean up autofs4_free_ino() autofs4: Clean up dentry operations autofs4: Clean up inode operations autofs4: Remove unused code autofs4: Add d_manage() dentry operation autofs4: Add d_automount() dentry operation Documentation/filesystems/Locking | 3 Documentation/filesystems/vfs.txt | 38 ++ drivers/staging/autofs/dirhash.c | 5 fs/afs/dir.c | 1 fs/afs/inode.c | 3 fs/afs/internal.h | 1 fs/afs/mntpt.c | 47 +-- fs/autofs4/autofs_i.h | 100 ++++- fs/autofs4/dev-ioctl.c | 2 fs/autofs4/expire.c | 51 ++- fs/autofs4/inode.c | 28 -- fs/autofs4/root.c | 685 ++++++++++++++++--------------------- fs/autofs4/waitq.c | 17 + fs/cifs/cifs_dfs_ref.c | 134 ++++--- fs/cifs/cifsfs.h | 6 fs/cifs/dir.c | 2 fs/cifs/inode.c | 8 fs/dcache.c | 5 fs/namei.c | 307 +++++++++++++---- fs/namespace.c | 14 - fs/nfs/dir.c | 4 fs/nfs/inode.c | 4 fs/nfs/internal.h | 1 fs/nfs/namespace.c | 87 ++--- fs/nfsd/vfs.c | 5 fs/stat.c | 4 include/linux/auto_fs4.h | 2 include/linux/dcache.h | 16 + include/linux/fcntl.h | 1 include/linux/fs.h | 2 include/linux/namei.h | 5 include/linux/nfs_fs.h | 1 32 files changed, 894 insertions(+), 695 deletions(-) _______________________________________________ autofs mailing list autofs@linux.kernel.org http://linux.kernel.org/mailman/listinfo/autofs