lkml.org 
[lkml]   [2016]   [Nov]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 6/7] autofs - dont hold spin lock over direct mount expire
    From
    Date
    From: Ian Kent <ikent@redhat.com>

    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>
    ---
    fs/autofs4/expire.c | 17 ++++++++++-------
    1 file changed, 10 insertions(+), 7 deletions(-)

    diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c
    index 13178bf..57725d4 100644
    --- a/fs/autofs4/expire.c
    +++ b/fs/autofs4/expire.c
    @@ -310,26 +310,29 @@ struct dentry *autofs4_expire_direct(struct super_block *sb,
    now = jiffies;
    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)) {
    + 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;
    spin_unlock(&sbi->fs_lock);
    synchronize_rcu();
    - spin_lock(&sbi->fs_lock);
    if (!autofs4_direct_busy(mnt, root, timeout, do_now)) {
    + spin_lock(&sbi->fs_lock);
    ino->flags |= AUTOFS_INF_EXPIRING;
    init_completion(&ino->expire_complete);
    spin_unlock(&sbi->fs_lock);
    return root;
    }
    + spin_lock(&sbi->fs_lock);
    ino->flags &= ~AUTOFS_INF_WANT_EXPIRE;
    + spin_unlock(&sbi->fs_lock);
    }
    out:
    - spin_unlock(&sbi->fs_lock);
    dput(root);

    return NULL;
    \
     
     \ /
      Last update: 2016-11-28 03:13    [W:4.142 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site