[systemd-commits] 3 commits - Makefile.am src/core src/fstab-generator units/initrd-cleanup.service units/initrd-fs-pre.target units/initrd-fs.target units/initrd-parse-etc.service units/initrd-switch-root.target

Harald Hoyer harald at kemper.freedesktop.org
Mon Mar 4 10:43:45 PST 2013


 Makefile.am                           |    2 +
 src/core/special.h                    |    2 +
 src/fstab-generator/fstab-generator.c |   60 ++++++++++++++++++++++++----------
 units/initrd-cleanup.service          |    4 +-
 units/initrd-fs-pre.target            |   11 ++++++
 units/initrd-fs.target                |   13 +++++++
 units/initrd-parse-etc.service        |    5 +-
 units/initrd-switch-root.target       |    4 +-
 8 files changed, 78 insertions(+), 23 deletions(-)

New commits:
commit 8330847e949fc0c26b16910e5240eef1fe2c330a
Author: Harald Hoyer <harald at redhat.com>
Date:   Mon Mar 4 19:04:32 2013 +0100

    fstab-generator: place initrd /sysroot mounts in initrd-fs.target
    
    also do not overwrite /sysroot*.mount units already generated from fstab

diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index 1a1fe86..a8436e6 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -200,8 +200,8 @@ static bool mount_in_initrd(struct mntent *me) {
 }
 
 static int add_mount(const char *what, const char *where, const char *type, const char *opts,
-                     int passno, bool noauto, bool nofail, bool automount, bool isbind, bool isnetwork,
-                     const char *source) {
+                     int passno, bool noauto, bool nofail, bool automount, bool isbind,
+                     bool remote_fs_target, bool initrd_fs_target, const char *source) {
         char _cleanup_free_
                 *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL,
                 *automount_name = NULL, *automount_unit = NULL;
@@ -227,9 +227,12 @@ static int add_mount(const char *what, const char *where, const char *type, cons
             mount_point_ignore(where))
                 return 0;
 
-        if (isnetwork) {
+        if (remote_fs_target) {
                 post = SPECIAL_REMOTE_FS_TARGET;
                 pre = SPECIAL_REMOTE_FS_PRE_TARGET;
+        } else if (initrd_fs_target) {
+                post = SPECIAL_INITRD_FS_TARGET;
+                pre = SPECIAL_INITRD_FS_PRE_TARGET;
         } else {
                 post = SPECIAL_LOCAL_FS_TARGET;
                 pre = SPECIAL_LOCAL_FS_PRE_TARGET;
@@ -407,6 +410,7 @@ static int parse_fstab(const char *prefix, bool initrd) {
                         continue;
 
                 what = fstab_node_to_udev_node(me->mnt_fsname);
+
                 where = strjoin(prefix, me->mnt_dir, NULL);
                 if (!what || !where) {
                         r = log_oom();
@@ -416,6 +420,21 @@ static int parse_fstab(const char *prefix, bool initrd) {
                 if (is_path(where))
                         path_kill_slashes(where);
 
+                if (initrd) {
+                        char _cleanup_free_ *mu = NULL, *name = NULL;
+                        /* Skip generation, if unit already exists */
+                        name = unit_name_from_path(where, ".mount");
+                        if (!name)
+                                return log_oom();
+                        mu = strjoin(arg_dest, "/", name, NULL);
+                        if (!mu)
+                                return log_oom();
+
+                        k = access(mu, R_OK);
+                        if (k == 0)
+                                continue;
+                }
+
                 log_debug("Found entry what=%s where=%s type=%s", what, where, me->mnt_type);
 
                 if (streq(me->mnt_type, "swap"))
@@ -432,8 +451,8 @@ static int parse_fstab(const char *prefix, bool initrd) {
                         isnetwork = mount_is_network(me);
 
                         k = add_mount(what, where, me->mnt_type, me->mnt_opts,
-                                     me->mnt_passno, noauto, nofail, automount,
-                                     isbind, isnetwork, fstab_path);
+                                      me->mnt_passno, noauto, nofail, automount,
+                                      isbind, isnetwork, initrd, fstab_path);
                 }
 
                 if (k < 0)
@@ -447,10 +466,19 @@ finish:
 
 static int parse_new_root_from_proc_cmdline(void) {
         char *w, *state;
-        _cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL;
+        _cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL, *mu = NULL;
         int r;
         size_t l;
 
+        /* Skip generation, if sysroot.mount already exists */
+        mu = strjoin(arg_dest, "/", "sysroot.mount", NULL);
+        if (!mu)
+                return log_oom();
+
+        r = access(mu, R_OK);
+        if (r == 0)
+            return 0;
+
         r = read_one_line_file("/proc/cmdline", &line);
         if (r < 0) {
                 log_error("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
@@ -506,7 +534,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, false, false, false,
-                              false, false, "/proc/cmdline");
+                              false, false, true, "/proc/cmdline");
 
                 if (r < 0)
                         return r;
@@ -566,7 +594,7 @@ static int parse_proc_cmdline(void) {
 }
 
 int main(int argc, char *argv[]) {
-        int r = 0, k, l = 0;
+        int r = 0, k = 0, l = 0;
 
         if (argc > 1 && argc != 4) {
                 log_error("This program takes three or no arguments.");
@@ -585,16 +613,14 @@ int main(int argc, char *argv[]) {
         if (parse_proc_cmdline() < 0)
                 return EXIT_FAILURE;
 
-        if (in_initrd())
-                r = parse_new_root_from_proc_cmdline();
+        if (arg_enabled)
+                r = parse_fstab("", false);
 
-        if (!arg_enabled)
-                return (r < 0) ? EXIT_FAILURE : EXIT_SUCCESS;
-
-        k = parse_fstab("", false);
-
-        if (in_initrd())
-                l = parse_fstab("/sysroot", true);
+        if (in_initrd()) {
+                if (arg_enabled)
+                        k = parse_fstab("/sysroot", true);
+                l = parse_new_root_from_proc_cmdline();
+        }
 
         return (r < 0) || (k < 0) || (l < 0) ? EXIT_FAILURE : EXIT_SUCCESS;
 }

commit 7d89ce303fb59743a4392eeb3110c00f100172ca
Author: Harald Hoyer <harald at redhat.com>
Date:   Mon Mar 4 19:03:05 2013 +0100

    units/initrd-*: require initrd-fs.target rather than local-fs.target

diff --git a/units/initrd-cleanup.service b/units/initrd-cleanup.service
index 8998696..061f803 100644
--- a/units/initrd-cleanup.service
+++ b/units/initrd-cleanup.service
@@ -10,8 +10,8 @@ Description=Cleaning Up and Shutting Down Daemons
 DefaultDependencies=no
 ConditionPathExists=/etc/initrd-release
 OnFailure=emergency.target
-Requires=local-fs.target swap.target
-After=local-fs.target swap.target
+Requires=initrd-fs.target swap.target
+After=initrd-fs.target swap.target
 
 [Service]
 Type=oneshot
diff --git a/units/initrd-parse-etc.service b/units/initrd-parse-etc.service
index 4bfbb0f..99e8c33 100644
--- a/units/initrd-parse-etc.service
+++ b/units/initrd-parse-etc.service
@@ -8,12 +8,13 @@
 [Unit]
 Description=Reload Configuration from the Real Root
 DefaultDependencies=no
-Requires=local-fs.target swap.target
-After=local-fs.target swap.target
+Requires=initrd-fs.target swap.target sysroot.mount
+After=initrd-fs.target swap.target sysroot.mount
 OnFailure=emergency.target
 ConditionPathExists=/etc/initrd-release
 
 [Service]
 Type=oneshot
 ExecStartPre=/usr/bin/systemctl daemon-reload
+ExecStart=/usr/bin/systemctl start initrd-fs.target
 ExecStart=/usr/bin/systemctl --no-block start initrd-cleanup.service
diff --git a/units/initrd-switch-root.target b/units/initrd-switch-root.target
index f706d29..ffadfc0 100644
--- a/units/initrd-switch-root.target
+++ b/units/initrd-switch-root.target
@@ -12,5 +12,5 @@ DefaultDependencies=no
 Requires=initrd-switch-root.service
 Before=initrd-switch-root.service
 AllowIsolate=yes
-Wants=initrd-udevadm-cleanup-db.service local-fs.target swap.target systemd-journald.service
-After=initrd-udevadm-cleanup-db.service local-fs.target swap.target emergency.service emergency.target
+Wants=initrd-udevadm-cleanup-db.service initrd-fs.target swap.target systemd-journald.service
+After=initrd-udevadm-cleanup-db.service initrd-fs.target swap.target emergency.service emergency.target

commit 39b83cdab37623a546344622db9bbbc784c15df5
Author: Harald Hoyer <harald at redhat.com>
Date:   Mon Mar 4 19:01:05 2013 +0100

    add initrd-fs.target and initrd-fs-pre.target

diff --git a/Makefile.am b/Makefile.am
index 5453868..e23a6b4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -343,6 +343,8 @@ dist_systemunit_DATA = \
 	units/kexec.target \
 	units/local-fs.target \
 	units/local-fs-pre.target \
+	units/initrd-fs.target \
+	units/initrd-fs-pre.target \
 	units/remote-fs.target \
 	units/remote-fs-pre.target \
 	units/network.target \
diff --git a/src/core/special.h b/src/core/special.h
index 99c0e12..de5889d 100644
--- a/src/core/special.h
+++ b/src/core/special.h
@@ -48,6 +48,8 @@
 #define SPECIAL_SOCKETS_TARGET "sockets.target"
 #define SPECIAL_LOCAL_FS_TARGET "local-fs.target"
 #define SPECIAL_LOCAL_FS_PRE_TARGET "local-fs-pre.target"
+#define SPECIAL_INITRD_FS_TARGET "initrd-fs.target"
+#define SPECIAL_INITRD_FS_PRE_TARGET "initrd-fs-pre.target"
 #define SPECIAL_REMOTE_FS_TARGET "remote-fs.target"       /* LSB's $remote_fs */
 #define SPECIAL_REMOTE_FS_PRE_TARGET "remote-fs-pre.target"
 #define SPECIAL_SWAP_TARGET "swap.target"
diff --git a/units/initrd-fs-pre.target b/units/initrd-fs-pre.target
new file mode 100644
index 0000000..9aa8061
--- /dev/null
+++ b/units/initrd-fs-pre.target
@@ -0,0 +1,11 @@
+#  This file is part of systemd.
+#
+#  systemd is free software; you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as published by
+#  the Free Software Foundation; either version 2.1 of the License, or
+#  (at your option) any later version.
+
+[Unit]
+Description=Initrd File Systems (Pre)
+Documentation=man:systemd.special(7)
+ConditionPathExists=/etc/initrd-release
diff --git a/units/initrd-fs.target b/units/initrd-fs.target
new file mode 100644
index 0000000..6ba1758
--- /dev/null
+++ b/units/initrd-fs.target
@@ -0,0 +1,13 @@
+#  This file is part of systemd.
+#
+#  systemd is free software; you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as published by
+#  the Free Software Foundation; either version 2.1 of the License, or
+#  (at your option) any later version.
+
+[Unit]
+Description=Initrd File Systems
+Documentation=man:systemd.special(7)
+OnFailure=emergency.target
+OnFailureIsolate=yes
+ConditionPathExists=/etc/initrd-release



More information about the systemd-commits mailing list