diff options
author | David Howells <dhowells@redhat.com> | 2011-01-14 14:10:03 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-01-15 20:07:48 -0500 |
commit | ea5b778a8b98c85a87d66bf844904f9c3802b869 (patch) | |
tree | baa56cbe1a907d76341f2cad53e16569cc1d3288 /Documentation/filesystems/vfs.txt | |
parent | ab90911ff90cdab59b31c045c3f0ae480d14f29d (diff) |
Unexport do_add_mount() and add in follow_automount(), not ->d_automount()
Unexport do_add_mount() and make ->d_automount() return the vfsmount to be
added rather than calling do_add_mount() itself. follow_automount() will then
do the addition.
This slightly complicates things as ->d_automount() normally wants to add the
new vfsmount to an expiration list and start an expiration timer. The problem
with that is that the vfsmount will be deleted if it has a refcount of 1 and
the timer will not repeat if the expiration list is empty.
To this end, we require the vfsmount to be returned from d_automount() with a
refcount of (at least) 2. One of these refs will be dropped unconditionally.
In addition, follow_automount() must get a 3rd ref around the call to
do_add_mount() lest it eat a ref and return an error, leaving the mount we
have open to being expired as we would otherwise have only 1 ref on it.
d_automount() should also add the the vfsmount to the expiration list (by
calling mnt_set_expiry()) and start the expiration timer before returning, if
this mechanism is to be used. The vfsmount will be unlinked from the
expiration list by follow_automount() if do_add_mount() fails.
This patch also fixes the call to do_add_mount() for AFS to propagate the mount
flags from the parent vfsmount.
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'Documentation/filesystems/vfs.txt')
-rw-r--r-- | Documentation/filesystems/vfs.txt | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 3c4b2f1b64d0..94cf97b901d7 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt | |||
@@ -933,15 +933,20 @@ struct dentry_operations { | |||
933 | dynamic_dname() helper function is provided to take care of this. | 933 | dynamic_dname() helper function is provided to take care of this. |
934 | 934 | ||
935 | d_automount: called when an automount dentry is to be traversed (optional). | 935 | d_automount: called when an automount dentry is to be traversed (optional). |
936 | This should create a new VFS mount record, mount it on the directory | 936 | This should create a new VFS mount record and return the record to the |
937 | and return the record to the caller. The caller is supplied with a | 937 | caller. The caller is supplied with a path parameter giving the |
938 | path parameter giving the automount directory to describe the automount | 938 | automount directory to describe the automount target and the parent |
939 | target and the parent VFS mount record to provide inheritable mount | 939 | VFS mount record to provide inheritable mount parameters. NULL should |
940 | parameters. NULL should be returned if someone else managed to make | 940 | be returned if someone else managed to make the automount first. If |
941 | the automount first. If the automount failed, then an error code | 941 | the vfsmount creation failed, then an error code should be returned. |
942 | should be returned. If -EISDIR is returned, then the directory will | 942 | If -EISDIR is returned, then the directory will be treated as an |
943 | be treated as an ordinary directory and returned to pathwalk to | 943 | ordinary directory and returned to pathwalk to continue walking. |
944 | continue walking. | 944 | |
945 | If a vfsmount is returned, the caller will attempt to mount it on the | ||
946 | mountpoint and will remove the vfsmount from its expiration list in | ||
947 | the case of failure. The vfsmount should be returned with 2 refs on | ||
948 | it to prevent automatic expiration - the caller will clean up the | ||
949 | additional ref. | ||
945 | 950 | ||
946 | This function is only used if DCACHE_NEED_AUTOMOUNT is set on the | 951 | This function is only used if DCACHE_NEED_AUTOMOUNT is set on the |
947 | dentry. This is set by __d_instantiate() if S_AUTOMOUNT is set on the | 952 | dentry. This is set by __d_instantiate() if S_AUTOMOUNT is set on the |