[systemd-commits] 4 commits - Makefile.am src/cryptsetup-generator.c src/fsck.c src/job.c src/manager.c src/shutdown.c src/util.c src/util.h TODO

Lennart Poettering lennart at kemper.freedesktop.org
Mon Feb 14 15:31:04 PST 2011


 Makefile.am                |    6 +-
 TODO                       |    4 -
 src/cryptsetup-generator.c |    2 
 src/fsck.c                 |   10 ++-
 src/job.c                  |    2 
 src/manager.c              |   86 +--------------------------------
 src/shutdown.c             |    2 
 src/util.c                 |  114 +++++++++++++++++++++++++++++++++++++++++++++
 src/util.h                 |    2 
 9 files changed, 137 insertions(+), 91 deletions(-)

New commits:
commit a4c24ff75a57efc95b34ece5a7805c3b156208ef
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Feb 15 00:30:51 2011 +0100

    fsck: do not fail boot if fsck returns with an error code that hasn't 2 or 6 set

diff --git a/TODO b/TODO
index b2b9682..8f9f76e 100644
--- a/TODO
+++ b/TODO
@@ -5,9 +5,7 @@ Bugs:
 * when plymouth is disabled the console password entry stuff seems to be borked
   https://bugzilla.redhat.com/show_bug.cgi?id=655538
 
-* fsck.btrfs non-existance should not cause mounting to fail
-
-* single user service needs to be masked?
+* systemctl default is started when we type "reboot" at rescue mode prompt
 
 Features:
 
diff --git a/src/fsck.c b/src/fsck.c
index fdcf6b4..7855f3a 100644
--- a/src/fsck.c
+++ b/src/fsck.c
@@ -57,7 +57,7 @@ static void start_target(const char *target, bool isolate) {
         else
                 mode = "replace";
 
-        log_debug("Running request %s/start/%s", target, mode);
+        log_info("Running request %s/start/%s", target, mode);
 
         if (!(m = dbus_message_new_method_call("org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartUnitReplace"))) {
                 log_error("Could not allocate message.");
@@ -247,12 +247,16 @@ int main(int argc, char *argv[]) {
                 else
                         log_error("fsck failed due to unknown reason.");
 
-                if (status.si_code == CLD_EXITED && status.si_status & 2)
+                if (status.si_code == CLD_EXITED && (status.si_status & 2) && root_directory)
                         /* System should be rebooted. */
                         start_target(SPECIAL_REBOOT_TARGET, false);
-                else
+                else if (status.si_code == CLD_EXITED && (status.si_status & 6))
                         /* Some other problem */
                         start_target(SPECIAL_EMERGENCY_TARGET, true);
+                else {
+                        r = EXIT_SUCCESS;
+                        log_warning("Ignoring error.");
+                }
 
         } else
                 r = EXIT_SUCCESS;

commit 83cc030fadf71d63d488cf9015275f9e5a02e2cc
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Feb 15 00:30:11 2011 +0100

    shutdown: execute all binaries in /lib/systemd/system-shutdown as last step before invoking reboot()

diff --git a/Makefile.am b/Makefile.am
index dd872f8..f508163 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -41,6 +41,7 @@ rootsbindir=$(rootdir)/sbin
 rootlibexecdir=$(rootdir)/lib/systemd
 systemunitdir=$(rootdir)/lib/systemd/system
 systemgeneratordir=$(rootdir)/lib/systemd/system-generators
+systemshutdowndir=$(rootdir)/lib/systemd/system-shutdown
 
 AM_CPPFLAGS = \
 	-include $(top_builddir)/config.h \
@@ -62,6 +63,7 @@ AM_CPPFLAGS = \
 	-DSYSTEMD_CRYPTSETUP_PATH=\"$(rootlibexecdir)/systemd-cryptsetup\" \
 	-DSYSTEM_GENERATOR_PATH=\"$(systemgeneratordir)\" \
 	-DUSER_GENERATOR_PATH=\"$(usergeneratordir)\" \
+	-DSYSTEM_SHUTDOWN_PATH=\"$(systemshutdowndir)\" \
 	-I $(top_srcdir)/src
 
 if TARGET_GENTOO
@@ -375,7 +377,8 @@ libsystemd_basic_la_SOURCES = \
 	src/conf-parser.c \
 	src/socket-util.c \
 	src/log.c \
-	src/ratelimit.c
+	src/ratelimit.c \
+	src/exit-status.c
 
 libsystemd_basic_la_CFLAGS = \
 	$(AM_CFLAGS) \
@@ -403,7 +406,6 @@ libsystemd_core_la_SOURCES = \
 	src/load-dropin.c \
 	src/execute.c \
 	src/utmp-wtmp.c \
-	src/exit-status.c \
 	src/dbus.c \
 	src/dbus-manager.c \
 	src/dbus-unit.c \
diff --git a/src/manager.c b/src/manager.c
index 92b2745..7d0b351 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -2836,9 +2836,8 @@ void manager_check_finished(Manager *m) {
 
 void manager_run_generators(Manager *m) {
         DIR *d = NULL;
-        struct dirent *de;
-        Hashmap *pids = NULL;
         const char *generator_path;
+        const char *argv[3];
 
         assert(m);
 
@@ -2868,83 +2867,11 @@ void manager_run_generators(Manager *m) {
                 }
         }
 
-        if (!(pids = hashmap_new(trivial_hash_func, trivial_compare_func))) {
-                log_error("Failed to allocate set.");
-                goto finish;
-        }
-
-        while ((de = readdir(d))) {
-                char *path;
-                pid_t pid;
-                int k;
-
-                if (ignore_file(de->d_name))
-                        continue;
+        argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
+        argv[1] = m->generator_unit_path;
+        argv[2] = NULL;
 
-                if (de->d_type != DT_REG &&
-                    de->d_type != DT_LNK &&
-                    de->d_type != DT_UNKNOWN)
-                        continue;
-
-                if (asprintf(&path, "%s/%s", generator_path, de->d_name) < 0) {
-                        log_error("Out of memory");
-                        continue;
-                }
-
-                if ((pid = fork()) < 0) {
-                        log_error("Failed to fork: %m");
-                        free(path);
-                        continue;
-                }
-
-                if (pid == 0) {
-                        const char *arguments[5];
-                        /* Child */
-
-                        arguments[0] = path;
-                        arguments[1] = m->generator_unit_path;
-                        arguments[2] = NULL;
-
-                        execv(path, (char **) arguments);
-
-                        log_error("Failed to execute %s: %m", path);
-                        _exit(EXIT_FAILURE);
-                }
-
-                log_debug("Spawned generator %s as %lu", path, (unsigned long) pid);
-
-                if ((k = hashmap_put(pids, UINT_TO_PTR(pid), path)) < 0) {
-                        log_error("Failed to add PID to set: %s", strerror(-k));
-                        free(path);
-                }
-        }
-
-        while (!hashmap_isempty(pids)) {
-                siginfo_t si;
-                char *path;
-
-                zero(si);
-                if (waitid(P_ALL, 0, &si, WEXITED) < 0) {
-
-                        if (errno == EINTR)
-                                continue;
-
-                        log_error("waitid() failed: %m");
-                        goto finish;
-                }
-
-                if ((path = hashmap_remove(pids, UINT_TO_PTR(si.si_pid)))) {
-                        if (!is_clean_exit(si.si_code, si.si_status)) {
-                                if (si.si_code == CLD_EXITED)
-                                        log_error("%s exited with exit status %i.", path, si.si_status);
-                                else
-                                        log_error("%s terminated by signal %s.", path, signal_to_string(si.si_status));
-                        } else
-                                log_debug("Generator %s exited successfully.", path);
-
-                        free(path);
-                }
-        }
+        execute_directory(generator_path, d, (char**) argv);
 
         if (rmdir(m->generator_unit_path) >= 0) {
                 /* Uh? we were able to remove this dir? I guess that
@@ -2973,9 +2900,6 @@ void manager_run_generators(Manager *m) {
 finish:
         if (d)
                 closedir(d);
-
-        if (pids)
-                hashmap_free_free(pids);
 }
 
 void manager_undo_generators(Manager *m) {
diff --git a/src/shutdown.c b/src/shutdown.c
index 94deb85..23b9f1b 100644
--- a/src/shutdown.c
+++ b/src/shutdown.c
@@ -336,6 +336,8 @@ int main(int argc, char *argv[]) {
         if (retries >= FINALIZE_ATTEMPTS)
                 log_error("Too many interations, giving up.");
 
+        execute_directory(SYSTEM_SHUTDOWN_PATH, NULL, NULL);
+
         sync();
 
         if (cmd == LINUX_REBOOT_CMD_KEXEC) {
diff --git a/src/util.c b/src/util.c
index 80b88b0..b0a01fd 100644
--- a/src/util.c
+++ b/src/util.c
@@ -59,6 +59,7 @@
 #include "strv.h"
 #include "label.h"
 #include "exit-status.h"
+#include "hashmap.h"
 
 bool streq_ptr(const char *a, const char *b) {
 
@@ -3664,6 +3665,119 @@ bool running_in_vm(void) {
         return false;
 }
 
+void execute_directory(const char *directory, DIR *d, char *argv[]) {
+        DIR *_d = NULL;
+        struct dirent *de;
+        Hashmap *pids = NULL;
+
+        assert(directory);
+
+        /* Executes all binaries in a directory in parallel and waits
+         * until all they all finished. */
+
+        if (!d) {
+                if (!(_d = opendir(directory))) {
+
+                        if (errno == ENOENT)
+                                return;
+
+                        log_error("Failed to enumerate directory %s: %m", directory);
+                        return;
+                }
+
+                d = _d;
+        }
+
+        if (!(pids = hashmap_new(trivial_hash_func, trivial_compare_func))) {
+                log_error("Failed to allocate set.");
+                goto finish;
+        }
+
+        while ((de = readdir(d))) {
+                char *path;
+                pid_t pid;
+                int k;
+
+                if (ignore_file(de->d_name))
+                        continue;
+
+                if (de->d_type != DT_REG &&
+                    de->d_type != DT_LNK &&
+                    de->d_type != DT_UNKNOWN)
+                        continue;
+
+                if (asprintf(&path, "%s/%s", directory, de->d_name) < 0) {
+                        log_error("Out of memory");
+                        continue;
+                }
+
+                if ((pid = fork()) < 0) {
+                        log_error("Failed to fork: %m");
+                        free(path);
+                        continue;
+                }
+
+                if (pid == 0) {
+                        char *_argv[2];
+                        /* Child */
+
+                        if (!argv) {
+                                _argv[0] = path;
+                                _argv[1] = NULL;
+                                argv = _argv;
+                        } else
+                                if (!argv[0])
+                                        argv[0] = path;
+
+                        execv(path, argv);
+
+                        log_error("Failed to execute %s: %m", path);
+                        _exit(EXIT_FAILURE);
+                }
+
+                log_debug("Spawned %s as %lu", path, (unsigned long) pid);
+
+                if ((k = hashmap_put(pids, UINT_TO_PTR(pid), path)) < 0) {
+                        log_error("Failed to add PID to set: %s", strerror(-k));
+                        free(path);
+                }
+        }
+
+        while (!hashmap_isempty(pids)) {
+                siginfo_t si;
+                char *path;
+
+                zero(si);
+                if (waitid(P_ALL, 0, &si, WEXITED) < 0) {
+
+                        if (errno == EINTR)
+                                continue;
+
+                        log_error("waitid() failed: %m");
+                        goto finish;
+                }
+
+                if ((path = hashmap_remove(pids, UINT_TO_PTR(si.si_pid)))) {
+                        if (!is_clean_exit(si.si_code, si.si_status)) {
+                                if (si.si_code == CLD_EXITED)
+                                        log_error("%s exited with exit status %i.", path, si.si_status);
+                                else
+                                        log_error("%s terminated by signal %s.", path, signal_to_string(si.si_status));
+                        } else
+                                log_debug("%s exited successfully.", path);
+
+                        free(path);
+                }
+        }
+
+finish:
+        if (_d)
+                closedir(_d);
+
+        if (pids)
+                hashmap_free_free(pids);
+}
+
 static const char *const ioprio_class_table[] = {
         [IOPRIO_CLASS_NONE] = "none",
         [IOPRIO_CLASS_RT] = "realtime",
diff --git a/src/util.h b/src/util.h
index a534dcf..3898b89 100644
--- a/src/util.h
+++ b/src/util.h
@@ -375,6 +375,8 @@ const char *default_term_for_tty(const char *tty);
 
 bool running_in_vm(void);
 
+void execute_directory(const char *directory, DIR *_d, char *argv[]);
+
 #define NULSTR_FOREACH(i, l)                                    \
         for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
 

commit 3036c489fa503031acb9a2fba1f3537cbe59ae9e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Feb 14 23:10:31 2011 +0100

    job: make status message printing more verbose

diff --git a/src/job.c b/src/job.c
index 30a46be..18a2495 100644
--- a/src/job.c
+++ b/src/job.c
@@ -498,7 +498,7 @@ int job_finish_and_invalidate(Job *j, bool success) {
         job_free(j);
 
         if (!success && j->type == JOB_START)
-                unit_status_printf(u, "Starting %s " ANSI_HIGHLIGHT_ON "failed" ANSI_HIGHLIGHT_OFF ".\n", unit_description(u));
+                unit_status_printf(u, "Starting %s " ANSI_HIGHLIGHT_ON "failed" ANSI_HIGHLIGHT_OFF ", see 'systemctl status %s' for details.\n", unit_description(u), u->meta.id);
 
         /* Fail depending jobs on failure */
         if (!success) {

commit a4477e68524ea7aeadd57028ff83319cb2c83620
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Feb 14 23:09:27 2011 +0100

    cryptsetup: fix unit file description

diff --git a/src/cryptsetup-generator.c b/src/cryptsetup-generator.c
index 2bc4f56..00120f6 100644
--- a/src/cryptsetup-generator.c
+++ b/src/cryptsetup-generator.c
@@ -98,7 +98,7 @@ static int create_disk(
 
         fprintf(f,
                 "[Unit]\n"
-                "Description=Cryptography Setup for %%f\n"
+                "Description=Cryptography Setup for %%I\n"
                 "DefaultDependencies=no\n"
                 "BindTo=%s dev-mapper-%%i.device\n"
                 "After=systemd-readahead-collect.service systemd-readahead-replay.service %s\n"



More information about the systemd-commits mailing list