From b3e32582f67c68896b6b05893b138a975fa26454 Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Thu, 19 Nov 2020 08:55:56 +0100 Subject: [PATCH 1/2] Revert "units: skip modprobe@.service if the unit appears to be already loaded" This reverts commit 9cbf1e58f9629af5c6b56777ee73dc6320306d6d. The presence of /sys/module/%I directory can't be used to assert that the load of a given module is complete and therefore the call to modprobe(8) can be skipped. Indeed this directory is created before the init() function of the module is called. Users of modprobe@.service needs to be sure that once this service returns the module is fully operational. --- units/modprobe@.service | 1 - 1 file changed, 1 deletion(-) diff --git a/units/modprobe@.service b/units/modprobe@.service index 968994287ca..cf8baf60846 100644 --- a/units/modprobe@.service +++ b/units/modprobe@.service @@ -13,7 +13,6 @@ DefaultDependencies=no Before=sysinit.target Documentation=man:modprobe(8) ConditionCapability=CAP_SYS_MODULE -ConditionPathExists=!/sys/module/%I [Service] Type=oneshot From 42cc2855ba2fe4c6f5dc863507a1c843611350a0 Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Thu, 19 Nov 2020 09:17:19 +0100 Subject: [PATCH 2/2] units: wait until some fs modules are entirely loaded before mounting their corresponding filesystem udev requests to start the fs mount units when their respective module is loaded. For that it monitors uevents of type "ADD" for the relevant fs modules. However the uevent is sent by the kernel too early, ie before the init() of the module is called hence before directories in /sys/fs/ are created. This patch workarounds adds "Requires/After=modprobe@.service" to the mount unit, which means that modprobe(8) will be called once the fs module is announced to be loaded. This sounds pointless, but given that modprobe only returns after the initialization of the module is complete, it should workaround the issue. As a side effect, the module will be automatically loaded if the mount unit is started manually. Fixes #17586. --- units/sys-fs-fuse-connections.mount | 10 ++++++++-- units/sys-kernel-config.mount | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/units/sys-fs-fuse-connections.mount b/units/sys-fs-fuse-connections.mount index cbcdd5f2cc9..b649a1ed199 100644 --- a/units/sys-fs-fuse-connections.mount +++ b/units/sys-fs-fuse-connections.mount @@ -12,12 +12,18 @@ Description=FUSE Control File System Documentation=https://www.kernel.org/doc/Documentation/filesystems/fuse.txt Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems DefaultDependencies=no -ConditionPathExists=/sys/fs/fuse/connections ConditionCapability=CAP_SYS_ADMIN ConditionVirtualization=!private-users -After=systemd-modules-load.service Before=sysinit.target +# These dependencies are used to make certain that the module is fully +# loaded. Indeed udev starts this unit when it receives an uevent for the +# module but the kernel sends it too early, ie before the init() of the module +# is fully operational and /sys/fs/fuse/connections is created, see issue#17586. + +After=modprobe@fuse.service +Requires=modprobe@fuse.service + [Mount] What=fusectl Where=/sys/fs/fuse/connections diff --git a/units/sys-kernel-config.mount b/units/sys-kernel-config.mount index 001c7b57cce..7d965046ee5 100644 --- a/units/sys-kernel-config.mount +++ b/units/sys-kernel-config.mount @@ -12,11 +12,17 @@ Description=Kernel Configuration File System Documentation=https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems DefaultDependencies=no -ConditionPathExists=/sys/kernel/config ConditionCapability=CAP_SYS_RAWIO -After=systemd-modules-load.service Before=sysinit.target +# These dependencies are used to make certain that the module is fully +# loaded. Indeed udev starts this unit when it receives an uevent for the +# module but the kernel sends it too early, ie before the init() of the module +# is fully operational and /sys/kernel/config is created, see issue#17586. + +After=modprobe@configfs.service +Requires=modprobe@configfs.service + [Mount] What=configfs Where=/sys/kernel/config