1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-22 17:35:35 +03:00

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@<fs-module>.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.
This commit is contained in:
Franck Bui 2020-11-19 09:17:19 +01:00
parent b3e32582f6
commit 42cc2855ba
2 changed files with 16 additions and 4 deletions

View File

@ -12,12 +12,18 @@ Description=FUSE Control File System
Documentation=https://www.kernel.org/doc/Documentation/filesystems/fuse.txt Documentation=https://www.kernel.org/doc/Documentation/filesystems/fuse.txt
Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
DefaultDependencies=no DefaultDependencies=no
ConditionPathExists=/sys/fs/fuse/connections
ConditionCapability=CAP_SYS_ADMIN ConditionCapability=CAP_SYS_ADMIN
ConditionVirtualization=!private-users ConditionVirtualization=!private-users
After=systemd-modules-load.service
Before=sysinit.target 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] [Mount]
What=fusectl What=fusectl
Where=/sys/fs/fuse/connections Where=/sys/fs/fuse/connections

View File

@ -12,11 +12,17 @@ Description=Kernel Configuration File System
Documentation=https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt Documentation=https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt
Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
DefaultDependencies=no DefaultDependencies=no
ConditionPathExists=/sys/kernel/config
ConditionCapability=CAP_SYS_RAWIO ConditionCapability=CAP_SYS_RAWIO
After=systemd-modules-load.service
Before=sysinit.target 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] [Mount]
What=configfs What=configfs
Where=/sys/kernel/config Where=/sys/kernel/config