From: Franck Bui Date: Thu, 2 Apr 2020 06:29:36 +0000 (+0200) Subject: mount: let pid1 alone handle the default dependencies for mount units X-Git-Tag: v246-rc1~361^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=83cdc870949823b5b9fa04dd76e952d42faab0b1;p=thirdparty%2Fsystemd.git mount: let pid1 alone handle the default dependencies for mount units fstab-generator was also handling the default ordering dependencies for mount units setup in initrd. To do that it was turning the defaults dependencies off completely and ordered the mount unit against either local-fs.target or initrd-fs.target or initrd-root-fs.target itself. But it had the bad side effect to also remove all other default dependencies as well. Thus if an initrd mount was using _netdev, the network dependencies were missing. In general fstab-generator shouldn't use DefaultDependecies=no because it can handle only a small set of the default dependencies the rest are dealt by pid1. So this patch makes pid1 handle all default dependencies. --- diff --git a/src/core/mount.c b/src/core/mount.c index 0b57f89c29e..a70013cecf7 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -428,7 +428,7 @@ static bool mount_is_extrinsic(Mount *m) { } static int mount_add_default_dependencies(Mount *m) { - const char *after, *before; + const char *after, *before, *e; UnitDependencyMask mask; MountParameters *p; bool nofail; @@ -452,7 +452,16 @@ static int mount_add_default_dependencies(Mount *m) { mask = m->from_fragment ? UNIT_DEPENDENCY_FILE : UNIT_DEPENDENCY_MOUNTINFO_DEFAULT; nofail = m->from_fragment ? fstab_test_yes_no_option(m->parameters_fragment.options, "nofail\0" "fail\0") : false; - if (mount_is_network(p)) { + e = path_startswith(m->where, "/sysroot"); + if (e && in_initrd()) { + /* All mounts under /sysroot need to happen later, at initrd-fs.target time. IOW, + * it's not technically part of the basic initrd filesystem itself, and so + * shouldn't inherit the default Before=local-fs.target dependency. */ + + after = NULL; + before = isempty(e) ? SPECIAL_INITRD_ROOT_FS_TARGET : SPECIAL_INITRD_FS_TARGET; + + } else if (mount_is_network(p)) { /* We order ourselves after network.target. This is * primarily useful at shutdown: services that take * down the network should order themselves before @@ -487,9 +496,11 @@ static int mount_add_default_dependencies(Mount *m) { return r; } - r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, after, true, mask); - if (r < 0) - return r; + if (after) { + r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, after, true, mask); + if (r < 0) + return r; + } r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, true, mask); if (r < 0) diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index 08c7b76dbae..16be342dbf3 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -391,12 +391,6 @@ static int add_mount( "SourcePath=%s\n", source); - /* All mounts under /sysroot need to happen later, at initrd-fs.target time. IOW, it's not - * technically part of the basic initrd filesystem itself, and so shouldn't inherit the default - * Before=local-fs.target dependency. */ - if (in_initrd() && path_startswith(where, "/sysroot")) - fprintf(f, "DefaultDependencies=no\n"); - if (STRPTR_IN_SET(fstype, "nfs", "nfs4") && !(flags & AUTOMOUNT) && fstab_test_yes_no_option(opts, "bg\0" "fg\0")) { /* The default retry timeout that mount.nfs uses for 'bg' mounts @@ -411,9 +405,6 @@ static int add_mount( SET_FLAG(flags, NOFAIL, true); } - if (!(flags & NOFAIL) && !(flags & AUTOMOUNT)) - fprintf(f, "Before=%s\n", post); - if (!(flags & AUTOMOUNT) && opts) { r = write_after(f, opts); if (r < 0)