• T
    kernfs: invoke kernfs_unmap_bin_file() directly from __kernfs_remove() · f601f9a2
    Tejun Heo 提交于
    kernfs_unmap_bin_file() is supposed to unmap all memory mappings of
    the target file before kernfs_remove() finishes; however, it currently
    is being called from kernfs_addrm_finish() and has the same race
    problem as the original implementation of deactivation when there are
    multiple removers - only the remover which snatches the node to its
    addrm_cxt->removed list is guaranteed to wait for its completion
    before returning.
    
    It can be fixed by moving kernfs_unmap_bin_file() invocation from
    kernfs_addrm_finish() to __kernfs_remove().  The function may be
    called multiple times but that shouldn't do any harm.
    
    We end up dropping kernfs_mutex in the removal loop and the node may
    be removed inbetween by someone else.  kernfs_unlink_sibling() is
    updated to test whether the node has already been removed and return
    accordingly.  __kernfs_remove() in turn performs post-unlinking
    cleanup only if it actually unlinked the node.
    
    KERNFS_HAS_MMAP test is moved out of the unmap function into
    __kernfs_remove() so that we don't unlock kernfs_mutex unnecessarily.
    While at it, drop the now meaningless "bin" qualifier from the
    function name.
    
    v2: Rewritten to fit the v2 restructuring of removal path.  HAS_MMAP
        test relocated.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    f601f9a2
kernfs-internal.h 3.4 KB