X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ffstab-generator%2Ffstab-generator.c;h=96b090614944228afbe4cea1d7efe77a12d66ae9;hb=eb9da376d76b48585b3b63b4f91903b54f7abd36;hp=b73dfa4899ee65d137915c8468cbc42cd83dd744;hpb=4e82fe5213bedcb70e25c0270e516d5f2706d8c8;p=elogind.git diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index b73dfa489..96b090614 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -32,7 +32,6 @@ #include "mount-setup.h" #include "special.h" #include "mkdir.h" -#include "virt.h" #include "fileio.h" static const char *arg_dest = "/tmp"; @@ -64,7 +63,7 @@ static int mount_find_pri(struct mntent *me, int *ret) { } static int add_swap(const char *what, struct mntent *me) { - _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL; + _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL; _cleanup_fclose_ FILE *f = NULL; bool noauto; int r, pri = -1; @@ -159,7 +158,7 @@ static int add_mount( const char *post, const char *source) { _cleanup_free_ char - *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL, + *name = NULL, *unit = NULL, *lnk = NULL, *automount_name = NULL, *automount_unit = NULL; _cleanup_fclose_ FILE *f = NULL; @@ -209,17 +208,42 @@ static int add_mount( "Before=%s\n", post); + if (passno > 0) { + if (streq(where, "/")) { + lnk = strjoin(arg_dest, "/", SPECIAL_LOCAL_FS_TARGET, ".wants/", "systemd-fsck-root.service", NULL); + if (!lnk) + return log_oom(); + + mkdir_parents_label(lnk, 0755); + if (symlink("systemd-fsck-root.service", lnk) < 0) { + log_error("Failed to create symlink %s: %m", lnk); + return -errno; + } + } else { + _cleanup_free_ char *fsck = NULL; + + fsck = unit_name_from_path_instance("systemd-fsck", what, ".service"); + if (!fsck) + return log_oom(); + + fprintf(f, + "Requires=%s\n" + "After=%s\n", + fsck, + fsck); + } + } + + fprintf(f, "\n" "[Mount]\n" "What=%s\n" "Where=%s\n" - "Type=%s\n" - "FsckPassNo=%i\n", + "Type=%s\n", what, where, - type, - passno); + type); if (!isempty(opts) && !streq(opts, "defaults")) @@ -235,6 +259,7 @@ static int add_mount( if (!noauto) { if (post) { + free(lnk); lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL); if (!lnk) return log_oom(); @@ -301,15 +326,12 @@ static int add_mount( } static int parse_fstab(const char *prefix, bool initrd) { - _cleanup_free_ char *fstab_path = NULL; - FILE *f; + char *fstab_path; + _cleanup_endmntent_ FILE *f; int r = 0; struct mntent *me; - fstab_path = strjoin(strempty(prefix), "/etc/fstab", NULL); - if (!fstab_path) - return log_oom(); - + fstab_path = strappenda(strempty(prefix), "/etc/fstab"); f = setmntent(fstab_path, "r"); if (!f) { if (errno == ENOENT) @@ -328,10 +350,8 @@ static int parse_fstab(const char *prefix, bool initrd) { what = fstab_node_to_udev_node(me->mnt_fsname); where = strjoin(strempty(prefix), me->mnt_dir, NULL); - if (!what || !where) { - r = log_oom(); - goto finish; - } + if (!what || !where) + return log_oom(); if (is_path(where)) path_kill_slashes(where); @@ -369,23 +389,21 @@ static int parse_fstab(const char *prefix, bool initrd) { r = k; } -finish: - endmntent(f); return r; } static int parse_new_root_from_proc_cmdline(void) { _cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL; + bool noauto, nofail; char *w, *state; - int r; size_t l; - bool noauto, nofail; + int r; - r = read_one_line_file("/proc/cmdline", &line); - if (r < 0) { - log_error("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); + r = proc_cmdline(&line); + if (r < 0) + log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); + if (r <= 0) return 0; - } opts = strdup("ro"); type = strdup("auto"); @@ -449,7 +467,7 @@ 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, + r = add_mount(what, "/sysroot", type, opts, 1, noauto, nofail, false, SPECIAL_INITRD_ROOT_FS_TARGET, "/proc/cmdline"); return (r < 0) ? r : 0; @@ -458,17 +476,14 @@ static int parse_new_root_from_proc_cmdline(void) { static int parse_proc_cmdline(void) { _cleanup_free_ char *line = NULL; char *w, *state; - int r; size_t l; + int r; - if (detect_container(NULL) > 0) - return 0; - - r = read_one_line_file("/proc/cmdline", &line); - if (r < 0) { + r = proc_cmdline(&line); + if (r < 0) log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); + if (r <= 0) return 0; - } FOREACH_WORD_QUOTED(w, l, line, state) { _cleanup_free_ char *word = NULL;