• Al Viro's avatar
    fix automount/automount race properly · 26df6034
    Al Viro authored
    Protection against automount/automount races (two threads hitting the same
    referral point at the same time) is based upon do_add_mount() prevention of
    identical overmounts - trying to overmount the root of mounted tree with
    the same tree fails with -EBUSY.  It's unreliable (the other thread might've
    mounted something on top of the automount it has triggered) *and* causes
    no end of headache for follow_automount() and its caller, since
    finish_automount() behaves like do_new_mount() - if the mountpoint to be is
    overmounted, it mounts on top what's overmounting it.  It's not only wrong
    (we want to go into what's overmounting the automount point and quietly
    discard what we planned to mount there), it introduces the possibility of
    original parent mount getting dropped.  That's what 8aef1884 (VFS: Fix
    vfsmount overput on simultaneous automount) deals with, but it can't do
    anything about the reliability of conflict detection - if something had
    been overmounted the other thread's automount (e.g. that other thread
    having stepped into automount in mount(2)), we don't get that -EBUSY and
    the result is
    	 referral point under automounted NFS under explicit overmount
    under another copy of automounted NFS
    
    What we need is finish_automount() *NOT* digging into overmounts - if it
    finds one, it should just quietly discard the thing it was asked to mount.
    And don't bother with actually crossing into the results of finish_automount() -
    the same loop that calls follow_automount() will do that just fine on the
    next iteration.
    
    IOW, instead of calling lock_mount() have finish_automount() do it manually,
    _without_ the "move into overmount and retry" part.  And leave crossing into
    the results to the caller of follow_automount(), which simplifies it a lot.
    
    Moral: if you end up with a lot of glue working around the calling conventions
    of something, perhaps these calling conventions are simply wrong...
    
    Fixes: 8aef1884 (VFS: Fix vfsmount overput on simultaneous automount)
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    26df6034
namespace.c 96.7 KB