• Jessica Yu's avatar
    module: delay kobject uevent until after module init call · 38dc717e
    Jessica Yu authored
    Apparently there has been a longstanding race between udev/systemd and
    the module loader. Currently, the module loader sends a uevent right
    after sysfs initialization, but before the module calls its init
    function. However, some udev rules expect that the module has
    initialized already upon receiving the uevent.
    
    This race has been triggered recently (see link in references) in some
    systemd mount unit files. For instance, the configfs module creates the
    /sys/kernel/config mount point in its init function, however the module
    loader issues the uevent before this happens. sys-kernel-config.mount
    expects to be able to mount /sys/kernel/config upon receipt of the
    module loading uevent, but if the configfs module has not called its
    init function yet, then this directory will not exist and the mount unit
    fails. A similar situation exists for sys-fs-fuse-connections.mount, as
    the fuse sysfs mount point is created during the fuse module's init
    function. If udev is faster than module initialization then the mount
    unit would fail in a similar fashion.
    
    To fix this race, delay the module KOBJ_ADD uevent until after the
    module has finished calling its init routine.
    
    References: https://github.com/systemd/systemd/issues/17586
    
    Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Tested-By: default avatarNicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com>
    Signed-off-by: default avatarJessica Yu <jeyu@kernel.org>
    38dc717e
module.c 118 KB