• Ian Kent's avatar
    autofs4: fix direct mount pending expire race · 6e60a9ab
    Ian Kent authored
    For direct and offset type mounts that are covered by another mount we
    cannot check the AUTOFS_INF_EXPIRING flag during a path walk which leads
    to lookups walking into an expiring mount while it is being expired.
    
    For example, for the direct multi-mount map entry with a couple of
    offsets:
    
    /race/mm1  /      <server1>:/<path1>
               /om1   <server2>:/<path2>
               /om2   <server1>:/<path3>
    
    an autofs trigger mount is mounted on /race/mm1 and when accessed it is
    over mounted and trigger mounts made for /race/mm1/om1 and /race/mm1/om2.
    So it isn't possible for path walks to see the expiring flag at all and
    they happily walk into the file system while it is expiring.
    
    When expiring these mounts follow_down() must stop at the autofs mount and
    all processes must block in the ->follow_link() method (except the daemon)
    until the expire is complete.  This is done by decrementing the d_mounted
    field of the autofs trigger mount root dentry until the expire is
    completed.  In ->follow_link() all processes wait on the expire and the
    mount following is completed for the daemon until the expire is complete.
    Signed-off-by: default avatarIan Kent <raven@themaw.net>
    Cc: Jeff Moyer <jmoyer@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6e60a9ab
root.c 27 KB