• Jeff Moyer's avatar
    autofs4: fix execution order race in mount request code · 03379044
    Jeff Moyer authored
    Jeff Moyer has identified a race in due to an execution order dependency
    in the autofs4 function root.c:try_to_fill_dentry().
    
    Jeff's description of this race is:
    
    "P1 does a lookup of /mount/submount/foo.  Since the VFS can't find an entry
    for "foo" under /mount/submount, it calls into the autofs4 kernel module to
    allocate a new dentry, D1.  The kernel creates a new waitq for this lookup and
    calls the daemon to perform the mount.
    
    The daemon performs a mkdir of the "foo" directory under /mount/submount,
    which ends up creating a *new* dentry, D2.
    
    Then, P2 does a lookup of /mount/submount/foo.  The VFS path walking logic
    finds a dentry in the dcache, D2, and calls the revalidate function with this.
     In the autofs4 revalidate code, we then trigger a mount, since the dentry is
    an empty directory that isn't a mountpoint, and so set DCACHE_AUTOFS_PENDING
    and call into the wait code to trigger the mount.
    
    The wait code finds our existing waitq entry (since it is keyed off of the
    directory name) and adds itself to the list of waiters.
    
    After the daemon finishes the mount, it calls back into the kernel to release
    the waiters.  When this happens, P1 is woken up and goes about clearing the
    DCACHE_AUTOFS_PENDING flag, but it does this in D1!  So, given that P1 in our
    case is a program that will immediately try to access a file under
    /mount/submount/foo, we end up finding the dentry D2 which still has the
    pending flag set, and we set out to wait for a mount *again*!
    
    So, one way to address this is to re-do the lookup at the end of
    try_to_fill_dentry, and to clear the pending flag on the hashed dentry.  This
    seems a sane approach to me."
    
    And Jeff's patch does this.
    Signed-off-by: default avatarJeff Moyer <jmoyer@redhat.com>
    Signed-off-by-by: default avatarIan Kent <raven@themaw.net>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    03379044
root.c 27.1 KB