• Krister Johansen's avatar
    fuse: share lookup state between submount and its parent · c4d361f6
    Krister Johansen authored
    Fuse submounts do not perform a lookup for the nodeid that they inherit
    from their parent.  Instead, the code decrements the nlookup on the
    submount's fuse_inode when it is instantiated, and no forget is
    performed when a submount root is evicted.
    
    Trouble arises when the submount's parent is evicted despite the
    submount itself being in use.  In this author's case, the submount was
    in a container and deatched from the initial mount namespace via a
    MNT_DEATCH operation.  When memory pressure triggered the shrinker, the
    inode from the parent was evicted, which triggered enough forgets to
    render the submount's nodeid invalid.
    
    Since submounts should still function, even if their parent goes away,
    solve this problem by sharing refcounted state between the parent and
    its submount.  When all of the references on this shared state reach
    zero, it's safe to forget the final lookup of the fuse nodeid.
    Signed-off-by: default avatarKrister Johansen <kjlx@templeofstupid.com>
    Cc: stable@vger.kernel.org
    Fixes: 1866d779 ("fuse: Allow fuse_fill_super_common() for submounts")
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    c4d361f6
inode.c 49.4 KB