[systemd-commits] 3 commits - src/core src/shared

Zbigniew Jędrzejewski-Szmek zbyszek at kemper.freedesktop.org
Fri Oct 17 07:09:48 PDT 2014


 src/core/main.c          |    2 +-
 src/core/manager.c       |   32 +++++++++++++++++++++++---------
 src/shared/switch-root.c |   15 +++++++--------
 3 files changed, 31 insertions(+), 18 deletions(-)

New commits:
commit e7bc519620cb7bcdbe2166fc2a446453769d827e
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Thu Oct 16 19:15:38 2014 -0500

    systemd: try harder to bind to notify socket
    
    Without the socket open we are going to crash and burn. If for
    whatever reason we fail during deserialization we will fail when
    trying to open the socket. In this case it is better to unlink the old
    socket and maybe lose some messages, than to continue without the
    notification socket.
    
    Of course this situation should not happen, but we should handle
    it as gracefully as possible anyway.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=1099299

diff --git a/src/core/manager.c b/src/core/manager.c
index 1bf75e2..726977f 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -565,7 +565,21 @@ static int manager_setup_notify(Manager *m) {
                 r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
                 if (r < 0) {
                         log_error("bind(%s) failed: %m", sa.un.sun_path);
-                        return -errno;
+                        if (errno == EADDRINUSE) {
+                                log_notice("Removing %s socket and trying again.", m->notify_socket);
+                                r = unlink(m->notify_socket);
+                                if (r < 0) {
+                                        log_error("Failed to remove %s: %m", m->notify_socket);
+                                        return -EADDRINUSE;
+                                }
+
+                                r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
+                                if (r < 0) {
+                                        log_error("bind(%s) failed: %m", sa.un.sun_path);
+                                        return -errno;
+                                }
+                        } else
+                                return -errno;
                 }
 
                 r = setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));

commit 46849c3fb1d92882ec456fdbf445a175c13fba9c
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Thu Oct 16 19:13:45 2014 -0500

    systemd: log deserialization errors as warnings
    
    If we failed to parse something that we wrote ourselves,
    things are seriously off. This is also likely to lead to
    problems futher on.

diff --git a/src/core/manager.c b/src/core/manager.c
index e0c1cd1..1bf75e2 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -354,7 +354,7 @@ static int manager_setup_signals(Manager *m) {
                 return r;
 
         /* Process signals a bit earlier than the rest of things, but
-         * later that notify_fd processing, so that the notify
+         * later than notify_fd processing, so that the notify
          * processing can still figure out to which process/service a
          * message belongs, before we reap the process. */
         r = sd_event_source_set_priority(m->signal_event_source, -5);
@@ -2229,7 +2229,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                         uint32_t id;
 
                         if (safe_atou32(l+15, &id) < 0)
-                                log_debug("Failed to parse current job id value %s", l+15);
+                                log_warning("Failed to parse current job id value %s", l+15);
                         else
                                 m->current_job_id = MAX(m->current_job_id, id);
 
@@ -2237,7 +2237,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                         uint32_t n;
 
                         if (safe_atou32(l+17, &n) < 0)
-                                log_debug("Failed to parse installed jobs counter %s", l+17);
+                                log_warning("Failed to parse installed jobs counter %s", l+17);
                         else
                                 m->n_installed_jobs += n;
 
@@ -2245,7 +2245,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                         uint32_t n;
 
                         if (safe_atou32(l+14, &n) < 0)
-                                log_debug("Failed to parse failed jobs counter %s", l+14);
+                                log_warning("Failed to parse failed jobs counter %s", l+14);
                         else
                                 m->n_failed_jobs += n;
 
@@ -2254,7 +2254,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
 
                         b = parse_boolean(l+10);
                         if (b < 0)
-                                log_debug("Failed to parse taint /usr flag %s", l+10);
+                                log_warning("Failed to parse taint /usr flag %s", l+10);
                         else
                                 m->taint_usr = m->taint_usr || b;
 
@@ -2305,7 +2305,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                         int fd;
 
                         if (safe_atoi(l + 10, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
-                                log_debug("Failed to parse notify fd: %s", l + 10);
+                                log_warning("Failed to parse notify fd: %s", l + 10);
                         else {
                                 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
                                 safe_close(m->notify_fd);
@@ -2328,14 +2328,14 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                         int fd;
 
                         if (safe_atoi(l + 9, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
-                                log_debug("Failed to parse kdbus fd: %s", l + 9);
+                                log_warning("Failed to parse kdbus fd: %s", l + 9);
                         else {
                                 safe_close(m->kdbus_fd);
                                 m->kdbus_fd = fdset_remove(fds, fd);
                         }
 
                 } else if (bus_track_deserialize_item(&m->deserialized_subscribed, l) == 0)
-                        log_debug("Unknown serialization item '%s'", l);
+                        log_warning("Unknown serialization item '%s'", l);
         }
 
         for (;;) {

commit d677d4df80e0ea1c66c691f50867fedd63c6770a
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Thu Oct 16 19:12:55 2014 -0500

    systemd: continue switch-root even if umount fails
    
    Leaving the old root around seems better than aborting the
    switch.

diff --git a/src/core/main.c b/src/core/main.c
index 44373cc..0388f46 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -1857,7 +1857,7 @@ finish:
                         /* And switch root with MS_MOVE, because we remove the old directory afterwards and detach it. */
                         r = switch_root(switch_root_dir, "/mnt", true, MS_MOVE);
                         if (r < 0)
-                                log_error("Failed to switch root, ignoring: %s", strerror(-r));
+                                log_error("Failed to switch root, trying to continue: %s", strerror(-r));
                 }
 
                 args_size = MAX(6, argc+1);
diff --git a/src/shared/switch-root.c b/src/shared/switch-root.c
index 5f075e6..bac0e5c 100644
--- a/src/shared/switch-root.c
+++ b/src/shared/switch-root.c
@@ -62,10 +62,9 @@ int switch_root(const char *new_root, const char *oldroot, bool detach_oldroot,
                 return -errno;
         }
 
-        /* Work-around for a kernel bug: for some reason the kernel
-         * refuses switching root if any file systems are mounted
-         * MS_SHARED. Hence remount them MS_PRIVATE here as a
-         * work-around.
+        /* Work-around for kernel design: the kernel refuses switching
+         * root if any file systems are mounted MS_SHARED. Hence
+         * remount them MS_PRIVATE here as a work-around.
          *
          * https://bugzilla.redhat.com/show_bug.cgi?id=847418 */
         if (mount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL) < 0)
@@ -128,10 +127,10 @@ int switch_root(const char *new_root, const char *oldroot, bool detach_oldroot,
 
                 /* Immediately get rid of the old root, if detach_oldroot is set.
                  * Since we are running off it we need to do this lazily. */
-                if (detach_oldroot && umount2(oldroot, MNT_DETACH) < 0) {
-                        log_error("Failed to umount old root dir %s: %m", oldroot);
-                        return -errno;
-                }
+                if (detach_oldroot && umount2(oldroot, MNT_DETACH) < 0)
+                        log_error("Failed to lazily umount old root dir %s, %s: %m",
+                                  oldroot,
+                                  errno == ENOENT ? "ignoring" : "leaving it around");
 
         } else if (mount(new_root, "/", NULL, MS_MOVE, NULL) < 0) {
                 log_error("Failed to mount moving %s to /: %m", new_root);



More information about the systemd-commits mailing list