]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: automatically add udev dependency for units using RootImage=
authorLennart Poettering <lennart@poettering.net>
Tue, 21 Apr 2020 11:04:39 +0000 (13:04 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 21 Apr 2020 14:31:06 +0000 (16:31 +0200)
We use udev to wait for /dev/loopX devices to be fully proped hence we
need an implicit ordering dependency on it, for RootImage= to work
reliably in early boot, too.

Fixes: #14972
man/systemd.exec.xml
src/basic/special.h
src/core/unit.c

index 54b07e30043f4dc812e1fc8ec47aef3c26c3dfd1..4d85b6aec0dc1b327ea4e53649646fadb6bdd4b1 100644 (file)
         <varname>PrivateDevices=</varname> below, as it may change the setting of
         <varname>DevicePolicy=</varname>.</para>
 
+        <para>Units making use of <varname>RootImage=</varname> automatically gain an
+        <varname>After=</varname> dependency on <filename>systemd-udevd.service</filename>.</para>
+
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
 
index 0eb3f3a36866ddd1a7f6ff251468429f1a8aec9c..19ee30cd412cc7c915ae327c8735c3c93ee3b0c3 100644 (file)
@@ -82,6 +82,7 @@
 #define SPECIAL_QUOTAON_SERVICE "quotaon.service"
 #define SPECIAL_REMOUNT_FS_SERVICE "systemd-remount-fs.service"
 #define SPECIAL_VOLATILE_ROOT_SERVICE "systemd-volatile-root.service"
+#define SPECIAL_UDEVD_SERVICE "systemd-udevd.service"
 
 /* Services systemd relies on */
 #define SPECIAL_DBUS_SERVICE "dbus.service"
index f8fb01e3b1d0a619dce295ea42a0d92dc602b0b1..242309e47f0b0972cccfad194b72dad91d3049ff 100644 (file)
@@ -1079,6 +1079,15 @@ int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
                         return r;
         }
 
+        if (c->root_image) {
+                /* We need to wait for /dev/loopX to appear when doing RootImage=, hence let's add an
+                 * implicit dependency on udev */
+
+                r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_UDEVD_SERVICE, true, UNIT_DEPENDENCY_FILE);
+                if (r < 0)
+                        return r;
+        }
+
         if (!IN_SET(c->std_output,
                     EXEC_OUTPUT_JOURNAL, EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
                     EXEC_OUTPUT_KMSG, EXEC_OUTPUT_KMSG_AND_CONSOLE,