diff options
author | Ian Kent <raven@themaw.net> | 2011-01-14 13:46:03 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-01-15 20:07:38 -0500 |
commit | b5b801779d59165c4ecf1009009109545bd1f642 (patch) | |
tree | 3a1c8b2e65e72977993ba96c1398edba4c63cbf5 /fs/autofs4/inode.c | |
parent | 10584211e48036182212b598cc53331776406d60 (diff) |
autofs4: Add d_manage() dentry operation
This patch required a previous patch to add the ->d_automount()
dentry operation.
Add a function to use the newly defined ->d_manage() dentry operation
for blocking during mount and expire.
Whether the VFS calls the dentry operations d_automount() and d_manage()
is controled by the DMANAGED_AUTOMOUNT and DMANAGED_TRANSIT flags. autofs
uses the d_automount() operation to callback to user space to request
mount operations and the d_manage() operation to block walks into mounts
that are under construction or destruction.
In order to prevent these functions from being called unnecessarily the
DMANAGED_* flags are cleared for cases which would cause this. In the
common case the DMANAGED_AUTOMOUNT and DMANAGED_TRANSIT flags are both
set for dentrys waiting to be mounted. The DMANAGED_TRANSIT flag is
cleared upon successful mount request completion and set during expire
runs, both during the dentry expire check, and if selected for expire,
is left set until a subsequent successful mount request completes.
The exception to this is the so-called rootless multi-mount which has
no actual mount at its base. In this case the DMANAGED_AUTOMOUNT flag
is cleared upon successful mount request completion as well and set
again after a successful expire.
Signed-off-by: Ian Kent <raven@themaw.net>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/autofs4/inode.c')
-rw-r--r-- | fs/autofs4/inode.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index d0aa38cac302..75c1ed8e2fb9 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
@@ -253,6 +253,7 @@ static struct autofs_info *autofs4_mkroot(struct autofs_sb_info *sbi) | |||
253 | 253 | ||
254 | static const struct dentry_operations autofs4_sb_dentry_operations = { | 254 | static const struct dentry_operations autofs4_sb_dentry_operations = { |
255 | .d_automount = autofs4_d_automount, | 255 | .d_automount = autofs4_d_automount, |
256 | .d_manage = autofs4_d_manage, | ||
256 | .d_release = autofs4_dentry_release, | 257 | .d_release = autofs4_dentry_release, |
257 | }; | 258 | }; |
258 | 259 | ||
@@ -322,7 +323,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
322 | } | 323 | } |
323 | 324 | ||
324 | if (autofs_type_trigger(sbi->type)) | 325 | if (autofs_type_trigger(sbi->type)) |
325 | __managed_dentry_set_automount(root); | 326 | __managed_dentry_set_managed(root); |
326 | 327 | ||
327 | root_inode->i_fop = &autofs4_root_operations; | 328 | root_inode->i_fop = &autofs4_root_operations; |
328 | root_inode->i_op = autofs_type_trigger(sbi->type) ? | 329 | root_inode->i_op = autofs_type_trigger(sbi->type) ? |