lkml.org 
[lkml]   [2010]   [Sep]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 15/17] autofs4 - fix wait validation
    Date
    From: Ian Kent <raven@themaw.net>

    It is possible for the check in wait.c:validate_request() to return
    an incorrect result if the dentry that was mounted upon has changed
    during the callback.

    Signed-off-by: Ian Kent <raven@themaw.net>
    Signed-off-by: David Howells <dhowells@redhat.com>
    ---

    fs/autofs4/waitq.c | 17 ++++++++++++++++-
    1 files changed, 16 insertions(+), 1 deletions(-)

    diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c
    index 2341375..f3792ff 100644
    --- a/fs/autofs4/waitq.c
    +++ b/fs/autofs4/waitq.c
    @@ -296,6 +296,9 @@ static int validate_request(struct autofs_wait_queue **wait,
    * completed while we waited on the mutex ...
    */
    if (notify == NFY_MOUNT) {
    + struct dentry *new = NULL;
    + int valid = 1;
    +
    /*
    * If the dentry was successfully mounted while we slept
    * on the wait queue mutex we can return success. If it
    @@ -303,8 +306,20 @@ static int validate_request(struct autofs_wait_queue **wait,
    * a multi-mount with no mount at it's base) we can
    * continue on and create a new request.
    */
    + if (!IS_ROOT(dentry)) {
    + if (dentry->d_inode && d_unhashed(dentry)) {
    + struct dentry *parent = dentry->d_parent;
    + new = d_lookup(parent, &dentry->d_name);
    + if (new)
    + dentry = new;
    + }
    + }
    if (have_submounts(dentry))
    - return 0;
    + valid = 0;
    +
    + if (new)
    + dput(new);
    + return valid;
    }

    return 1;


    \
     
     \ /
      Last update: 2010-10-03 23:01    [W:4.130 / U:0.744 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site