autofs - dont hold spin lock over direct mount expire
Commit 7cbdb4a286
altered the autofs indirect mount expire to
not hold a spin lock during the expire check.
The direct mount expire needs the same treatment because to
make autofs expires namespace aware may_umount_tree() needs to
to use a similar method to may_umount() when checking if a mount
tree is in use.
This means may_umount_tree() will end up taking the namespace_sem
for the check so the autofs direct mount expire won't be allowed
to hold a spin lock over the check.
Signed-off-by: Ian Kent <raven@themaw.net>
Cc: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Eric W. Biederman <ebiederm@xmission.com>
Cc: Omar Sandoval <osandov@osandov.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
455e8f1030
commit
1c4344a50d
|
@ -310,26 +310,29 @@ struct dentry *autofs4_expire_direct(struct super_block *sb,
|
||||||
now = jiffies;
|
now = jiffies;
|
||||||
timeout = sbi->exp_timeout;
|
timeout = sbi->exp_timeout;
|
||||||
|
|
||||||
spin_lock(&sbi->fs_lock);
|
|
||||||
ino = autofs4_dentry_ino(root);
|
|
||||||
/* No point expiring a pending mount */
|
|
||||||
if (ino->flags & AUTOFS_INF_PENDING)
|
|
||||||
goto out;
|
|
||||||
if (!autofs4_direct_busy(mnt, root, timeout, do_now)) {
|
if (!autofs4_direct_busy(mnt, root, timeout, do_now)) {
|
||||||
|
spin_lock(&sbi->fs_lock);
|
||||||
|
ino = autofs4_dentry_ino(root);
|
||||||
|
/* No point expiring a pending mount */
|
||||||
|
if (ino->flags & AUTOFS_INF_PENDING) {
|
||||||
|
spin_unlock(&sbi->fs_lock);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
ino->flags |= AUTOFS_INF_WANT_EXPIRE;
|
ino->flags |= AUTOFS_INF_WANT_EXPIRE;
|
||||||
spin_unlock(&sbi->fs_lock);
|
spin_unlock(&sbi->fs_lock);
|
||||||
synchronize_rcu();
|
synchronize_rcu();
|
||||||
spin_lock(&sbi->fs_lock);
|
|
||||||
if (!autofs4_direct_busy(mnt, root, timeout, do_now)) {
|
if (!autofs4_direct_busy(mnt, root, timeout, do_now)) {
|
||||||
|
spin_lock(&sbi->fs_lock);
|
||||||
ino->flags |= AUTOFS_INF_EXPIRING;
|
ino->flags |= AUTOFS_INF_EXPIRING;
|
||||||
init_completion(&ino->expire_complete);
|
init_completion(&ino->expire_complete);
|
||||||
spin_unlock(&sbi->fs_lock);
|
spin_unlock(&sbi->fs_lock);
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
spin_lock(&sbi->fs_lock);
|
||||||
ino->flags &= ~AUTOFS_INF_WANT_EXPIRE;
|
ino->flags &= ~AUTOFS_INF_WANT_EXPIRE;
|
||||||
|
spin_unlock(&sbi->fs_lock);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
spin_unlock(&sbi->fs_lock);
|
|
||||||
dput(root);
|
dput(root);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue