With this also Before, RequiredBy and WantedBy is handled by core. It is dependent on the decoupling of the automount units from the mount options. --- src/core/mount.c | 53 +++++++++++++++++++-- src/fstab-generator/fstab-generator.c | 88 ++++++++--------------------------- 2 files changed, 69 insertions(+), 72 deletions(-)
diff --git a/src/core/mount.c b/src/core/mount.c index 5c18d4e..fb239d9 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -338,6 +338,19 @@ static bool mount_is_bind(MountParameters *p) { return false; } +static bool mount_is_automount(MountParameters *p) { + assert (p); + + return !!mount_test_option(p->options, "x-systemd.automount") || + !!mount_test_option(p->options, "comment=systemd.automount"); +} + +static bool mount_is_fail(MountParameters *p) { + assert(p); + + return !mount_test_option(p->options, "nofail"); +} + static bool mount_is_auto(MountParameters *p) { assert(p); @@ -463,7 +476,7 @@ static bool should_umount(Mount *m) { } static int mount_add_default_dependencies(Mount *m) { - const char *after, *after2, *online; + const char *after, *after2 = NULL, *online = NULL, *before, *before2 = NULL; MountParameters *p; int r; @@ -486,8 +499,16 @@ static int mount_add_default_dependencies(Mount *m) { online = SPECIAL_NETWORK_ONLINE_TARGET; } else { after = SPECIAL_LOCAL_FS_PRE_TARGET; - after2 = NULL; - online = NULL; + } + + if (in_initrd()) { + before = SPECIAL_INITRD_FS_TARGET; + before2 = SPECIAL_INITRD_ROOT_FS_TARGET; + } else { + if(mount_is_network(p)) + before = SPECIAL_REMOTE_FS_TARGET; + else + before = SPECIAL_LOCAL_FS_TARGET; } r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, after, NULL, true); @@ -506,6 +527,32 @@ static int mount_add_default_dependencies(Mount *m) { return r; } + if (mount_is_auto(p)) { + if (mount_is_fail(p) && !mount_is_automount(p)) { + r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_REQUIRED_BY, UNIT_BEFORE, + before, NULL, true); + if (r < 0) + return r; + + if (before2) { + r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_REQUIRED_BY, UNIT_BEFORE, + before2, NULL, true); + if (r < 0) + return r; + } + } else { + r = unit_add_dependency_by_name(UNIT(m), UNIT_WANTED_BY, before, NULL, true); + if (r < 0) + return r; + + if (before2) { + r = unit_add_dependency_by_name(UNIT(m), UNIT_WANTED_BY, before2, NULL, true); + if (r < 0) + return r; + } + } + } + if (should_umount(m)) { r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true); if (r < 0) diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index 02052ea..85051f5 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -117,33 +117,28 @@ static int add_swap(const char *what, struct mntent *me) { return 0; } -static bool mount_is_network(struct mntent *me) { +static bool mount_is_automount(struct mntent *me) { assert(me); - return - hasmntopt(me, "_netdev") || - fstype_is_network(me->mnt_type); + return hasmntopt(me, "x-systemd.automount") || + hasmntopt(me, "comment=systemd.automount"); } static bool mount_in_initrd(struct mntent *me) { assert(me); - return - hasmntopt(me, "x-initrd.mount") || - streq(me->mnt_dir, "/usr"); + return hasmntopt(me, "x-initrd.mount") || + streq(me->mnt_dir, "/usr"); } static int add_mount( + const char *source, const char *what, const char *where, const char *type, const char *opts, int passno, - bool noauto, - bool nofail, - bool automount, - const char *post, - const char *source) { + bool automount) { _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL, *automount_name = NULL, *automount_unit = NULL; @@ -185,23 +180,16 @@ static int add_mount( } fprintf(f, - "# Automatically generated by systemd-fstab-generator\n\n" - "[Unit]\n" - "SourcePath=%s\n", - source); - - if (post && !noauto && !nofail && !automount) - fprintf(f, - "Before=%s\n", - post); - - fprintf(f, + "# Automatically generated by systemd-fstab-generator\n\n" + "[Unit]\n" + "SourcePath=%s\n" "\n" "[Mount]\n" "What=%s\n" "Where=%s\n" "Type=%s\n" "FsckPassNo=%i\n", + source, what, where, type, @@ -219,20 +207,6 @@ static int add_mount( return -errno; } - if (!noauto) { - if (post) { - lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL); - if (!lnk) - return log_oom(); - - mkdir_parents_label(lnk, 0755); - if (symlink(unit, lnk) < 0) { - log_error("Failed to create symlink %s: %m", lnk); - return -errno; - } - } - } - if (automount && !path_equal(where, "/")) { automount_name = unit_name_from_path(where, ".automount"); if (!automount_name) @@ -269,7 +243,7 @@ static int add_mount( return 0; } -static int parse_fstab(const char *prefix, bool initrd) { +static int parse_fstab(const char *prefix) { _cleanup_free_ char *fstab_path = NULL; FILE *f; int r = 0; @@ -292,7 +266,7 @@ static int parse_fstab(const char *prefix, bool initrd) { _cleanup_free_ char *where = NULL, *what = NULL; int k; - if (initrd && !mount_in_initrd(me)) + if (prefix && !mount_in_initrd(me)) continue; what = fstab_node_to_udev_node(me->mnt_fsname); @@ -310,28 +284,8 @@ static int parse_fstab(const char *prefix, bool initrd) { if (streq(me->mnt_type, "swap")) k = add_swap(what, me); else { - bool noauto, nofail, automount; - const char *post; - - noauto = !!hasmntopt(me, "noauto"); - nofail = !!hasmntopt(me, "nofail"); - automount = - hasmntopt(me, "comment=systemd.automount") || - hasmntopt(me, "x-systemd.automount"); - - if (initrd) { - post = SPECIAL_INITRD_FS_TARGET; - } else if (mount_in_initrd(me)) { - post = SPECIAL_INITRD_ROOT_FS_TARGET; - } else if (mount_is_network(me)) { - post = SPECIAL_REMOTE_FS_TARGET; - } else { - post = SPECIAL_LOCAL_FS_TARGET; - } - - k = add_mount(what, where, me->mnt_type, me->mnt_opts, - me->mnt_passno, noauto, nofail, automount, - post, fstab_path); + k = add_mount(fstab_path, what, where, me->mnt_type, me->mnt_opts, + me->mnt_passno, mount_is_automount(me)); } if (k < 0) @@ -348,7 +302,6 @@ static int parse_new_root_from_proc_cmdline(void) { char *w, *state; int r; size_t l; - bool noauto, nofail; r = read_one_line_file("/proc/cmdline", &line); if (r < 0) { @@ -404,9 +357,6 @@ static int parse_new_root_from_proc_cmdline(void) { } } - noauto = !!strstr(opts, "noauto"); - nofail = !!strstr(opts, "nofail"); - if (!what) { log_debug("Could not find a root= entry on the kernel commandline."); return 0; @@ -418,8 +368,8 @@ static int parse_new_root_from_proc_cmdline(void) { } log_debug("Found entry what=%s where=/sysroot type=%s", what, type); - r = add_mount(what, "/sysroot", type, opts, 0, noauto, nofail, false, - SPECIAL_INITRD_ROOT_FS_TARGET, "/proc/cmdline"); + + r = add_mount("/proc/cmdline", what, "/sysroot", type, opts, 0, false); return (r < 0) ? r : 0; } @@ -499,10 +449,10 @@ int main(int argc, char *argv[]) { if (!arg_enabled) return (r < 0) ? EXIT_FAILURE : EXIT_SUCCESS; - k = parse_fstab(NULL, false); + k = parse_fstab(NULL); if (in_initrd()) - l = parse_fstab("/sysroot", true); + l = parse_fstab("/sysroot"); return (r < 0) || (k < 0) || (l < 0) ? EXIT_FAILURE : EXIT_SUCCESS; } -- 1.8.4 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel