All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] systemd: v219 with stable fixes
@ 2015-03-30 18:13 Bruno Bottazzini
  2015-03-30 18:20 ` Bottazzini, Bruno
  2015-03-31 20:21 ` Bottazzini, Bruno
  0 siblings, 2 replies; 12+ messages in thread
From: Bruno Bottazzini @ 2015-03-30 18:13 UTC (permalink / raw)
  To: openembedded-core

Adding patches that fix bugs for 219 version.
This will get the same consistency of the stable systemd 219 version.

More details:
http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
---
 ...remote-fix-certificate-status-memory-leak.patch |  31 +
 ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
 ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
 ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
 ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
 .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
 ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
 .../0008-bootchart-fix-default-init-path.patch     |  44 +
 ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
 ...0-Make-root-s-home-directory-configurable.patch |  89 +-
 ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
 ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
 ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
 ...aker-dependencies-between-mount-and-devic.patch |  33 +
 ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
 ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
 ...l-add-some-hints-how-to-override-settings.patch |  39 +
 .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
 .../0018-core-fix-return-value-on-OOM.patch        |  26 +
 ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
 ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
 ...downgrade-unit-type-not-supported-message.patch |  31 +
 ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
 ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
 ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
 ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
 ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
 meta/recipes-core/systemd/systemd_219.bb           |  33 +-
 28 files changed, 2050 insertions(+), 55 deletions(-)
 create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
 create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch

diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
new file mode 100644
index 0000000..172bea2
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
@@ -0,0 +1,31 @@
+From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
+From: Michal Schmidt <mschmidt@redhat.com>
+Date: Tue, 17 Feb 2015 10:33:01 +0100
+Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
+
+The output of gnutls_certificate_verification_status_print() needs to be
+freed.
+
+Noticed this while staring at verify_cert_authorized() to see what could
+possibly confuse gcc5 on armv7hl to segfault during compilation.
+
+(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
+---
+ src/journal-remote/microhttpd-util.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
+index 34d9337..de9c6ab 100644
+--- a/src/journal-remote/microhttpd-util.c
++++ b/src/journal-remote/microhttpd-util.c
+@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
+                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
+ 
+         log_info("Certificate status: %s", out.data);
++        gnutls_free(out.data);
+ 
+         return status == 0 ? 0 : -EPERM;
+ }
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
new file mode 100644
index 0000000..f615876
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
@@ -0,0 +1,35 @@
+From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
+From: Michal Schmidt <mschmidt@redhat.com>
+Date: Tue, 17 Feb 2015 10:36:57 +0100
+Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
+
+Found by Valgrind while testing the previous memory leak fix.
+
+(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
+---
+ src/journal-remote/microhttpd-util.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
+index de9c6ab..a95fff1 100644
+--- a/src/journal-remote/microhttpd-util.c
++++ b/src/journal-remote/microhttpd-util.c
+@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
+         return 0;
+ }
+ 
++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
++        gnutls_x509_crt_deinit(*p);
++}
++
+ int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
+         const union MHD_ConnectionInfo *ci;
+         gnutls_session_t session;
+-        gnutls_x509_crt_t client_cert;
++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
+         _cleanup_free_ char *buf = NULL;
+         int r;
+ 
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
new file mode 100644
index 0000000..15fa98c
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
@@ -0,0 +1,28 @@
+From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
+From: Martin Pitt <martin.pitt@ubuntu.com>
+Date: Tue, 17 Feb 2015 12:47:51 +0100
+Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
+
+parse_acl() returns the error instead of setting errno.
+
+(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
+---
+ src/tmpfiles/tmpfiles.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
+index c948d4d..88ba7e4 100644
+--- a/src/tmpfiles/tmpfiles.c
++++ b/src/tmpfiles/tmpfiles.c
+@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
+          * afterwards, so the mask can be added now if necessary. */
+         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
+         if (r < 0)
+-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
+                                   item->argument);
+ #else
+         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
new file mode 100644
index 0000000..f43068d
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
@@ -0,0 +1,26 @@
+From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg@jklm.no>
+Date: Wed, 18 Feb 2015 14:33:50 +0100
+Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
+
+(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
+---
+ src/test/test-utf8.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
+index befa385..346f852 100644
+--- a/src/test/test-utf8.c
++++ b/src/test/test-utf8.c
+@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
+ 
+ static void test_utf16_to_utf8(void) {
+         char *a = NULL;
+-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
+         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
+ 
+         a = utf16_to_utf8(utf16, 14);
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
new file mode 100644
index 0000000..35fe913
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
@@ -0,0 +1,131 @@
+From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
+Date: Mon, 23 Feb 2015 23:19:54 -0500
+Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
+
+https://bugs.freedesktop.org/show_bug.cgi?id=89202
+https://bugs.debian.org/778656
+
+Status quo ante can be restored with:
+  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
+
+(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
+---
+ src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
+ src/shared/acl-util.h |  4 +++
+ 2 files changed, 81 insertions(+), 2 deletions(-)
+
+diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
+index a4ff1ab..cbe09d7 100644
+--- a/src/shared/acl-util.c
++++ b/src/shared/acl-util.c
+@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
+         return 0;
+ }
+ 
++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
++        acl_tag_t tag_a, tag_b;
++
++        if (acl_get_tag_type(a, &tag_a) < 0)
++                return -errno;
++
++        if (acl_get_tag_type(b, &tag_b) < 0)
++                return -errno;
++
++        if (tag_a != tag_b)
++                return false;
++
++        switch (tag_a) {
++        case ACL_USER_OBJ:
++        case ACL_GROUP_OBJ:
++        case ACL_MASK:
++        case ACL_OTHER:
++                /* can have only one of those */
++                return true;
++        case ACL_USER: {
++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
++
++                uid_a = acl_get_qualifier(a);
++                if (!uid_a)
++                        return -errno;
++
++                uid_b = acl_get_qualifier(b);
++                if (!uid_b)
++                        return -errno;
++
++                return *uid_a == *uid_b;
++        }
++        case ACL_GROUP: {
++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
++
++                gid_a = acl_get_qualifier(a);
++                if (!gid_a)
++                        return -errno;
++
++                gid_b = acl_get_qualifier(b);
++                if (!gid_b)
++                        return -errno;
++
++                return *gid_a == *gid_b;
++        }
++        default:
++                assert_not_reached("Unknown acl tag type");
++        }
++}
++
++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
++        acl_entry_t i;
++        int r;
++
++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
++             r > 0;
++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
++
++                r = acl_entry_equal(i, entry);
++                if (r < 0)
++                        return r;
++                if (r > 0) {
++                        *out = i;
++                        return 1;
++                }
++        }
++        if (r < 0)
++                return -errno;
++        return 0;
++}
++
+ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
+         _cleanup_(acl_freep) acl_t old;
+         acl_entry_t i;
+@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
+ 
+                 acl_entry_t j;
+ 
+-                if (acl_create_entry(&old, &j) < 0)
+-                        return -errno;
++                r = find_acl_entry(old, i, &j);
++                if (r < 0)
++                        return r;
++                if (r == 0)
++                        if (acl_create_entry(&old, &j) < 0)
++                                return -errno;
+ 
+                 if (acl_copy_entry(j, i) < 0)
+                         return -errno;
+diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
+index 90e88ff..fdb9006 100644
+--- a/src/shared/acl-util.h
++++ b/src/shared/acl-util.h
+@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
+ DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
+ #define acl_free_charp acl_free
+ DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
++#define acl_free_uid_tp acl_free
++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
++#define acl_free_gid_tp acl_free
++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
+ 
+ #endif
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
new file mode 100644
index 0000000..fc707bb
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
@@ -0,0 +1,32 @@
+From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
+From: Daniel Mack <daniel@zonque.org>
+Date: Tue, 24 Feb 2015 13:26:09 +0100
+Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
+
+  CC       src/shared/libsystemd_shared_la-time-util.lo
+src/shared/time-util.c: In function 'parse_nsec':
+src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
+                 if (!*s != 0)
+                         ^
+
+(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
+---
+ src/shared/time-util.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/shared/time-util.c b/src/shared/time-util.c
+index 947ac1f..1c36c57 100644
+--- a/src/shared/time-util.c
++++ b/src/shared/time-util.c
+@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
+         s = startswith(p, "infinity");
+         if (s) {
+                 s += strspn(s, WHITESPACE);
+-                if (!*s != 0)
++                if (*s != 0)
+                         return -EINVAL;
+ 
+                 *nsec = NSEC_INFINITY;
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
new file mode 100644
index 0000000..161b7b5
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
@@ -0,0 +1,36 @@
+From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
+From: Daniel Mack <daniel@zonque.org>
+Date: Tue, 24 Feb 2015 13:27:10 +0100
+Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
+
+(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
+---
+ src/test/test-time.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/src/test/test-time.c b/src/test/test-time.c
+index 8cfc4cc..3840fff 100644
+--- a/src/test/test-time.c
++++ b/src/test/test-time.c
+@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
+         assert_se(u == 2);
+         assert_se(parse_nsec(".7", &u) >= 0);
+         assert_se(u == 0);
++        assert_se(parse_nsec("infinity", &u) >= 0);
++        assert_se(u == NSEC_INFINITY);
++        assert_se(parse_nsec(" infinity ", &u) >= 0);
++        assert_se(u == NSEC_INFINITY);
+ 
+         assert_se(parse_nsec(" xyz ", &u) < 0);
+         assert_se(parse_nsec("", &u) < 0);
+         assert_se(parse_nsec(" . ", &u) < 0);
+         assert_se(parse_nsec(" 5. ", &u) < 0);
+         assert_se(parse_nsec(".s ", &u) < 0);
++        assert_se(parse_nsec(" infinity .7", &u) < 0);
++        assert_se(parse_nsec(".3 infinity", &u) < 0);
+ }
+ 
+ static void test_format_timespan_one(usec_t x, usec_t accuracy) {
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
new file mode 100644
index 0000000..7eaad1e
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
@@ -0,0 +1,44 @@
+From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
+From: Martin Pitt <martin.pitt@ubuntu.com>
+Date: Tue, 24 Feb 2015 14:30:10 +0100
+Subject: [PATCH 08/26] bootchart: fix default init path
+
+Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
+rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
+multi-arch systems.
+
+https://launchpad.net/bugs/1423867
+(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
+---
+ Makefile.am               | 1 +
+ src/bootchart/bootchart.c | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index bf04d31..cc577ce 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
+ 	-DKEXEC=\"$(KEXEC)\" \
+ 	-DLIBDIR=\"$(libdir)\" \
+ 	-DROOTLIBDIR=\"$(rootlibdir)\" \
++	-DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
+ 	-DTEST_DIR=\"$(abs_top_srcdir)/test\" \
+ 	-I $(top_srcdir)/src \
+ 	-I $(top_builddir)/src/shared \
+diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
+index 64a384b..175be68 100644
+--- a/src/bootchart/bootchart.c
++++ b/src/bootchart/bootchart.c
+@@ -76,7 +76,7 @@ int sysfd=-1;
+ #define DEFAULT_HZ 25.0
+ #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
+ #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
+-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
+ #define DEFAULT_OUTPUT "/run/log"
+ 
+ /* graph defaults */
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
new file mode 100644
index 0000000..dbffa5b
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
@@ -0,0 +1,44 @@
+From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
+Date: Tue, 24 Feb 2015 10:10:04 -0500
+Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
+
+It is not necessary when running as telinit, etc.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1184712
+(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
+---
+ src/systemctl/systemctl.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
+index 21cb898..6b93ec8 100644
+--- a/src/systemctl/systemctl.c
++++ b/src/systemctl/systemctl.c
+@@ -7204,6 +7204,11 @@ found:
+                 }
+         }
+ 
++        /* Increase max number of open files to 16K if we can, we
++         * might needs this when browsing journal files, which might
++         * be split up into many files. */
++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
++
+         return verb->dispatch(bus, argv + optind);
+ }
+ 
+@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
+                 goto finish;
+         }
+ 
+-        /* Increase max number of open files to 16K if we can, we
+-         * might needs this when browsing journal files, which might
+-         * be split up into many files. */
+-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
+-
+         if (!avoid_bus())
+                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
+ 
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
index 41b9039..ff2871b 100644
--- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
+++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
@@ -1,7 +1,7 @@
-From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Fri, 20 Feb 2015 05:24:49 +0000
-Subject: [PATCH 10/11] Make root's home directory configurable
+From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
+From: Bruno Bottazzini <bruno.bottazzini@intel.com>
+Date: Thu, 5 Mar 2015 17:38:12 -0300
+Subject: [PATCH] Make root's home directory configurable
 
 OpenEmbedded has a configurable home directory for root. Allow
 systemd to be built using its idea of what root's home directory
@@ -9,32 +9,31 @@ should be.
 
 Upstream-Status: Pending
 
-Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
+Patch made by Khem Raj <raj.khem@gmail.com> updated to be
+compatbile with systemd 219-stable
 ---
- Makefile.am                       | 2 ++
- configure.ac                      | 7 +++++++
- src/core/unit-printf.c            | 2 +-
- src/nspawn/nspawn.c               | 4 ++--
- src/shared/util.c                 | 4 ++--
- units/console-shell.service.m4.in | 4 ++--
- units/emergency.service.in        | 4 ++--
- units/rescue.service.in           | 4 ++--
- 8 files changed, 20 insertions(+), 11 deletions(-)
+ Makefile.am                | 2 ++
+ configure.ac               | 7 +++++++
+ src/core/unit-printf.c     | 2 +-
+ src/nspawn/nspawn.c        | 5 ++---
+ src/shared/util.c          | 4 ++--
+ units/emergency.service.in | 4 ++--
+ units/rescue.service.in    | 4 ++--
+ 7 files changed, 18 insertions(+), 10 deletions(-)
 
 diff --git a/Makefile.am b/Makefile.am
-index 0fb3f9f..4623963 100644
+index 93c0509..31ea94d 100644
 --- a/Makefile.am
 +++ b/Makefile.am
-@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
- 	-DKEXEC=\"$(KEXEC)\" \
- 	-DLIBDIR=\"$(libdir)\" \
+@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
  	-DROOTLIBDIR=\"$(rootlibdir)\" \
-+	-DROOTHOMEDIR=\"$(roothomedir)\" \
+ 	-DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
  	-DTEST_DIR=\"$(abs_top_srcdir)/test\" \
++	-DROOTHOMEDIR=\"$(roothomedir)\" \
  	-I $(top_srcdir)/src \
  	-I $(top_builddir)/src/shared \
-@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
+ 	-I $(top_srcdir)/src/shared \
+@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
  substitutions = \
         '|rootlibexecdir=$(rootlibexecdir)|' \
         '|rootbindir=$(rootbindir)|' \
@@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
         '|SYSTEMCTL=$(rootbindir)/systemctl|' \
         '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
 diff --git a/configure.ac b/configure.ac
-index a5b2e6e..55bb7d8 100644
+index 01ee8dc..800a587 100644
 --- a/configure.ac
 +++ b/configure.ac
-@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
+@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
          [],
          [with_rootlibdir=${libdir}])
  
@@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
  AC_ARG_WITH([pamlibdir],
          AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
          [],
-@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
+@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
  AC_SUBST([pamconfdir], [$with_pamconfdir])
  AC_SUBST([rootprefix], [$with_rootprefix])
  AC_SUBST([rootlibdir], [$with_rootlibdir])
@@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
  
  AC_CONFIG_FILES([
          Makefile po/Makefile.in
-@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
+@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
          include_prefix:          ${INCLUDE_PREFIX}
          lib dir:                 ${libdir}
          rootlib dir:             ${with_rootlibdir}
@@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
          SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
          Build Python:            ${PYTHON}
 diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
-index 97135db..14d12f1 100644
+index 7736899..ac5f008 100644
 --- a/src/core/unit-printf.c
 +++ b/src/core/unit-printf.c
-@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
+@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
                   * best of it if we can, but fail if we can't */
  
                  if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
@@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
                          return -ENOTSUP;
  
 diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
-index b597edb..0b32673 100644
+index 08bfdcf..b44b4cd 100644
 --- a/src/nspawn/nspawn.c
 +++ b/src/nspawn/nspawn.c
-@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
+@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
+                         r = change_uid_gid(&home);
                          if (r < 0)
                                  _exit(EXIT_FAILURE);
- 
+-
 -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
 +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
                              (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
                              (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
                                  log_oom();
-@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
-                                 execvp(argv[optind], argv + optind);
- #endif /* HAVE_EXECVPE */
+@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
+                         } else if (argc > optind)
+                                 execvpe(argv[optind], argv + optind, env_use);
                          else {
 -                                chdir(home ? home : "/root");
 +                                chdir(home ? home : ROOTHOMEDIR);
@@ -110,10 +110,10 @@ index b597edb..0b32673 100644
                                  execle("/bin/sh", "-sh", NULL, env_use);
                          }
 diff --git a/src/shared/util.c b/src/shared/util.c
-index cbbe3b1..a0e3cc5 100644
+index 241e752..00adab6 100644
 --- a/src/shared/util.c
 +++ b/src/shared/util.c
-@@ -4609,7 +4609,7 @@ int get_user_creds(
+@@ -4604,7 +4604,7 @@ int get_user_creds(
                          *gid = 0;
  
                  if (home)
@@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
  
                  if (shell)
                          *shell = "/bin/sh";
-@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
+@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
          /* Hardcode home directory for root to avoid NSS */
          u = getuid();
          if (u == 0) {
@@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
                  if (!h)
                          return -ENOMEM;
  
-diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
-index 5c80722..efde5f0 100644
---- a/units/console-shell.service.m4.in
-+++ b/units/console-shell.service.m4.in
-@@ -15,8 +15,8 @@ After=rc-local.service
- Before=getty.target
- 
- [Service]
--Environment=HOME=/root
--WorkingDirectory=/root
-+Environment=HOME=@roothomedir@
-+WorkingDirectory=@roothomedir@
- ExecStart=-@SULOGIN@
- ExecStopPost=-@SYSTEMCTL@ poweroff
- Type=idle
 diff --git a/units/emergency.service.in b/units/emergency.service.in
 index 2695d7b..7f47b73 100644
 --- a/units/emergency.service.in
@@ -177,5 +162,5 @@ index de73fee..47f3593 100644
  ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
  ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
 -- 
-2.1.4
+1.9.1
 
diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
new file mode 100644
index 0000000..1e4a69d
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
@@ -0,0 +1,37 @@
+From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
+From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
+Date: Tue, 24 Feb 2015 20:40:07 +0100
+Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
+
+CID#1271344/1271345
+
+(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
+---
+ src/shared/acl-util.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
+index cbe09d7..e67e9ac 100644
+--- a/src/shared/acl-util.c
++++ b/src/shared/acl-util.c
+@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
+                 /* can have only one of those */
+                 return true;
+         case ACL_USER: {
+-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
+ 
+                 uid_a = acl_get_qualifier(a);
+                 if (!uid_a)
+@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
+                 return *uid_a == *uid_b;
+         }
+         case ACL_GROUP: {
+-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
+ 
+                 gid_a = acl_get_qualifier(a);
+                 if (!gid_a)
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
new file mode 100644
index 0000000..dca5e20
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
@@ -0,0 +1,28 @@
+From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
+From: Aaro Koskinen <aaro.koskinen@nokia.com>
+Date: Tue, 24 Feb 2015 18:32:31 +0200
+Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
+
+If we have less samples than expected, systemd-bootchart will crash.
+
+(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
+---
+ src/bootchart/svg.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
+index e111fa9..144177c 100644
+--- a/src/bootchart/svg.c
++++ b/src/bootchart/svg.c
+@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
+ 
+                 ps->sample = ps->sample->next;
+                 sample_hz = ps->sample;
+-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
+                         sample_hz = sample_hz->next;
+ 
+                 /* subtract bootchart cpu utilization from total */
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
new file mode 100644
index 0000000..e0cb193
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
@@ -0,0 +1,38 @@
+From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
+From: Aaro Koskinen <aaro.koskinen@nokia.com>
+Date: Mon, 23 Feb 2015 16:01:31 +0200
+Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
+
+Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
+(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
+syscalls getrandom and memfd_create").
+
+(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
+---
+ src/shared/missing.h | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/src/shared/missing.h b/src/shared/missing.h
+index b33a70c..e72631e 100644
+--- a/src/shared/missing.h
++++ b/src/shared/missing.h
+@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
+ #    define __NR_getrandom 349
+ #  elif defined(__powerpc__)
+ #    define __NR_getrandom 359
++#  elif defined _MIPS_SIM
++#    if _MIPS_SIM == _MIPS_SIM_ABI32
++#      define __NR_getrandom 4353
++#    endif
++#    if _MIPS_SIM == _MIPS_SIM_NABI32
++#      define __NR_getrandom 6317
++#    endif
++#    if _MIPS_SIM == _MIPS_SIM_ABI64
++#      define __NR_getrandom 5313
++#    endif
+ #  else
+ #    warning "__NR_getrandom unknown for your architecture"
+ #    define __NR_getrandom 0xffffffff
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
new file mode 100644
index 0000000..1b842a2
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
@@ -0,0 +1,33 @@
+From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart@poettering.net>
+Date: Wed, 25 Feb 2015 22:05:14 +0100
+Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
+ units in --user mode
+
+When running in user mode unmounting of mount units when a device
+vanishes is unlikely to work, and even if it would work is already done
+by PID 1 anyway. HEnce, when creating implicit dependencies between
+mount units and their backing devices, created a Wants= type dependency
+in --user mode, but leave a BindsTo= dependency in --system mode.
+
+(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
+---
+ src/core/unit.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/core/unit.c b/src/core/unit.c
+index ee8e607..9f1e55e 100644
+--- a/src/core/unit.c
++++ b/src/core/unit.c
+@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
+         if (r < 0)
+                 return r;
+ 
+-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
+         if (r < 0)
+                 return r;
+ 
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
new file mode 100644
index 0000000..92c4b8f
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
@@ -0,0 +1,43 @@
+From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
+From: Colin Walters <walters@verbum.org>
+Date: Tue, 17 Feb 2015 13:47:34 -0500
+Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
+ caused it
+
+I'm trying to track down a relatively recent change in systemd
+which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
+
+Systemd started to stop sysroot.mount, and this patch should help
+me debug why at least.
+
+While we're here, "break" on the first unit we find that will
+deactivate, as there's no point in further iteration.
+
+(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
+---
+ src/core/unit.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/core/unit.c b/src/core/unit.c
+index 9f1e55e..563f6fe 100644
+--- a/src/core/unit.c
++++ b/src/core/unit.c
+@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
+                         continue;
+ 
+                 stop = true;
++                break;
+         }
+ 
+         if (!stop)
+                 return;
+ 
+-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
++        assert(other);
++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
+ 
+         /* A unit we need to run is gone. Sniff. Let's stop this. */
+         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
new file mode 100644
index 0000000..46c25bd
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
@@ -0,0 +1,30 @@
+From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
+Date: Thu, 26 Feb 2015 19:00:11 -0500
+Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
+ debug
+
+Printing it at info level was tedious. We don't do that for any other
+overrides.
+
+(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
+---
+ src/sysctl/sysctl.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
+index 275a5b7..2415d84 100644
+--- a/src/sysctl/sysctl.c
++++ b/src/sysctl/sysctl.c
+@@ -176,7 +176,7 @@ found:
+                         if (streq(value, existing))
+                                 continue;
+ 
+-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
+                         free(hashmap_remove(sysctl_options, p));
+                         free(v);
+                 }
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
new file mode 100644
index 0000000..87dce1f
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
@@ -0,0 +1,39 @@
+From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
+Date: Thu, 26 Feb 2015 19:05:51 -0500
+Subject: [PATCH 16/26] sysctl: add some hints how to override settings
+
+Also a link to decent documentation for sysrq keys. It is surprising
+hard to find.
+
+https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
+(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
+---
+ sysctl.d/50-default.conf | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
+index f189233..def151b 100644
+--- a/sysctl.d/50-default.conf
++++ b/sysctl.d/50-default.conf
+@@ -5,9 +5,16 @@
+ #  the Free Software Foundation; either version 2.1 of the License, or
+ #  (at your option) any later version.
+ 
+-# See sysctl.d(5) and core(5) for for details.
++# See sysctl.d(5) and core(5) for for documentation.
++
++# To override settings in this file, create a local file in /etc
++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
++# there.
+ 
+ # System Request functionality of the kernel (SYNC)
++#
++# Use kernel.sysrq = 1 to allow all keys.
++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
+ kernel.sysrq = 16
+ 
+ # Append the PID to the core filename
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
new file mode 100644
index 0000000..a3ab3e4
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
@@ -0,0 +1,912 @@
+From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart@poettering.net>
+Date: Fri, 27 Feb 2015 21:55:08 +0100
+Subject: [PATCH 17/26] core: rework device state logic
+
+This change introduces a new state "tentative" for device units. Device
+units are considered "plugged" when udev announced them, "dead" when
+they are not available in the kernel, and "tentative" when they are
+referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
+announced via udev.
+
+This should fix a race when device nodes (like loop devices) are created
+and immediately mounted. Previously, systemd might end up seeing the
+mount unit before the device, and would thus pull down the mount because
+its BindTo dependency on the device would not be fulfilled.
+
+(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
+---
+ src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
+ src/core/device.h |  14 ++-
+ src/core/mount.c  |  46 ++++---
+ src/core/swap.c   |  32 +++--
+ src/core/swap.h   |   4 +-
+ src/core/unit.c   |   1 -
+ 6 files changed, 285 insertions(+), 180 deletions(-)
+
+diff --git a/src/core/device.c b/src/core/device.c
+index d3deac3..75b9a46 100644
+--- a/src/core/device.c
++++ b/src/core/device.c
+@@ -36,7 +36,8 @@
+ 
+ static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
+         [DEVICE_DEAD] = UNIT_INACTIVE,
+-        [DEVICE_PLUGGED] = UNIT_ACTIVE
++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
+ };
+ 
+ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
+@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
+         d->sysfs = NULL;
+ }
+ 
++static int device_set_sysfs(Device *d, const char *sysfs) {
++        Device *first;
++        char *copy;
++        int r;
++
++        assert(d);
++
++        if (streq_ptr(d->sysfs, sysfs))
++                return 0;
++
++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
++        if (r < 0)
++                return r;
++
++        copy = strdup(sysfs);
++        if (!copy)
++                return -ENOMEM;
++
++        device_unset_sysfs(d);
++
++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
++        LIST_PREPEND(same_sysfs, first, d);
++
++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
++        if (r < 0) {
++                LIST_REMOVE(same_sysfs, first, d);
++                free(copy);
++                return r;
++        }
++
++        d->sysfs = copy;
++
++        return 0;
++}
++
+ static void device_init(Unit *u) {
+         Device *d = DEVICE(u);
+ 
+@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
+         assert(d);
+         assert(d->state == DEVICE_DEAD);
+ 
+-        if (d->sysfs)
++        if (d->found & DEVICE_FOUND_UDEV)
++                /* If udev says the device is around, it's around */
+                 device_set_state(d, DEVICE_PLUGGED);
++        else if (d->found != DEVICE_NOT_FOUND)
++                /* If a device is found in /proc/self/mountinfo or
++                 * /proc/swaps, it's "tentatively" around. */
++                device_set_state(d, DEVICE_TENTATIVE);
+ 
+         return 0;
+ }
+@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
+         return device_state_to_string(DEVICE(u)->state);
+ }
+ 
+-static int device_add_escaped_name(Unit *u, const char *dn) {
+-        _cleanup_free_ char *e = NULL;
+-        int r;
+-
+-        assert(u);
+-        assert(dn);
+-        assert(dn[0] == '/');
+-
+-        e = unit_name_from_path(dn, ".device");
+-        if (!e)
+-                return -ENOMEM;
+-
+-        r = unit_add_name(u, e);
+-        if (r < 0 && r != -EEXIST)
+-                return r;
+-
+-        return 0;
+-}
+-
+-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
+-        _cleanup_free_ char *e = NULL;
+-        Unit *u;
+-
+-        assert(m);
+-        assert(dn);
+-        assert(dn[0] == '/');
+-        assert(_u);
+-
+-        e = unit_name_from_path(dn, ".device");
+-        if (!e)
+-                return -ENOMEM;
+-
+-        u = manager_get_unit(m, e);
+-        if (u) {
+-                *_u = u;
+-                return 1;
+-        }
+-
+-        return 0;
+-}
+-
+-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
+         const char *model;
++        int r;
+ 
+         assert(u);
+         assert(dev);
+@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
+ 
+                         j = strjoin(model, " ", label, NULL);
+                         if (j)
+-                                return unit_set_description(u, j);
+-                }
++                                r = unit_set_description(u, j);
++                } else
++                        r = unit_set_description(u, model);
++        } else
++                r = unit_set_description(u, path);
+ 
+-                return unit_set_description(u, model);
+-        }
++        if (r < 0)
++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
+ 
+-        return unit_set_description(u, path);
++        return r;
+ }
+ 
+ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
+@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
+ 
+                 n = unit_name_mangle(e, MANGLE_NOGLOB);
+                 if (!n)
+-                        return -ENOMEM;
++                        return log_oom();
+ 
+                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
+                 if (r < 0)
+-                        return r;
++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
+         }
+         if (!isempty(state))
+-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
+-                                 property, strna(udev_device_get_syspath(dev)));
++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
+ 
+         return 0;
+ }
+ 
+-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
++        _cleanup_free_ char *e = NULL;
+         const char *sysfs;
+         Unit *u = NULL;
+         bool delete;
+@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
+         if (!sysfs)
+                 return 0;
+ 
+-        r = device_find_escape_name(m, path, &u);
+-        if (r < 0)
+-                return r;
++        e = unit_name_from_path(path, ".device");
++        if (!e)
++                return log_oom();
++
++        u = manager_get_unit(m, e);
+ 
+-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
++        if (u &&
++            DEVICE(u)->sysfs &&
++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
+                 return -EEXIST;
++        }
+ 
+         if (!u) {
+                 delete = true;
+@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
+                 if (!u)
+                         return log_oom();
+ 
+-                r = device_add_escaped_name(u, path);
++                r = unit_add_name(u, e);
+                 if (r < 0)
+                         goto fail;
+ 
+@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
+          * actually been seen yet ->sysfs will not be
+          * initialized. Hence initialize it if necessary. */
+ 
+-        if (!DEVICE(u)->sysfs) {
+-                Device *first;
+-
+-                DEVICE(u)->sysfs = strdup(sysfs);
+-                if (!DEVICE(u)->sysfs) {
+-                        r = -ENOMEM;
+-                        goto fail;
+-                }
+-
+-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
+-                if (r < 0)
+-                        goto fail;
+-
+-                first = hashmap_get(m->devices_by_sysfs, sysfs);
+-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
+-
+-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
+-                if (r < 0)
+-                        goto fail;
+-        }
+-
+-        device_make_description(u, dev, path);
++        r = device_set_sysfs(DEVICE(u), sysfs);
++        if (r < 0)
++                goto fail;
+ 
+-        if (main) {
+-                /* The additional systemd udev properties we only
+-                 * interpret for the main object */
++        (void) device_update_description(u, dev, path);
+ 
+-                r = device_add_udev_wants(u, dev);
+-                if (r < 0)
+-                        goto fail;
+-        }
++        /* The additional systemd udev properties we only interpret
++         * for the main object */
++        if (main)
++                (void) device_add_udev_wants(u, dev);
+ 
+         /* Note that this won't dispatch the load queue, the caller
+          * has to do that if needed and appropriate */
+@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
+         return 0;
+ 
+ fail:
+-        log_warning_errno(r, "Failed to load device unit: %m");
++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
+ 
+         if (delete && u)
+                 unit_free(u);
+@@ -342,7 +331,7 @@ fail:
+         return r;
+ }
+ 
+-static int device_process_new_device(Manager *m, struct udev_device *dev) {
++static int device_process_new(Manager *m, struct udev_device *dev) {
+         const char *sysfs, *dn, *alias;
+         struct udev_list_entry *item = NULL, *first = NULL;
+         int r;
+@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
+                 return 0;
+ 
+         /* Add the main unit named after the sysfs path */
+-        r = device_update_unit(m, dev, sysfs, true);
++        r = device_setup_unit(m, dev, sysfs, true);
+         if (r < 0)
+                 return r;
+ 
+         /* Add an additional unit for the device node */
+         dn = udev_device_get_devnode(dev);
+         if (dn)
+-                device_update_unit(m, dev, dn, false);
++                (void) device_setup_unit(m, dev, dn, false);
+ 
+         /* Add additional units for all symlinks */
+         first = udev_device_get_devlinks_list_entry(dev);
+@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
+                             st.st_rdev != udev_device_get_devnum(dev))
+                                 continue;
+ 
+-                device_update_unit(m, dev, p, false);
++                (void) device_setup_unit(m, dev, p, false);
+         }
+ 
+         /* Add additional units for all explicitly configured
+@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
+                         e[l] = 0;
+ 
+                         if (path_is_absolute(e))
+-                                device_update_unit(m, dev, e, false);
++                                (void) device_setup_unit(m, dev, e, false);
+                         else
+                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
+                 }
+@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
+         return 0;
+ }
+ 
+-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
+-        const char *sysfs;
++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
++        DeviceFound n;
++
++        assert(d);
++
++        n = add ? (d->found | found) : (d->found & ~found);
++        if (n == d->found)
++                return;
++
++        d->found = n;
++
++        if (now) {
++                if (d->found & DEVICE_FOUND_UDEV)
++                        device_set_state(d, DEVICE_PLUGGED);
++                else if (d->found != DEVICE_NOT_FOUND)
++                        device_set_state(d, DEVICE_TENTATIVE);
++                else
++                        device_set_state(d, DEVICE_DEAD);
++        }
++}
++
++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
+         Device *d, *l;
+ 
+         assert(m);
+-        assert(dev);
++        assert(sysfs);
+ 
+-        sysfs = udev_device_get_syspath(dev);
+-        if (!sysfs)
+-                return;
++        if (found == DEVICE_NOT_FOUND)
++                return 0;
+ 
+         l = hashmap_get(m->devices_by_sysfs, sysfs);
+         LIST_FOREACH(same_sysfs, d, l)
+-                device_set_state(d, DEVICE_PLUGGED);
++                device_update_found_one(d, add, found, now);
++
++        return 0;
+ }
+ 
+-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
+-        const char *sysfs;
+-        Device *d;
++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
++        _cleanup_free_ char *e = NULL;
++        Unit *u;
+ 
+         assert(m);
+-        assert(dev);
++        assert(path);
+ 
+-        sysfs = udev_device_get_syspath(dev);
+-        if (!sysfs)
+-                return -ENOMEM;
++        if (found == DEVICE_NOT_FOUND)
++                return 0;
+ 
+-        /* Remove all units of this sysfs path */
+-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
+-                device_unset_sysfs(d);
+-                device_set_state(d, DEVICE_DEAD);
+-        }
++        e = unit_name_from_path(path, ".device");
++        if (!e)
++                return log_oom();
+ 
++        u = manager_get_unit(m, e);
++        if (!u)
++                return 0;
++
++        device_update_found_one(DEVICE(u), add, found, now);
+         return 0;
+ }
+ 
+@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
+         return parse_boolean(ready) != 0;
+ }
+ 
+-static int device_process_new_path(Manager *m, const char *path) {
+-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
+-
+-        assert(m);
+-        assert(path);
+-
+-        dev = udev_device_new_from_syspath(m->udev, path);
+-        if (!dev)
+-                return log_oom();
+-
+-        if (!device_is_ready(dev))
+-                return 0;
+-
+-        return device_process_new_device(m, dev);
+-}
+-
+ static Unit *device_following(Unit *u) {
+         Device *d = DEVICE(u);
+         Device *other, *first = NULL;
+@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
+                 goto fail;
+ 
+         first = udev_enumerate_get_list_entry(e);
+-        udev_list_entry_foreach(item, first)
+-                device_process_new_path(m, udev_list_entry_get_name(item));
++        udev_list_entry_foreach(item, first) {
++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
++                const char *sysfs;
++
++                sysfs = udev_list_entry_get_name(item);
++
++                dev = udev_device_new_from_syspath(m->udev, sysfs);
++                if (!dev) {
++                        log_oom();
++                        continue;
++                }
++
++                if (!device_is_ready(dev))
++                        continue;
++
++                (void) device_process_new(m, dev);
++
++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
++        }
+ 
+         return 0;
+ 
+ fail:
++        log_error_errno(r, "Failed to enumerate devices: %m");
++
+         device_shutdown(m);
+         return r;
+ }
+@@ -619,7 +634,7 @@ fail:
+ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
+         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
+         Manager *m = userdata;
+-        const char *action;
++        const char *action, *sysfs;
+         int r;
+ 
+         assert(m);
+@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
+         if (!dev)
+                 return 0;
+ 
++        sysfs = udev_device_get_syspath(dev);
++        if (!sysfs) {
++                log_error("Failed to get udev sys path.");
++                return 0;
++        }
++
+         action = udev_device_get_action(dev);
+         if (!action) {
+                 log_error("Failed to get udev action string.");
+                 return 0;
+         }
+ 
+-        if (streq(action, "remove") || !device_is_ready(dev))  {
+-                r = device_process_removed_device(m, dev);
+-                if (r < 0)
+-                        log_error_errno(r, "Failed to process device remove event: %m");
+-
+-                r = swap_process_removed_device(m, dev);
++        if (streq(action, "remove"))  {
++                r = swap_process_device_remove(m, dev);
+                 if (r < 0)
+                         log_error_errno(r, "Failed to process swap device remove event: %m");
+ 
+-        } else {
+-                r = device_process_new_device(m, dev);
+-                if (r < 0)
+-                        log_error_errno(r, "Failed to process device new event: %m");
++                /* If we get notified that a device was removed by
++                 * udev, then it's completely gone, hence unset all
++                 * found bits */
++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
+ 
+-                r = swap_process_new_device(m, dev);
++        } else if (device_is_ready(dev)) {
++
++                (void) device_process_new(m, dev);
++
++                r = swap_process_device_new(m, dev);
+                 if (r < 0)
+                         log_error_errno(r, "Failed to process swap device new event: %m");
+ 
+                 manager_dispatch_load_queue(m);
+ 
+-                device_set_path_plugged(m, dev);
++                /* The device is found now, set the udev found bit */
++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
++
++        } else {
++                /* The device is nominally around, but not ready for
++                 * us. Hence unset the udev bit, but leave the rest
++                 * around. */
++
++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
+         }
+ 
+         return 0;
+@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
+         return read_only <= 0;
+ }
+ 
++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
++        struct stat st;
++
++        assert(m);
++        assert(node);
++
++        /* This is called whenever we find a device referenced in
++         * /proc/swaps or /proc/self/mounts. Such a device might be
++         * mounted/enabled at a time where udev has not finished
++         * probing it yet, and we thus haven't learned about it
++         * yet. In this case we will set the device unit to
++         * "tentative" state. */
++
++        if (add) {
++                if (!path_startswith(node, "/dev"))
++                        return 0;
++
++                if (stat(node, &st) < 0) {
++                        if (errno == ENOENT)
++                                return 0;
++
++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
++                }
++
++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
++                        return 0;
++
++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
++                if (!dev) {
++                        if (errno == ENOENT)
++                                return 0;
++
++                        return log_oom();
++                }
++
++                /* If the device is known in the kernel and newly
++                 * appeared, then we'll create a device unit for it,
++                 * under the name referenced in /proc/swaps or
++                 * /proc/self/mountinfo. */
++
++                (void) device_setup_unit(m, dev, node, false);
++        }
++
++        /* Update the device unit's state, should it exist */
++        return device_update_found_by_name(m, node, add, found, now);
++}
++
+ static const char* const device_state_table[_DEVICE_STATE_MAX] = {
+         [DEVICE_DEAD] = "dead",
+-        [DEVICE_PLUGGED] = "plugged"
++        [DEVICE_TENTATIVE] = "tentative",
++        [DEVICE_PLUGGED] = "plugged",
+ };
+ 
+ DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
+diff --git a/src/core/device.h b/src/core/device.h
+index bb7ae07..0609b20 100644
+--- a/src/core/device.h
++++ b/src/core/device.h
+@@ -29,20 +29,28 @@ typedef struct Device Device;
+  * simplifies the state engine greatly */
+ typedef enum DeviceState {
+         DEVICE_DEAD,
+-        DEVICE_PLUGGED,
++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
++        DEVICE_PLUGGED,   /* announced by udev */
+         _DEVICE_STATE_MAX,
+         _DEVICE_STATE_INVALID = -1
+ } DeviceState;
+ 
++typedef enum DeviceFound {
++        DEVICE_NOT_FOUND = 0,
++        DEVICE_FOUND_UDEV = 1,
++        DEVICE_FOUND_MOUNT = 2,
++        DEVICE_FOUND_SWAP = 4,
++} DeviceFound;
++
+ struct Device {
+         Unit meta;
+ 
+         char *sysfs;
++        DeviceFound found;
+ 
+         /* In order to be able to distinguish dependencies on
+         different device nodes we might end up creating multiple
+         devices for the same sysfs path. We chain them up here. */
+-
+         LIST_FIELDS(struct Device, same_sysfs);
+ 
+         DeviceState state;
+@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
+ 
+ const char* device_state_to_string(DeviceState i) _const_;
+ DeviceState device_state_from_string(const char *s) _pure_;
++
++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
+diff --git a/src/core/mount.c b/src/core/mount.c
+index f3977e6..c971330 100644
+--- a/src/core/mount.c
++++ b/src/core/mount.c
+@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
+         return 0;
+ }
+ 
+-static int mount_add_one(
++static int mount_setup_unit(
+                 Manager *m,
+                 const char *what,
+                 const char *where,
+@@ -1434,7 +1434,7 @@ static int mount_add_one(
+ 
+                 u = unit_new(m, sizeof(Mount));
+                 if (!u)
+-                        return -ENOMEM;
++                        return log_oom();
+ 
+                 r = unit_add_name(u, e);
+                 if (r < 0)
+@@ -1547,6 +1547,8 @@ static int mount_add_one(
+         return 0;
+ 
+ fail:
++        log_warning_errno(r, "Failed to set up mount unit: %m");
++
+         if (delete && u)
+                 unit_free(u);
+ 
+@@ -1554,33 +1556,36 @@ fail:
+ }
+ 
+ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
+-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
+-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
+-        struct libmnt_fs *fs;
++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
+         int r = 0;
+ 
+         assert(m);
+ 
+-        tb = mnt_new_table();
+-        itr = mnt_new_iter(MNT_ITER_FORWARD);
+-        if (!tb || !itr)
++        t = mnt_new_table();
++        if (!t)
+                 return log_oom();
+ 
+-        r = mnt_table_parse_mtab(tb, NULL);
++        i = mnt_new_iter(MNT_ITER_FORWARD);
++        if (!i)
++                return log_oom();
++
++        r = mnt_table_parse_mtab(t, NULL);
+         if (r < 0)
+-                return r;
++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
+ 
+         r = 0;
+         for (;;) {
+                 const char *device, *path, *options, *fstype;
+                 _cleanup_free_ const char *d = NULL, *p = NULL;
++                struct libmnt_fs *fs;
+                 int k;
+ 
+-                k = mnt_table_next_fs(tb, itr, &fs);
++                k = mnt_table_next_fs(t, i, &fs);
+                 if (k == 1)
+                         break;
+-                else if (k < 0)
+-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
++                if (k < 0)
++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
+ 
+                 device = mnt_fs_get_source(fs);
+                 path = mnt_fs_get_target(fs);
+@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
+                 fstype = mnt_fs_get_fstype(fs);
+ 
+                 d = cunescape(device);
++                if (!d)
++                        return log_oom();
++
+                 p = cunescape(path);
+-                if (!d || !p)
++                if (!p)
+                         return log_oom();
+ 
+-                k = mount_add_one(m, d, p, options, fstype, set_flags);
++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
++
++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
+                 if (r == 0 && k < 0)
+                         r = k;
+         }
+@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
+ 
+         r = mount_load_proc_self_mountinfo(m, true);
+         if (r < 0) {
+-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
+-
+                 /* Reset flags, just in case, for later calls */
+                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
+                         Mount *mount = MOUNT(u);
+@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
+                                 break;
+                         }
+ 
++                        if (mount->parameters_proc_self_mountinfo.what)
++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
++
++
+                 } else if (mount->just_mounted || mount->just_changed) {
+ 
+                         /* New or changed mount entry */
+diff --git a/src/core/swap.c b/src/core/swap.c
+index 6997921..5c19af5 100644
+--- a/src/core/swap.c
++++ b/src/core/swap.c
+@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
+         return swap_verify(s);
+ }
+ 
+-static int swap_add_one(
++static int swap_setup_unit(
+                 Manager *m,
+                 const char *what,
+                 const char *what_proc_swaps,
+@@ -363,8 +363,10 @@ static int swap_add_one(
+ 
+         if (u &&
+             SWAP(u)->from_proc_swaps &&
+-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
+                 return -EEXIST;
++        }
+ 
+         if (!u) {
+                 delete = true;
+@@ -379,7 +381,7 @@ static int swap_add_one(
+ 
+                 SWAP(u)->what = strdup(what);
+                 if (!SWAP(u)->what) {
+-                        r = log_oom();
++                        r = -ENOMEM;
+                         goto fail;
+                 }
+ 
+@@ -407,7 +409,6 @@ static int swap_add_one(
+         p->priority = priority;
+ 
+         unit_add_to_dbus_queue(u);
+-
+         return 0;
+ 
+ fail:
+@@ -419,7 +420,7 @@ fail:
+         return r;
+ }
+ 
+-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
+         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
+         struct udev_list_entry *item = NULL, *first = NULL;
+         const char *dn;
+@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
+ 
+         assert(m);
+ 
+-        r = swap_add_one(m, device, device, prio, set_flags);
++        r = swap_setup_unit(m, device, device, prio, set_flags);
+         if (r < 0)
+                 return r;
+ 
+@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
+         /* Add the main device node */
+         dn = udev_device_get_devnode(d);
+         if (dn && !streq(dn, device))
+-                swap_add_one(m, dn, device, prio, set_flags);
++                swap_setup_unit(m, dn, device, prio, set_flags);
+ 
+         /* Add additional units for all symlinks */
+         first = udev_device_get_devlinks_list_entry(d);
+@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
+                             st.st_rdev != udev_device_get_devnum(d))
+                                 continue;
+ 
+-                swap_add_one(m, p, device, prio, set_flags);
++                swap_setup_unit(m, p, device, prio, set_flags);
+         }
+ 
+         return r;
+@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
+                         if (k == EOF)
+                                 break;
+ 
+-                        log_warning("Failed to parse /proc/swaps:%u", i);
++                        log_warning("Failed to parse /proc/swaps:%u.", i);
+                         continue;
+                 }
+ 
+                 d = cunescape(dev);
+                 if (!d)
+-                        return -ENOMEM;
++                        return log_oom();
++
++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
+ 
+-                k = swap_process_new_swap(m, d, prio, set_flags);
++                k = swap_process_new(m, d, prio, set_flags);
+                 if (k < 0)
+                         r = k;
+         }
+@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
+                                 break;
+                         }
+ 
++                        if (swap->what)
++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
++
+                 } else if (swap->just_activated) {
+ 
+                         /* New swap entry */
+@@ -1298,7 +1304,7 @@ fail:
+         return r;
+ }
+ 
+-int swap_process_new_device(Manager *m, struct udev_device *dev) {
++int swap_process_device_new(Manager *m, struct udev_device *dev) {
+         struct udev_list_entry *item = NULL, *first = NULL;
+         _cleanup_free_ char *e = NULL;
+         const char *dn;
+@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
+         return r;
+ }
+ 
+-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
+         const char *dn;
+         int r = 0;
+         Swap *s;
+diff --git a/src/core/swap.h b/src/core/swap.h
+index 73e64d8..914a2db 100644
+--- a/src/core/swap.h
++++ b/src/core/swap.h
+@@ -116,8 +116,8 @@ struct Swap {
+ 
+ extern const UnitVTable swap_vtable;
+ 
+-int swap_process_new_device(Manager *m, struct udev_device *dev);
+-int swap_process_removed_device(Manager *m, struct udev_device *dev);
++int swap_process_device_new(Manager *m, struct udev_device *dev);
++int swap_process_device_remove(Manager *m, struct udev_device *dev);
+ 
+ const char* swap_state_to_string(SwapState i) _const_;
+ SwapState swap_state_from_string(const char *s) _pure_;
+diff --git a/src/core/unit.c b/src/core/unit.c
+index 563f6fe..a6558ee 100644
+--- a/src/core/unit.c
++++ b/src/core/unit.c
+@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
+                 return -ENOMEM;
+ 
+         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
+-
+         if (r < 0)
+                 return r;
+ 
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
new file mode 100644
index 0000000..d614085
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
@@ -0,0 +1,26 @@
+From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
+From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
+Date: Sat, 28 Feb 2015 23:39:55 +0100
+Subject: [PATCH 18/26] core: fix return value on OOM
+
+(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
+---
+ src/core/device.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/core/device.c b/src/core/device.c
+index 75b9a46..1cc103c 100644
+--- a/src/core/device.c
++++ b/src/core/device.c
+@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
+                         j = strjoin(model, " ", label, NULL);
+                         if (j)
+                                 r = unit_set_description(u, j);
++                        else
++                                r = -ENOMEM;
+                 } else
+                         r = unit_set_description(u, model);
+         } else
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
new file mode 100644
index 0000000..d94da60
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
@@ -0,0 +1,33 @@
+From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
+From: Benjamin Franzke <benjaminfranzke@googlemail.com>
+Date: Thu, 19 Feb 2015 20:47:28 +0100
+Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
+ bus on dbus1
+
+This fixes "machinectl login" on systems configured with --disable-kdbus.
+
+The error was:
+machinectl login foo
+Failed to get machine PTY: Input/output error
+
+(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
+---
+ src/machine/machine-dbus.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
+index b46f0a8..b0f0f66 100644
+--- a/src/machine/machine-dbus.c
++++ b/src/machine/machine-dbus.c
+@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
+ #ifdef ENABLE_KDBUS
+         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
+ #else
+-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
+ #endif
+         if (!container_bus->address)
+                 return -ENOMEM;
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
new file mode 100644
index 0000000..fcc2adf
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
@@ -0,0 +1,25 @@
+From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
+Date: Fri, 20 Feb 2015 15:35:11 -0300
+Subject: [PATCH 20/26] shared: AFS is also a network filesystem
+
+(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
+---
+ src/shared/util.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/shared/util.c b/src/shared/util.c
+index ba035ca..f24b5b4 100644
+--- a/src/shared/util.c
++++ b/src/shared/util.c
+@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
+ 
+ bool fstype_is_network(const char *fstype) {
+         static const char table[] =
++                "afs\0"
+                 "cifs\0"
+                 "smbfs\0"
+                 "sshfs\0"
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
new file mode 100644
index 0000000..02e279d
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
@@ -0,0 +1,31 @@
+From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
+From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
+Date: Fri, 20 Feb 2015 10:53:28 +0100
+Subject: [PATCH 21/26] core: downgrade unit type not supported message
+
+Otherwise every daemon reload prints out warnings like:
+
+systemd[1]: Unit type .busname is not supported on this system.
+systemd[1]: Unit type .swap is not supported on this system.
+
+(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
+---
+ src/core/manager.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/core/manager.c b/src/core/manager.c
+index 4775219..bc9b7ec 100644
+--- a/src/core/manager.c
++++ b/src/core/manager.c
+@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
+                 int q;
+ 
+                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
+-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
+                         continue;
+                 }
+ 
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
new file mode 100644
index 0000000..f5afd09
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
@@ -0,0 +1,97 @@
+From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
+Date: Mon, 2 Mar 2015 10:34:51 -0500
+Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
+
+Binary fields were not processed properly, and resulting journal files
+were non-conforming, resulting in an error ("Invalid field.") when reading.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=89391
+(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
+---
+ src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
+ src/journal-remote/journal-remote-parse.h |  4 +++-
+ 2 files changed, 21 insertions(+), 14 deletions(-)
+
+diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
+index d9dea8d..afded7e 100644
+--- a/src/journal-remote/journal-remote-parse.c
++++ b/src/journal-remote/journal-remote-parse.c
+@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
+                    LLLLLLLL0011223344...\n
+                 */
+                 sep = memchr(line, '=', n);
+-                if (sep)
++                if (sep) {
+                         /* chomp newline */
+                         n--;
+-                else
++
++                        r = iovw_put(&source->iovw, line, n);
++                        if (r < 0)
++                                return r;
++                } else {
+                         /* replace \n with = */
+                         line[n-1] = '=';
+-                log_trace("Received: %.*s", (int) n, line);
+ 
+-                r = iovw_put(&source->iovw, line, n);
+-                if (r < 0) {
+-                        log_error("Failed to put line in iovect");
+-                        return r;
++                        source->field_len = n;
++                        source->state = STATE_DATA_START;
++
++                        /* we cannot put the field in iovec until we have all data */
+                 }
+ 
+-                if (!sep)
+-                        source->state = STATE_DATA_START;
++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
++
+                 return 0; /* continue */
+         }
+ 
+@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
+ 
+         case STATE_DATA: {
+                 void *data;
++                char *field;
+ 
+                 assert(source->data_size > 0);
+ 
+@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
+ 
+                 assert(data);
+ 
+-                r = iovw_put(&source->iovw, data, source->data_size);
+-                if (r < 0) {
+-                        log_error("failed to put binary buffer in iovect");
++                field = (char*) data - sizeof(uint64_t) - source->field_len;
++                memmove(field + sizeof(uint64_t), field, source->field_len);
++
++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
++                if (r < 0)
+                         return r;
+-                }
+ 
+                 source->state = STATE_DATA_FINISH;
+ 
+diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
+index 8499f4e..22db550 100644
+--- a/src/journal-remote/journal-remote-parse.h
++++ b/src/journal-remote/journal-remote-parse.h
+@@ -42,7 +42,9 @@ typedef struct RemoteSource {
+         size_t offset;     /* offset to the beginning of live data in the buffer */
+         size_t scanned;    /* number of bytes since the beginning of data without a newline */
+         size_t filled;     /* total number of bytes in the buffer */
+-        size_t data_size;  /* size of the binary data chunk being processed */
++
++        size_t field_len;  /* used for binary fields: the field name length */
++        size_t data_size;  /* and the size of the binary data chunk being processed */
+ 
+         struct iovec_wrapper iovw;
+ 
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
new file mode 100644
index 0000000..79e565b
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
@@ -0,0 +1,37 @@
+From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
+Date: Sun, 1 Mar 2015 21:13:10 -0300
+Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
+
+Logs constantly show
+
+systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
+
+This is because ext4 does not support FS_NOCOW_FL.
+
+[zj: fold into one conditional as suggested on the ML and
+     fix (preexisting) r/errno confusion in error message.]
+
+(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
+---
+ src/journal/journal-file.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
+index 2845e05..0f28718 100644
+--- a/src/journal/journal-file.c
++++ b/src/journal/journal-file.c
+@@ -2611,8 +2611,8 @@ int journal_file_open(
+                  * shouldn't be too bad, given that we do our own
+                  * checksumming). */
+                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
+-                if (r < 0)
+-                        log_warning_errno(errno, "Failed to set file attributes: %m");
++                if (r < 0 && r != -ENOTTY)
++                        log_warning_errno(r, "Failed to set file attributes: %m");
+ 
+                 /* Let's attach the creation time to the journal file,
+                  * so that the vacuuming code knows the age of this
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
new file mode 100644
index 0000000..0cf9a0a
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
@@ -0,0 +1,53 @@
+From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart@poettering.net>
+Date: Mon, 2 Mar 2015 20:55:38 +0100
+Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
+ happy
+
+https://bugs.freedesktop.org/show_bug.cgi?id=89379
+(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
+---
+ src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
+index 028c2a7..22a3a53 100644
+--- a/src/libsystemd/sd-daemon/sd-daemon.c
++++ b/src/libsystemd/sd-daemon/sd-daemon.c
+@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
+                 .msg_iovlen = 1,
+                 .msg_name = &sockaddr,
+         };
+-        union {
+-                struct cmsghdr cmsghdr;
+-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
+-                            CMSG_SPACE(sizeof(int) * n_fds)];
+-        } control;
++        struct cmsghdr *control;
+         _cleanup_close_ int fd = -1;
+         struct cmsghdr *cmsg = NULL;
+         const char *e;
+@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
+         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
+                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
+ 
++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
++
+         if (n_fds > 0) {
+-                msghdr.msg_control = &control;
++                msghdr.msg_control = control;
+                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
+ 
+                 cmsg = CMSG_FIRSTHDR(&msghdr);
+@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
+                 try_without_ucred = true;
+                 controllen_without_ucred = msghdr.msg_controllen;
+ 
+-                msghdr.msg_control = &control;
++                msghdr.msg_control = control;
+                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
+ 
+                 if (cmsg)
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
new file mode 100644
index 0000000..6912489
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
@@ -0,0 +1,84 @@
+From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
+From: Hans-Peter Deifel <hpd@hpdeifel.de>
+Date: Tue, 3 Mar 2015 00:35:08 +0100
+Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
+ filesystems
+
+A warning is printed if ACLs cannot be retrieved for any reason other
+than -ENOSYS. For -ENOSYS, debug log is printed.
+
+(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
+---
+ src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
+ 1 file changed, 20 insertions(+), 16 deletions(-)
+
+diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
+index 88ba7e4..187997e 100644
+--- a/src/tmpfiles/tmpfiles.c
++++ b/src/tmpfiles/tmpfiles.c
+@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
+         int r;
+         _cleanup_(acl_free_charpp) char *t = NULL;
+ 
++        /* Returns 0 for success, positive error if already warned,
++         * negative error otherwise. */
++
+         if (modify) {
+                 r = acls_for_file(path, type, acl, &dup);
+                 if (r < 0)
+@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
+ 
+         r = acl_set_file(path, type, dup);
+         if (r < 0)
+-                return log_error_errno(-errno,
+-                                       "Setting %s ACL \"%s\" on %s failed: %m",
+-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
+-                                       strna(t), path);
++                return -log_error_errno(errno,
++                                        "Setting %s ACL \"%s\" on %s failed: %m",
++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
++                                        strna(t), path);
++
+         return 0;
+ }
+ #endif
+ 
+ static int path_set_acls(Item *item, const char *path) {
++        int r = 0;
+ #ifdef HAVE_ACL
+-        int r;
+-
+         assert(item);
+         assert(path);
+ 
+-        if (item->acl_access) {
++        if (item->acl_access)
+                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
+-                if (r < 0)
+-                        return r;
+-        }
+ 
+-        if (item->acl_default) {
++        if (r == 0 && item->acl_default)
+                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
+-                if (r < 0)
+-                        return r;
+-        }
+-#endif
+ 
+-        return 0;
++        if (r > 0)
++                return -r; /* already warned */
++        else if (r == -ENOTSUP) {
++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
++                return 0;
++        } else if (r < 0)
++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
++#endif
++        return r;
+ }
+ 
+ static int write_one_file(Item *i, const char *path) {
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
new file mode 100644
index 0000000..a49a369
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
@@ -0,0 +1,30 @@
+From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
+Date: Tue, 3 Mar 2015 19:07:28 -0500
+Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
+ missing
+
+On s390 (at least) /sys/class/power_supply is not present. We should
+treat this like if this directory was empty, and not an error.
+
+(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
+---
+ src/shared/util.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/shared/util.c b/src/shared/util.c
+index f24b5b4..8548723 100644
+--- a/src/shared/util.c
++++ b/src/shared/util.c
+@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
+ 
+         d = opendir("/sys/class/power_supply");
+         if (!d)
+-                return -errno;
++                return errno == ENOENT ? true : -errno;
+ 
+         for (;;) {
+                 struct dirent *de;
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
index 73b930e..9c20b11 100644
--- a/meta/recipes-core/systemd/systemd_219.bb
+++ b/meta/recipes-core/systemd/systemd_219.bb
@@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
            file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
            file://0010-Make-root-s-home-directory-configurable.patch \
            file://0011-systemd-user-avoid-using-system-auth.patch \
-           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
-           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
            file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
-           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
            file://0014-Revert-rules-remove-firmware-loading-rules.patch \
            file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
            file://tmpfiles-pam.patch \
@@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
 
 S = "${WORKDIR}/git"
 
+# Appending backport fixes released for version 219-stable
+SRC_URI_append = "\
+           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
+           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
+           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
+           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
+           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
+           file://0006-shared-time-util-fix-gcc5-warning.patch \
+           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
+           file://0008-bootchart-fix-default-init-path.patch \
+           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
+           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
+           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
+           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
+           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
+           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
+           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
+           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
+           file://0017-core-rework-device-state-logic.patch \
+           file://0018-core-fix-return-value-on-OOM.patch \
+           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
+           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
+           file://0021-core-downgrade-unit-type-not-supported-message.patch \
+           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
+           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
+           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
+           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
+           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
+           "
+
 SRC_URI_append_libc-uclibc = "\
             file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
            "
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-03-30 18:13 [PATCH] systemd: v219 with stable fixes Bruno Bottazzini
@ 2015-03-30 18:20 ` Bottazzini, Bruno
  2015-03-31 20:21 ` Bottazzini, Bruno
  1 sibling, 0 replies; 12+ messages in thread
From: Bottazzini, Bruno @ 2015-03-30 18:20 UTC (permalink / raw)
  To: Otavio Salvador; +Cc: openembedded-core

Otavio,

Here it is the patch without garbage that I have told you before.

Could you review it ?

Best Regards,

Bruno Bottazzini

On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
> Adding patches that fix bugs for 219 version.
> This will get the same consistency of the stable systemd 219 version.
> 
> More details:
> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
> ---
>  ...remote-fix-certificate-status-memory-leak.patch |  31 +
>  ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
>  ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
>  ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
>  ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
>  .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
>  ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
>  .../0008-bootchart-fix-default-init-path.patch     |  44 +
>  ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
>  ...0-Make-root-s-home-directory-configurable.patch |  89 +-
>  ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
>  ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
>  ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
>  ...aker-dependencies-between-mount-and-devic.patch |  33 +
>  ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
>  ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
>  ...l-add-some-hints-how-to-override-settings.patch |  39 +
>  .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
>  .../0018-core-fix-return-value-on-OOM.patch        |  26 +
>  ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
>  ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
>  ...downgrade-unit-type-not-supported-message.patch |  31 +
>  ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
>  ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
>  ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
>  ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
>  ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
>  meta/recipes-core/systemd/systemd_219.bb           |  33 +-
>  28 files changed, 2050 insertions(+), 55 deletions(-)
>  create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> 
> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> new file mode 100644
> index 0000000..172bea2
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> @@ -0,0 +1,31 @@
> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
> +From: Michal Schmidt <mschmidt@redhat.com>
> +Date: Tue, 17 Feb 2015 10:33:01 +0100
> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
> +
> +The output of gnutls_certificate_verification_status_print() needs to be
> +freed.
> +
> +Noticed this while staring at verify_cert_authorized() to see what could
> +possibly confuse gcc5 on armv7hl to segfault during compilation.
> +
> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
> +---
> + src/journal-remote/microhttpd-util.c | 1 +
> + 1 file changed, 1 insertion(+)
> +
> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> +index 34d9337..de9c6ab 100644
> +--- a/src/journal-remote/microhttpd-util.c
> ++++ b/src/journal-remote/microhttpd-util.c
> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
> + 
> +         log_info("Certificate status: %s", out.data);
> ++        gnutls_free(out.data);
> + 
> +         return status == 0 ? 0 : -EPERM;
> + }
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> new file mode 100644
> index 0000000..f615876
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> @@ -0,0 +1,35 @@
> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
> +From: Michal Schmidt <mschmidt@redhat.com>
> +Date: Tue, 17 Feb 2015 10:36:57 +0100
> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
> +
> +Found by Valgrind while testing the previous memory leak fix.
> +
> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
> +---
> + src/journal-remote/microhttpd-util.c | 6 +++++-
> + 1 file changed, 5 insertions(+), 1 deletion(-)
> +
> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> +index de9c6ab..a95fff1 100644
> +--- a/src/journal-remote/microhttpd-util.c
> ++++ b/src/journal-remote/microhttpd-util.c
> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
> +         return 0;
> + }
> + 
> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
> ++        gnutls_x509_crt_deinit(*p);
> ++}
> ++
> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
> +         const union MHD_ConnectionInfo *ci;
> +         gnutls_session_t session;
> +-        gnutls_x509_crt_t client_cert;
> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
> +         _cleanup_free_ char *buf = NULL;
> +         int r;
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> new file mode 100644
> index 0000000..15fa98c
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> @@ -0,0 +1,28 @@
> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
> +From: Martin Pitt <martin.pitt@ubuntu.com>
> +Date: Tue, 17 Feb 2015 12:47:51 +0100
> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
> +
> +parse_acl() returns the error instead of setting errno.
> +
> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
> +---
> + src/tmpfiles/tmpfiles.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> +index c948d4d..88ba7e4 100644
> +--- a/src/tmpfiles/tmpfiles.c
> ++++ b/src/tmpfiles/tmpfiles.c
> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
> +          * afterwards, so the mask can be added now if necessary. */
> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
> +         if (r < 0)
> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
> +                                   item->argument);
> + #else
> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> new file mode 100644
> index 0000000..f43068d
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> @@ -0,0 +1,26 @@
> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
> +From: Tom Gundersen <teg@jklm.no>
> +Date: Wed, 18 Feb 2015 14:33:50 +0100
> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
> +
> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
> +---
> + src/test/test-utf8.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
> +index befa385..346f852 100644
> +--- a/src/test/test-utf8.c
> ++++ b/src/test/test-utf8.c
> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
> + 
> + static void test_utf16_to_utf8(void) {
> +         char *a = NULL;
> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
> + 
> +         a = utf16_to_utf8(utf16, 14);
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> new file mode 100644
> index 0000000..35fe913
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> @@ -0,0 +1,131 @@
> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Mon, 23 Feb 2015 23:19:54 -0500
> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
> +
> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
> +https://bugs.debian.org/778656
> +
> +Status quo ante can be restored with:
> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
> +
> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
> +---
> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
> + src/shared/acl-util.h |  4 +++
> + 2 files changed, 81 insertions(+), 2 deletions(-)
> +
> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> +index a4ff1ab..cbe09d7 100644
> +--- a/src/shared/acl-util.c
> ++++ b/src/shared/acl-util.c
> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
> +         return 0;
> + }
> + 
> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> ++        acl_tag_t tag_a, tag_b;
> ++
> ++        if (acl_get_tag_type(a, &tag_a) < 0)
> ++                return -errno;
> ++
> ++        if (acl_get_tag_type(b, &tag_b) < 0)
> ++                return -errno;
> ++
> ++        if (tag_a != tag_b)
> ++                return false;
> ++
> ++        switch (tag_a) {
> ++        case ACL_USER_OBJ:
> ++        case ACL_GROUP_OBJ:
> ++        case ACL_MASK:
> ++        case ACL_OTHER:
> ++                /* can have only one of those */
> ++                return true;
> ++        case ACL_USER: {
> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> ++
> ++                uid_a = acl_get_qualifier(a);
> ++                if (!uid_a)
> ++                        return -errno;
> ++
> ++                uid_b = acl_get_qualifier(b);
> ++                if (!uid_b)
> ++                        return -errno;
> ++
> ++                return *uid_a == *uid_b;
> ++        }
> ++        case ACL_GROUP: {
> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> ++
> ++                gid_a = acl_get_qualifier(a);
> ++                if (!gid_a)
> ++                        return -errno;
> ++
> ++                gid_b = acl_get_qualifier(b);
> ++                if (!gid_b)
> ++                        return -errno;
> ++
> ++                return *gid_a == *gid_b;
> ++        }
> ++        default:
> ++                assert_not_reached("Unknown acl tag type");
> ++        }
> ++}
> ++
> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
> ++        acl_entry_t i;
> ++        int r;
> ++
> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
> ++             r > 0;
> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
> ++
> ++                r = acl_entry_equal(i, entry);
> ++                if (r < 0)
> ++                        return r;
> ++                if (r > 0) {
> ++                        *out = i;
> ++                        return 1;
> ++                }
> ++        }
> ++        if (r < 0)
> ++                return -errno;
> ++        return 0;
> ++}
> ++
> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> +         _cleanup_(acl_freep) acl_t old;
> +         acl_entry_t i;
> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> + 
> +                 acl_entry_t j;
> + 
> +-                if (acl_create_entry(&old, &j) < 0)
> +-                        return -errno;
> ++                r = find_acl_entry(old, i, &j);
> ++                if (r < 0)
> ++                        return r;
> ++                if (r == 0)
> ++                        if (acl_create_entry(&old, &j) < 0)
> ++                                return -errno;
> + 
> +                 if (acl_copy_entry(j, i) < 0)
> +                         return -errno;
> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
> +index 90e88ff..fdb9006 100644
> +--- a/src/shared/acl-util.h
> ++++ b/src/shared/acl-util.h
> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
> + #define acl_free_charp acl_free
> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
> ++#define acl_free_uid_tp acl_free
> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
> ++#define acl_free_gid_tp acl_free
> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
> + 
> + #endif
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> new file mode 100644
> index 0000000..fc707bb
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> @@ -0,0 +1,32 @@
> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
> +From: Daniel Mack <daniel@zonque.org>
> +Date: Tue, 24 Feb 2015 13:26:09 +0100
> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
> +
> +  CC       src/shared/libsystemd_shared_la-time-util.lo
> +src/shared/time-util.c: In function 'parse_nsec':
> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
> +                 if (!*s != 0)
> +                         ^
> +
> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
> +---
> + src/shared/time-util.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
> +index 947ac1f..1c36c57 100644
> +--- a/src/shared/time-util.c
> ++++ b/src/shared/time-util.c
> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
> +         s = startswith(p, "infinity");
> +         if (s) {
> +                 s += strspn(s, WHITESPACE);
> +-                if (!*s != 0)
> ++                if (*s != 0)
> +                         return -EINVAL;
> + 
> +                 *nsec = NSEC_INFINITY;
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> new file mode 100644
> index 0000000..161b7b5
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> @@ -0,0 +1,36 @@
> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
> +From: Daniel Mack <daniel@zonque.org>
> +Date: Tue, 24 Feb 2015 13:27:10 +0100
> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
> +
> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
> +---
> + src/test/test-time.c | 6 ++++++
> + 1 file changed, 6 insertions(+)
> +
> +diff --git a/src/test/test-time.c b/src/test/test-time.c
> +index 8cfc4cc..3840fff 100644
> +--- a/src/test/test-time.c
> ++++ b/src/test/test-time.c
> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
> +         assert_se(u == 2);
> +         assert_se(parse_nsec(".7", &u) >= 0);
> +         assert_se(u == 0);
> ++        assert_se(parse_nsec("infinity", &u) >= 0);
> ++        assert_se(u == NSEC_INFINITY);
> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
> ++        assert_se(u == NSEC_INFINITY);
> + 
> +         assert_se(parse_nsec(" xyz ", &u) < 0);
> +         assert_se(parse_nsec("", &u) < 0);
> +         assert_se(parse_nsec(" . ", &u) < 0);
> +         assert_se(parse_nsec(" 5. ", &u) < 0);
> +         assert_se(parse_nsec(".s ", &u) < 0);
> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
> + }
> + 
> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> new file mode 100644
> index 0000000..7eaad1e
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> @@ -0,0 +1,44 @@
> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
> +From: Martin Pitt <martin.pitt@ubuntu.com>
> +Date: Tue, 24 Feb 2015 14:30:10 +0100
> +Subject: [PATCH 08/26] bootchart: fix default init path
> +
> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
> +multi-arch systems.
> +
> +https://launchpad.net/bugs/1423867
> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
> +---
> + Makefile.am               | 1 +
> + src/bootchart/bootchart.c | 2 +-
> + 2 files changed, 2 insertions(+), 1 deletion(-)
> +
> +diff --git a/Makefile.am b/Makefile.am
> +index bf04d31..cc577ce 100644
> +--- a/Makefile.am
> ++++ b/Makefile.am
> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
> + 	-DKEXEC=\"$(KEXEC)\" \
> + 	-DLIBDIR=\"$(libdir)\" \
> + 	-DROOTLIBDIR=\"$(rootlibdir)\" \
> ++	-DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> + 	-DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> + 	-I $(top_srcdir)/src \
> + 	-I $(top_builddir)/src/shared \
> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
> +index 64a384b..175be68 100644
> +--- a/src/bootchart/bootchart.c
> ++++ b/src/bootchart/bootchart.c
> +@@ -76,7 +76,7 @@ int sysfd=-1;
> + #define DEFAULT_HZ 25.0
> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
> + #define DEFAULT_OUTPUT "/run/log"
> + 
> + /* graph defaults */
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> new file mode 100644
> index 0000000..dbffa5b
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> @@ -0,0 +1,44 @@
> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Tue, 24 Feb 2015 10:10:04 -0500
> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
> +
> +It is not necessary when running as telinit, etc.
> +
> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
> +---
> + src/systemctl/systemctl.c | 10 +++++-----
> + 1 file changed, 5 insertions(+), 5 deletions(-)
> +
> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
> +index 21cb898..6b93ec8 100644
> +--- a/src/systemctl/systemctl.c
> ++++ b/src/systemctl/systemctl.c
> +@@ -7204,6 +7204,11 @@ found:
> +                 }
> +         }
> + 
> ++        /* Increase max number of open files to 16K if we can, we
> ++         * might needs this when browsing journal files, which might
> ++         * be split up into many files. */
> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> ++
> +         return verb->dispatch(bus, argv + optind);
> + }
> + 
> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
> +                 goto finish;
> +         }
> + 
> +-        /* Increase max number of open files to 16K if we can, we
> +-         * might needs this when browsing journal files, which might
> +-         * be split up into many files. */
> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> +-
> +         if (!avoid_bus())
> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> index 41b9039..ff2871b 100644
> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> @@ -1,7 +1,7 @@
> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
> -From: Khem Raj <raj.khem@gmail.com>
> -Date: Fri, 20 Feb 2015 05:24:49 +0000
> -Subject: [PATCH 10/11] Make root's home directory configurable
> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
> +Date: Thu, 5 Mar 2015 17:38:12 -0300
> +Subject: [PATCH] Make root's home directory configurable
>  
>  OpenEmbedded has a configurable home directory for root. Allow
>  systemd to be built using its idea of what root's home directory
> @@ -9,32 +9,31 @@ should be.
>  
>  Upstream-Status: Pending
>  
> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
> +compatbile with systemd 219-stable
>  ---
> - Makefile.am                       | 2 ++
> - configure.ac                      | 7 +++++++
> - src/core/unit-printf.c            | 2 +-
> - src/nspawn/nspawn.c               | 4 ++--
> - src/shared/util.c                 | 4 ++--
> - units/console-shell.service.m4.in | 4 ++--
> - units/emergency.service.in        | 4 ++--
> - units/rescue.service.in           | 4 ++--
> - 8 files changed, 20 insertions(+), 11 deletions(-)
> + Makefile.am                | 2 ++
> + configure.ac               | 7 +++++++
> + src/core/unit-printf.c     | 2 +-
> + src/nspawn/nspawn.c        | 5 ++---
> + src/shared/util.c          | 4 ++--
> + units/emergency.service.in | 4 ++--
> + units/rescue.service.in    | 4 ++--
> + 7 files changed, 18 insertions(+), 10 deletions(-)
>  
>  diff --git a/Makefile.am b/Makefile.am
> -index 0fb3f9f..4623963 100644
> +index 93c0509..31ea94d 100644
>  --- a/Makefile.am
>  +++ b/Makefile.am
> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
> - 	-DKEXEC=\"$(KEXEC)\" \
> - 	-DLIBDIR=\"$(libdir)\" \
> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
>   	-DROOTLIBDIR=\"$(rootlibdir)\" \
> -+	-DROOTHOMEDIR=\"$(roothomedir)\" \
> + 	-DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
>   	-DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> ++	-DROOTHOMEDIR=\"$(roothomedir)\" \
>   	-I $(top_srcdir)/src \
>   	-I $(top_builddir)/src/shared \
> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
> + 	-I $(top_srcdir)/src/shared \
> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
>   substitutions = \
>          '|rootlibexecdir=$(rootlibexecdir)|' \
>          '|rootbindir=$(rootbindir)|' \
> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
>          '|SYSTEMCTL=$(rootbindir)/systemctl|' \
>          '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
>  diff --git a/configure.ac b/configure.ac
> -index a5b2e6e..55bb7d8 100644
> +index 01ee8dc..800a587 100644
>  --- a/configure.ac
>  +++ b/configure.ac
> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
>           [],
>           [with_rootlibdir=${libdir}])
>   
> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
>   AC_ARG_WITH([pamlibdir],
>           AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
>           [],
> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
>   AC_SUBST([pamconfdir], [$with_pamconfdir])
>   AC_SUBST([rootprefix], [$with_rootprefix])
>   AC_SUBST([rootlibdir], [$with_rootlibdir])
> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
>   
>   AC_CONFIG_FILES([
>           Makefile po/Makefile.in
> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
>           include_prefix:          ${INCLUDE_PREFIX}
>           lib dir:                 ${libdir}
>           rootlib dir:             ${with_rootlibdir}
> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
>           SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
>           Build Python:            ${PYTHON}
>  diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
> -index 97135db..14d12f1 100644
> +index 7736899..ac5f008 100644
>  --- a/src/core/unit-printf.c
>  +++ b/src/core/unit-printf.c
> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
>                    * best of it if we can, but fail if we can't */
>   
>                   if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
>                           return -ENOTSUP;
>   
>  diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
> -index b597edb..0b32673 100644
> +index 08bfdcf..b44b4cd 100644
>  --- a/src/nspawn/nspawn.c
>  +++ b/src/nspawn/nspawn.c
> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
> +                         r = change_uid_gid(&home);
>                           if (r < 0)
>                                   _exit(EXIT_FAILURE);
> - 
> +-
>  -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
>  +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
>                               (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
>                               (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
>                                   log_oom();
> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
> -                                 execvp(argv[optind], argv + optind);
> - #endif /* HAVE_EXECVPE */
> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
> +                         } else if (argc > optind)
> +                                 execvpe(argv[optind], argv + optind, env_use);
>                           else {
>  -                                chdir(home ? home : "/root");
>  +                                chdir(home ? home : ROOTHOMEDIR);
> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
>                                   execle("/bin/sh", "-sh", NULL, env_use);
>                           }
>  diff --git a/src/shared/util.c b/src/shared/util.c
> -index cbbe3b1..a0e3cc5 100644
> +index 241e752..00adab6 100644
>  --- a/src/shared/util.c
>  +++ b/src/shared/util.c
> -@@ -4609,7 +4609,7 @@ int get_user_creds(
> +@@ -4604,7 +4604,7 @@ int get_user_creds(
>                           *gid = 0;
>   
>                   if (home)
> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
>   
>                   if (shell)
>                           *shell = "/bin/sh";
> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
>           /* Hardcode home directory for root to avoid NSS */
>           u = getuid();
>           if (u == 0) {
> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
>                   if (!h)
>                           return -ENOMEM;
>   
> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
> -index 5c80722..efde5f0 100644
> ---- a/units/console-shell.service.m4.in
> -+++ b/units/console-shell.service.m4.in
> -@@ -15,8 +15,8 @@ After=rc-local.service
> - Before=getty.target
> - 
> - [Service]
> --Environment=HOME=/root
> --WorkingDirectory=/root
> -+Environment=HOME=@roothomedir@
> -+WorkingDirectory=@roothomedir@
> - ExecStart=-@SULOGIN@
> - ExecStopPost=-@SYSTEMCTL@ poweroff
> - Type=idle
>  diff --git a/units/emergency.service.in b/units/emergency.service.in
>  index 2695d7b..7f47b73 100644
>  --- a/units/emergency.service.in
> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
>   ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
>   ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
>  -- 
> -2.1.4
> +1.9.1
>  
> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> new file mode 100644
> index 0000000..1e4a69d
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> @@ -0,0 +1,37 @@
> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> +Date: Tue, 24 Feb 2015 20:40:07 +0100
> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
> +
> +CID#1271344/1271345
> +
> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
> +---
> + src/shared/acl-util.c | 4 ++--
> + 1 file changed, 2 insertions(+), 2 deletions(-)
> +
> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> +index cbe09d7..e67e9ac 100644
> +--- a/src/shared/acl-util.c
> ++++ b/src/shared/acl-util.c
> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> +                 /* can have only one of those */
> +                 return true;
> +         case ACL_USER: {
> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
> + 
> +                 uid_a = acl_get_qualifier(a);
> +                 if (!uid_a)
> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> +                 return *uid_a == *uid_b;
> +         }
> +         case ACL_GROUP: {
> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
> + 
> +                 gid_a = acl_get_qualifier(a);
> +                 if (!gid_a)
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> new file mode 100644
> index 0000000..dca5e20
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> @@ -0,0 +1,28 @@
> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> +Date: Tue, 24 Feb 2015 18:32:31 +0200
> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
> +
> +If we have less samples than expected, systemd-bootchart will crash.
> +
> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
> +---
> + src/bootchart/svg.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
> +index e111fa9..144177c 100644
> +--- a/src/bootchart/svg.c
> ++++ b/src/bootchart/svg.c
> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
> + 
> +                 ps->sample = ps->sample->next;
> +                 sample_hz = ps->sample;
> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
> +                         sample_hz = sample_hz->next;
> + 
> +                 /* subtract bootchart cpu utilization from total */
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> new file mode 100644
> index 0000000..e0cb193
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> @@ -0,0 +1,38 @@
> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> +Date: Mon, 23 Feb 2015 16:01:31 +0200
> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
> +
> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
> +syscalls getrandom and memfd_create").
> +
> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
> +---
> + src/shared/missing.h | 10 ++++++++++
> + 1 file changed, 10 insertions(+)
> +
> +diff --git a/src/shared/missing.h b/src/shared/missing.h
> +index b33a70c..e72631e 100644
> +--- a/src/shared/missing.h
> ++++ b/src/shared/missing.h
> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
> + #    define __NR_getrandom 349
> + #  elif defined(__powerpc__)
> + #    define __NR_getrandom 359
> ++#  elif defined _MIPS_SIM
> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
> ++#      define __NR_getrandom 4353
> ++#    endif
> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
> ++#      define __NR_getrandom 6317
> ++#    endif
> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
> ++#      define __NR_getrandom 5313
> ++#    endif
> + #  else
> + #    warning "__NR_getrandom unknown for your architecture"
> + #    define __NR_getrandom 0xffffffff
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> new file mode 100644
> index 0000000..1b842a2
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> @@ -0,0 +1,33 @@
> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
> +From: Lennart Poettering <lennart@poettering.net>
> +Date: Wed, 25 Feb 2015 22:05:14 +0100
> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
> + units in --user mode
> +
> +When running in user mode unmounting of mount units when a device
> +vanishes is unlikely to work, and even if it would work is already done
> +by PID 1 anyway. HEnce, when creating implicit dependencies between
> +mount units and their backing devices, created a Wants= type dependency
> +in --user mode, but leave a BindsTo= dependency in --system mode.
> +
> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
> +---
> + src/core/unit.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/core/unit.c b/src/core/unit.c
> +index ee8e607..9f1e55e 100644
> +--- a/src/core/unit.c
> ++++ b/src/core/unit.c
> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> +         if (r < 0)
> +                 return r;
> + 
> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
> +         if (r < 0)
> +                 return r;
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> new file mode 100644
> index 0000000..92c4b8f
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> @@ -0,0 +1,43 @@
> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
> +From: Colin Walters <walters@verbum.org>
> +Date: Tue, 17 Feb 2015 13:47:34 -0500
> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
> + caused it
> +
> +I'm trying to track down a relatively recent change in systemd
> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
> +
> +Systemd started to stop sysroot.mount, and this patch should help
> +me debug why at least.
> +
> +While we're here, "break" on the first unit we find that will
> +deactivate, as there's no point in further iteration.
> +
> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
> +---
> + src/core/unit.c | 4 +++-
> + 1 file changed, 3 insertions(+), 1 deletion(-)
> +
> +diff --git a/src/core/unit.c b/src/core/unit.c
> +index 9f1e55e..563f6fe 100644
> +--- a/src/core/unit.c
> ++++ b/src/core/unit.c
> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
> +                         continue;
> + 
> +                 stop = true;
> ++                break;
> +         }
> + 
> +         if (!stop)
> +                 return;
> + 
> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
> ++        assert(other);
> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
> + 
> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> new file mode 100644
> index 0000000..46c25bd
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> @@ -0,0 +1,30 @@
> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Thu, 26 Feb 2015 19:00:11 -0500
> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
> + debug
> +
> +Printing it at info level was tedious. We don't do that for any other
> +overrides.
> +
> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
> +---
> + src/sysctl/sysctl.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
> +index 275a5b7..2415d84 100644
> +--- a/src/sysctl/sysctl.c
> ++++ b/src/sysctl/sysctl.c
> +@@ -176,7 +176,7 @@ found:
> +                         if (streq(value, existing))
> +                                 continue;
> + 
> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
> +                         free(hashmap_remove(sysctl_options, p));
> +                         free(v);
> +                 }
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> new file mode 100644
> index 0000000..87dce1f
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> @@ -0,0 +1,39 @@
> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Thu, 26 Feb 2015 19:05:51 -0500
> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
> +
> +Also a link to decent documentation for sysrq keys. It is surprising
> +hard to find.
> +
> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
> +---
> + sysctl.d/50-default.conf | 9 ++++++++-
> + 1 file changed, 8 insertions(+), 1 deletion(-)
> +
> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
> +index f189233..def151b 100644
> +--- a/sysctl.d/50-default.conf
> ++++ b/sysctl.d/50-default.conf
> +@@ -5,9 +5,16 @@
> + #  the Free Software Foundation; either version 2.1 of the License, or
> + #  (at your option) any later version.
> + 
> +-# See sysctl.d(5) and core(5) for for details.
> ++# See sysctl.d(5) and core(5) for for documentation.
> ++
> ++# To override settings in this file, create a local file in /etc
> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
> ++# there.
> + 
> + # System Request functionality of the kernel (SYNC)
> ++#
> ++# Use kernel.sysrq = 1 to allow all keys.
> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
> + kernel.sysrq = 16
> + 
> + # Append the PID to the core filename
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> new file mode 100644
> index 0000000..a3ab3e4
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> @@ -0,0 +1,912 @@
> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
> +From: Lennart Poettering <lennart@poettering.net>
> +Date: Fri, 27 Feb 2015 21:55:08 +0100
> +Subject: [PATCH 17/26] core: rework device state logic
> +
> +This change introduces a new state "tentative" for device units. Device
> +units are considered "plugged" when udev announced them, "dead" when
> +they are not available in the kernel, and "tentative" when they are
> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
> +announced via udev.
> +
> +This should fix a race when device nodes (like loop devices) are created
> +and immediately mounted. Previously, systemd might end up seeing the
> +mount unit before the device, and would thus pull down the mount because
> +its BindTo dependency on the device would not be fulfilled.
> +
> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
> +---
> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
> + src/core/device.h |  14 ++-
> + src/core/mount.c  |  46 ++++---
> + src/core/swap.c   |  32 +++--
> + src/core/swap.h   |   4 +-
> + src/core/unit.c   |   1 -
> + 6 files changed, 285 insertions(+), 180 deletions(-)
> +
> +diff --git a/src/core/device.c b/src/core/device.c
> +index d3deac3..75b9a46 100644
> +--- a/src/core/device.c
> ++++ b/src/core/device.c
> +@@ -36,7 +36,8 @@
> + 
> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
> +         [DEVICE_DEAD] = UNIT_INACTIVE,
> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
> + };
> + 
> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
> +         d->sysfs = NULL;
> + }
> + 
> ++static int device_set_sysfs(Device *d, const char *sysfs) {
> ++        Device *first;
> ++        char *copy;
> ++        int r;
> ++
> ++        assert(d);
> ++
> ++        if (streq_ptr(d->sysfs, sysfs))
> ++                return 0;
> ++
> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
> ++        if (r < 0)
> ++                return r;
> ++
> ++        copy = strdup(sysfs);
> ++        if (!copy)
> ++                return -ENOMEM;
> ++
> ++        device_unset_sysfs(d);
> ++
> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
> ++        LIST_PREPEND(same_sysfs, first, d);
> ++
> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
> ++        if (r < 0) {
> ++                LIST_REMOVE(same_sysfs, first, d);
> ++                free(copy);
> ++                return r;
> ++        }
> ++
> ++        d->sysfs = copy;
> ++
> ++        return 0;
> ++}
> ++
> + static void device_init(Unit *u) {
> +         Device *d = DEVICE(u);
> + 
> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
> +         assert(d);
> +         assert(d->state == DEVICE_DEAD);
> + 
> +-        if (d->sysfs)
> ++        if (d->found & DEVICE_FOUND_UDEV)
> ++                /* If udev says the device is around, it's around */
> +                 device_set_state(d, DEVICE_PLUGGED);
> ++        else if (d->found != DEVICE_NOT_FOUND)
> ++                /* If a device is found in /proc/self/mountinfo or
> ++                 * /proc/swaps, it's "tentatively" around. */
> ++                device_set_state(d, DEVICE_TENTATIVE);
> + 
> +         return 0;
> + }
> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
> +         return device_state_to_string(DEVICE(u)->state);
> + }
> + 
> +-static int device_add_escaped_name(Unit *u, const char *dn) {
> +-        _cleanup_free_ char *e = NULL;
> +-        int r;
> +-
> +-        assert(u);
> +-        assert(dn);
> +-        assert(dn[0] == '/');
> +-
> +-        e = unit_name_from_path(dn, ".device");
> +-        if (!e)
> +-                return -ENOMEM;
> +-
> +-        r = unit_add_name(u, e);
> +-        if (r < 0 && r != -EEXIST)
> +-                return r;
> +-
> +-        return 0;
> +-}
> +-
> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
> +-        _cleanup_free_ char *e = NULL;
> +-        Unit *u;
> +-
> +-        assert(m);
> +-        assert(dn);
> +-        assert(dn[0] == '/');
> +-        assert(_u);
> +-
> +-        e = unit_name_from_path(dn, ".device");
> +-        if (!e)
> +-                return -ENOMEM;
> +-
> +-        u = manager_get_unit(m, e);
> +-        if (u) {
> +-                *_u = u;
> +-                return 1;
> +-        }
> +-
> +-        return 0;
> +-}
> +-
> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
> +         const char *model;
> ++        int r;
> + 
> +         assert(u);
> +         assert(dev);
> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
> + 
> +                         j = strjoin(model, " ", label, NULL);
> +                         if (j)
> +-                                return unit_set_description(u, j);
> +-                }
> ++                                r = unit_set_description(u, j);
> ++                } else
> ++                        r = unit_set_description(u, model);
> ++        } else
> ++                r = unit_set_description(u, path);
> + 
> +-                return unit_set_description(u, model);
> +-        }
> ++        if (r < 0)
> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
> + 
> +-        return unit_set_description(u, path);
> ++        return r;
> + }
> + 
> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> + 
> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
> +                 if (!n)
> +-                        return -ENOMEM;
> ++                        return log_oom();
> + 
> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
> +                 if (r < 0)
> +-                        return r;
> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
> +         }
> +         if (!isempty(state))
> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
> +-                                 property, strna(udev_device_get_syspath(dev)));
> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
> + 
> +         return 0;
> + }
> + 
> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> ++        _cleanup_free_ char *e = NULL;
> +         const char *sysfs;
> +         Unit *u = NULL;
> +         bool delete;
> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> +         if (!sysfs)
> +                 return 0;
> + 
> +-        r = device_find_escape_name(m, path, &u);
> +-        if (r < 0)
> +-                return r;
> ++        e = unit_name_from_path(path, ".device");
> ++        if (!e)
> ++                return log_oom();
> ++
> ++        u = manager_get_unit(m, e);
> + 
> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
> ++        if (u &&
> ++            DEVICE(u)->sysfs &&
> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
> +                 return -EEXIST;
> ++        }
> + 
> +         if (!u) {
> +                 delete = true;
> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> +                 if (!u)
> +                         return log_oom();
> + 
> +-                r = device_add_escaped_name(u, path);
> ++                r = unit_add_name(u, e);
> +                 if (r < 0)
> +                         goto fail;
> + 
> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> +          * actually been seen yet ->sysfs will not be
> +          * initialized. Hence initialize it if necessary. */
> + 
> +-        if (!DEVICE(u)->sysfs) {
> +-                Device *first;
> +-
> +-                DEVICE(u)->sysfs = strdup(sysfs);
> +-                if (!DEVICE(u)->sysfs) {
> +-                        r = -ENOMEM;
> +-                        goto fail;
> +-                }
> +-
> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
> +-                if (r < 0)
> +-                        goto fail;
> +-
> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
> +-
> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
> +-                if (r < 0)
> +-                        goto fail;
> +-        }
> +-
> +-        device_make_description(u, dev, path);
> ++        r = device_set_sysfs(DEVICE(u), sysfs);
> ++        if (r < 0)
> ++                goto fail;
> + 
> +-        if (main) {
> +-                /* The additional systemd udev properties we only
> +-                 * interpret for the main object */
> ++        (void) device_update_description(u, dev, path);
> + 
> +-                r = device_add_udev_wants(u, dev);
> +-                if (r < 0)
> +-                        goto fail;
> +-        }
> ++        /* The additional systemd udev properties we only interpret
> ++         * for the main object */
> ++        if (main)
> ++                (void) device_add_udev_wants(u, dev);
> + 
> +         /* Note that this won't dispatch the load queue, the caller
> +          * has to do that if needed and appropriate */
> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> +         return 0;
> + 
> + fail:
> +-        log_warning_errno(r, "Failed to load device unit: %m");
> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
> + 
> +         if (delete && u)
> +                 unit_free(u);
> +@@ -342,7 +331,7 @@ fail:
> +         return r;
> + }
> + 
> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
> ++static int device_process_new(Manager *m, struct udev_device *dev) {
> +         const char *sysfs, *dn, *alias;
> +         struct udev_list_entry *item = NULL, *first = NULL;
> +         int r;
> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> +                 return 0;
> + 
> +         /* Add the main unit named after the sysfs path */
> +-        r = device_update_unit(m, dev, sysfs, true);
> ++        r = device_setup_unit(m, dev, sysfs, true);
> +         if (r < 0)
> +                 return r;
> + 
> +         /* Add an additional unit for the device node */
> +         dn = udev_device_get_devnode(dev);
> +         if (dn)
> +-                device_update_unit(m, dev, dn, false);
> ++                (void) device_setup_unit(m, dev, dn, false);
> + 
> +         /* Add additional units for all symlinks */
> +         first = udev_device_get_devlinks_list_entry(dev);
> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> +                             st.st_rdev != udev_device_get_devnum(dev))
> +                                 continue;
> + 
> +-                device_update_unit(m, dev, p, false);
> ++                (void) device_setup_unit(m, dev, p, false);
> +         }
> + 
> +         /* Add additional units for all explicitly configured
> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> +                         e[l] = 0;
> + 
> +                         if (path_is_absolute(e))
> +-                                device_update_unit(m, dev, e, false);
> ++                                (void) device_setup_unit(m, dev, e, false);
> +                         else
> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
> +                 }
> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> +         return 0;
> + }
> + 
> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
> +-        const char *sysfs;
> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
> ++        DeviceFound n;
> ++
> ++        assert(d);
> ++
> ++        n = add ? (d->found | found) : (d->found & ~found);
> ++        if (n == d->found)
> ++                return;
> ++
> ++        d->found = n;
> ++
> ++        if (now) {
> ++                if (d->found & DEVICE_FOUND_UDEV)
> ++                        device_set_state(d, DEVICE_PLUGGED);
> ++                else if (d->found != DEVICE_NOT_FOUND)
> ++                        device_set_state(d, DEVICE_TENTATIVE);
> ++                else
> ++                        device_set_state(d, DEVICE_DEAD);
> ++        }
> ++}
> ++
> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
> +         Device *d, *l;
> + 
> +         assert(m);
> +-        assert(dev);
> ++        assert(sysfs);
> + 
> +-        sysfs = udev_device_get_syspath(dev);
> +-        if (!sysfs)
> +-                return;
> ++        if (found == DEVICE_NOT_FOUND)
> ++                return 0;
> + 
> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
> +         LIST_FOREACH(same_sysfs, d, l)
> +-                device_set_state(d, DEVICE_PLUGGED);
> ++                device_update_found_one(d, add, found, now);
> ++
> ++        return 0;
> + }
> + 
> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
> +-        const char *sysfs;
> +-        Device *d;
> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
> ++        _cleanup_free_ char *e = NULL;
> ++        Unit *u;
> + 
> +         assert(m);
> +-        assert(dev);
> ++        assert(path);
> + 
> +-        sysfs = udev_device_get_syspath(dev);
> +-        if (!sysfs)
> +-                return -ENOMEM;
> ++        if (found == DEVICE_NOT_FOUND)
> ++                return 0;
> + 
> +-        /* Remove all units of this sysfs path */
> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
> +-                device_unset_sysfs(d);
> +-                device_set_state(d, DEVICE_DEAD);
> +-        }
> ++        e = unit_name_from_path(path, ".device");
> ++        if (!e)
> ++                return log_oom();
> + 
> ++        u = manager_get_unit(m, e);
> ++        if (!u)
> ++                return 0;
> ++
> ++        device_update_found_one(DEVICE(u), add, found, now);
> +         return 0;
> + }
> + 
> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
> +         return parse_boolean(ready) != 0;
> + }
> + 
> +-static int device_process_new_path(Manager *m, const char *path) {
> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> +-
> +-        assert(m);
> +-        assert(path);
> +-
> +-        dev = udev_device_new_from_syspath(m->udev, path);
> +-        if (!dev)
> +-                return log_oom();
> +-
> +-        if (!device_is_ready(dev))
> +-                return 0;
> +-
> +-        return device_process_new_device(m, dev);
> +-}
> +-
> + static Unit *device_following(Unit *u) {
> +         Device *d = DEVICE(u);
> +         Device *other, *first = NULL;
> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
> +                 goto fail;
> + 
> +         first = udev_enumerate_get_list_entry(e);
> +-        udev_list_entry_foreach(item, first)
> +-                device_process_new_path(m, udev_list_entry_get_name(item));
> ++        udev_list_entry_foreach(item, first) {
> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> ++                const char *sysfs;
> ++
> ++                sysfs = udev_list_entry_get_name(item);
> ++
> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
> ++                if (!dev) {
> ++                        log_oom();
> ++                        continue;
> ++                }
> ++
> ++                if (!device_is_ready(dev))
> ++                        continue;
> ++
> ++                (void) device_process_new(m, dev);
> ++
> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
> ++        }
> + 
> +         return 0;
> + 
> + fail:
> ++        log_error_errno(r, "Failed to enumerate devices: %m");
> ++
> +         device_shutdown(m);
> +         return r;
> + }
> +@@ -619,7 +634,7 @@ fail:
> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> +         Manager *m = userdata;
> +-        const char *action;
> ++        const char *action, *sysfs;
> +         int r;
> + 
> +         assert(m);
> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> +         if (!dev)
> +                 return 0;
> + 
> ++        sysfs = udev_device_get_syspath(dev);
> ++        if (!sysfs) {
> ++                log_error("Failed to get udev sys path.");
> ++                return 0;
> ++        }
> ++
> +         action = udev_device_get_action(dev);
> +         if (!action) {
> +                 log_error("Failed to get udev action string.");
> +                 return 0;
> +         }
> + 
> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
> +-                r = device_process_removed_device(m, dev);
> +-                if (r < 0)
> +-                        log_error_errno(r, "Failed to process device remove event: %m");
> +-
> +-                r = swap_process_removed_device(m, dev);
> ++        if (streq(action, "remove"))  {
> ++                r = swap_process_device_remove(m, dev);
> +                 if (r < 0)
> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
> + 
> +-        } else {
> +-                r = device_process_new_device(m, dev);
> +-                if (r < 0)
> +-                        log_error_errno(r, "Failed to process device new event: %m");
> ++                /* If we get notified that a device was removed by
> ++                 * udev, then it's completely gone, hence unset all
> ++                 * found bits */
> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
> + 
> +-                r = swap_process_new_device(m, dev);
> ++        } else if (device_is_ready(dev)) {
> ++
> ++                (void) device_process_new(m, dev);
> ++
> ++                r = swap_process_device_new(m, dev);
> +                 if (r < 0)
> +                         log_error_errno(r, "Failed to process swap device new event: %m");
> + 
> +                 manager_dispatch_load_queue(m);
> + 
> +-                device_set_path_plugged(m, dev);
> ++                /* The device is found now, set the udev found bit */
> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
> ++
> ++        } else {
> ++                /* The device is nominally around, but not ready for
> ++                 * us. Hence unset the udev bit, but leave the rest
> ++                 * around. */
> ++
> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
> +         }
> + 
> +         return 0;
> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
> +         return read_only <= 0;
> + }
> + 
> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> ++        struct stat st;
> ++
> ++        assert(m);
> ++        assert(node);
> ++
> ++        /* This is called whenever we find a device referenced in
> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
> ++         * mounted/enabled at a time where udev has not finished
> ++         * probing it yet, and we thus haven't learned about it
> ++         * yet. In this case we will set the device unit to
> ++         * "tentative" state. */
> ++
> ++        if (add) {
> ++                if (!path_startswith(node, "/dev"))
> ++                        return 0;
> ++
> ++                if (stat(node, &st) < 0) {
> ++                        if (errno == ENOENT)
> ++                                return 0;
> ++
> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
> ++                }
> ++
> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
> ++                        return 0;
> ++
> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
> ++                if (!dev) {
> ++                        if (errno == ENOENT)
> ++                                return 0;
> ++
> ++                        return log_oom();
> ++                }
> ++
> ++                /* If the device is known in the kernel and newly
> ++                 * appeared, then we'll create a device unit for it,
> ++                 * under the name referenced in /proc/swaps or
> ++                 * /proc/self/mountinfo. */
> ++
> ++                (void) device_setup_unit(m, dev, node, false);
> ++        }
> ++
> ++        /* Update the device unit's state, should it exist */
> ++        return device_update_found_by_name(m, node, add, found, now);
> ++}
> ++
> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
> +         [DEVICE_DEAD] = "dead",
> +-        [DEVICE_PLUGGED] = "plugged"
> ++        [DEVICE_TENTATIVE] = "tentative",
> ++        [DEVICE_PLUGGED] = "plugged",
> + };
> + 
> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
> +diff --git a/src/core/device.h b/src/core/device.h
> +index bb7ae07..0609b20 100644
> +--- a/src/core/device.h
> ++++ b/src/core/device.h
> +@@ -29,20 +29,28 @@ typedef struct Device Device;
> +  * simplifies the state engine greatly */
> + typedef enum DeviceState {
> +         DEVICE_DEAD,
> +-        DEVICE_PLUGGED,
> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
> ++        DEVICE_PLUGGED,   /* announced by udev */
> +         _DEVICE_STATE_MAX,
> +         _DEVICE_STATE_INVALID = -1
> + } DeviceState;
> + 
> ++typedef enum DeviceFound {
> ++        DEVICE_NOT_FOUND = 0,
> ++        DEVICE_FOUND_UDEV = 1,
> ++        DEVICE_FOUND_MOUNT = 2,
> ++        DEVICE_FOUND_SWAP = 4,
> ++} DeviceFound;
> ++
> + struct Device {
> +         Unit meta;
> + 
> +         char *sysfs;
> ++        DeviceFound found;
> + 
> +         /* In order to be able to distinguish dependencies on
> +         different device nodes we might end up creating multiple
> +         devices for the same sysfs path. We chain them up here. */
> +-
> +         LIST_FIELDS(struct Device, same_sysfs);
> + 
> +         DeviceState state;
> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
> + 
> + const char* device_state_to_string(DeviceState i) _const_;
> + DeviceState device_state_from_string(const char *s) _pure_;
> ++
> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
> +diff --git a/src/core/mount.c b/src/core/mount.c
> +index f3977e6..c971330 100644
> +--- a/src/core/mount.c
> ++++ b/src/core/mount.c
> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
> +         return 0;
> + }
> + 
> +-static int mount_add_one(
> ++static int mount_setup_unit(
> +                 Manager *m,
> +                 const char *what,
> +                 const char *where,
> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
> + 
> +                 u = unit_new(m, sizeof(Mount));
> +                 if (!u)
> +-                        return -ENOMEM;
> ++                        return log_oom();
> + 
> +                 r = unit_add_name(u, e);
> +                 if (r < 0)
> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
> +         return 0;
> + 
> + fail:
> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
> ++
> +         if (delete && u)
> +                 unit_free(u);
> + 
> +@@ -1554,33 +1556,36 @@ fail:
> + }
> + 
> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
> +-        struct libmnt_fs *fs;
> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
> +         int r = 0;
> + 
> +         assert(m);
> + 
> +-        tb = mnt_new_table();
> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
> +-        if (!tb || !itr)
> ++        t = mnt_new_table();
> ++        if (!t)
> +                 return log_oom();
> + 
> +-        r = mnt_table_parse_mtab(tb, NULL);
> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
> ++        if (!i)
> ++                return log_oom();
> ++
> ++        r = mnt_table_parse_mtab(t, NULL);
> +         if (r < 0)
> +-                return r;
> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
> + 
> +         r = 0;
> +         for (;;) {
> +                 const char *device, *path, *options, *fstype;
> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
> ++                struct libmnt_fs *fs;
> +                 int k;
> + 
> +-                k = mnt_table_next_fs(tb, itr, &fs);
> ++                k = mnt_table_next_fs(t, i, &fs);
> +                 if (k == 1)
> +                         break;
> +-                else if (k < 0)
> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
> ++                if (k < 0)
> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
> + 
> +                 device = mnt_fs_get_source(fs);
> +                 path = mnt_fs_get_target(fs);
> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> +                 fstype = mnt_fs_get_fstype(fs);
> + 
> +                 d = cunescape(device);
> ++                if (!d)
> ++                        return log_oom();
> ++
> +                 p = cunescape(path);
> +-                if (!d || !p)
> ++                if (!p)
> +                         return log_oom();
> + 
> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
> ++
> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
> +                 if (r == 0 && k < 0)
> +                         r = k;
> +         }
> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> + 
> +         r = mount_load_proc_self_mountinfo(m, true);
> +         if (r < 0) {
> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
> +-
> +                 /* Reset flags, just in case, for later calls */
> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
> +                         Mount *mount = MOUNT(u);
> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> +                                 break;
> +                         }
> + 
> ++                        if (mount->parameters_proc_self_mountinfo.what)
> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
> ++
> ++
> +                 } else if (mount->just_mounted || mount->just_changed) {
> + 
> +                         /* New or changed mount entry */
> +diff --git a/src/core/swap.c b/src/core/swap.c
> +index 6997921..5c19af5 100644
> +--- a/src/core/swap.c
> ++++ b/src/core/swap.c
> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
> +         return swap_verify(s);
> + }
> + 
> +-static int swap_add_one(
> ++static int swap_setup_unit(
> +                 Manager *m,
> +                 const char *what,
> +                 const char *what_proc_swaps,
> +@@ -363,8 +363,10 @@ static int swap_add_one(
> + 
> +         if (u &&
> +             SWAP(u)->from_proc_swaps &&
> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
> +                 return -EEXIST;
> ++        }
> + 
> +         if (!u) {
> +                 delete = true;
> +@@ -379,7 +381,7 @@ static int swap_add_one(
> + 
> +                 SWAP(u)->what = strdup(what);
> +                 if (!SWAP(u)->what) {
> +-                        r = log_oom();
> ++                        r = -ENOMEM;
> +                         goto fail;
> +                 }
> + 
> +@@ -407,7 +409,6 @@ static int swap_add_one(
> +         p->priority = priority;
> + 
> +         unit_add_to_dbus_queue(u);
> +-
> +         return 0;
> + 
> + fail:
> +@@ -419,7 +420,7 @@ fail:
> +         return r;
> + }
> + 
> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
> +         struct udev_list_entry *item = NULL, *first = NULL;
> +         const char *dn;
> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> + 
> +         assert(m);
> + 
> +-        r = swap_add_one(m, device, device, prio, set_flags);
> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
> +         if (r < 0)
> +                 return r;
> + 
> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> +         /* Add the main device node */
> +         dn = udev_device_get_devnode(d);
> +         if (dn && !streq(dn, device))
> +-                swap_add_one(m, dn, device, prio, set_flags);
> ++                swap_setup_unit(m, dn, device, prio, set_flags);
> + 
> +         /* Add additional units for all symlinks */
> +         first = udev_device_get_devlinks_list_entry(d);
> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> +                             st.st_rdev != udev_device_get_devnum(d))
> +                                 continue;
> + 
> +-                swap_add_one(m, p, device, prio, set_flags);
> ++                swap_setup_unit(m, p, device, prio, set_flags);
> +         }
> + 
> +         return r;
> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
> +                         if (k == EOF)
> +                                 break;
> + 
> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
> +                         continue;
> +                 }
> + 
> +                 d = cunescape(dev);
> +                 if (!d)
> +-                        return -ENOMEM;
> ++                        return log_oom();
> ++
> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
> + 
> +-                k = swap_process_new_swap(m, d, prio, set_flags);
> ++                k = swap_process_new(m, d, prio, set_flags);
> +                 if (k < 0)
> +                         r = k;
> +         }
> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
> +                                 break;
> +                         }
> + 
> ++                        if (swap->what)
> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
> ++
> +                 } else if (swap->just_activated) {
> + 
> +                         /* New swap entry */
> +@@ -1298,7 +1304,7 @@ fail:
> +         return r;
> + }
> + 
> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
> +         struct udev_list_entry *item = NULL, *first = NULL;
> +         _cleanup_free_ char *e = NULL;
> +         const char *dn;
> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
> +         return r;
> + }
> + 
> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
> +         const char *dn;
> +         int r = 0;
> +         Swap *s;
> +diff --git a/src/core/swap.h b/src/core/swap.h
> +index 73e64d8..914a2db 100644
> +--- a/src/core/swap.h
> ++++ b/src/core/swap.h
> +@@ -116,8 +116,8 @@ struct Swap {
> + 
> + extern const UnitVTable swap_vtable;
> + 
> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
> + 
> + const char* swap_state_to_string(SwapState i) _const_;
> + SwapState swap_state_from_string(const char *s) _pure_;
> +diff --git a/src/core/unit.c b/src/core/unit.c
> +index 563f6fe..a6558ee 100644
> +--- a/src/core/unit.c
> ++++ b/src/core/unit.c
> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> +                 return -ENOMEM;
> + 
> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
> +-
> +         if (r < 0)
> +                 return r;
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> new file mode 100644
> index 0000000..d614085
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> @@ -0,0 +1,26 @@
> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> +Date: Sat, 28 Feb 2015 23:39:55 +0100
> +Subject: [PATCH 18/26] core: fix return value on OOM
> +
> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
> +---
> + src/core/device.c | 2 ++
> + 1 file changed, 2 insertions(+)
> +
> +diff --git a/src/core/device.c b/src/core/device.c
> +index 75b9a46..1cc103c 100644
> +--- a/src/core/device.c
> ++++ b/src/core/device.c
> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
> +                         j = strjoin(model, " ", label, NULL);
> +                         if (j)
> +                                 r = unit_set_description(u, j);
> ++                        else
> ++                                r = -ENOMEM;
> +                 } else
> +                         r = unit_set_description(u, model);
> +         } else
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> new file mode 100644
> index 0000000..d94da60
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> @@ -0,0 +1,33 @@
> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
> +Date: Thu, 19 Feb 2015 20:47:28 +0100
> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
> + bus on dbus1
> +
> +This fixes "machinectl login" on systems configured with --disable-kdbus.
> +
> +The error was:
> +machinectl login foo
> +Failed to get machine PTY: Input/output error
> +
> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
> +---
> + src/machine/machine-dbus.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
> +index b46f0a8..b0f0f66 100644
> +--- a/src/machine/machine-dbus.c
> ++++ b/src/machine/machine-dbus.c
> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
> + #ifdef ENABLE_KDBUS
> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
> + #else
> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
> + #endif
> +         if (!container_bus->address)
> +                 return -ENOMEM;
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> new file mode 100644
> index 0000000..fcc2adf
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> @@ -0,0 +1,25 @@
> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> +Date: Fri, 20 Feb 2015 15:35:11 -0300
> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
> +
> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
> +---
> + src/shared/util.c | 1 +
> + 1 file changed, 1 insertion(+)
> +
> +diff --git a/src/shared/util.c b/src/shared/util.c
> +index ba035ca..f24b5b4 100644
> +--- a/src/shared/util.c
> ++++ b/src/shared/util.c
> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
> + 
> + bool fstype_is_network(const char *fstype) {
> +         static const char table[] =
> ++                "afs\0"
> +                 "cifs\0"
> +                 "smbfs\0"
> +                 "sshfs\0"
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> new file mode 100644
> index 0000000..02e279d
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> @@ -0,0 +1,31 @@
> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
> +Date: Fri, 20 Feb 2015 10:53:28 +0100
> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
> +
> +Otherwise every daemon reload prints out warnings like:
> +
> +systemd[1]: Unit type .busname is not supported on this system.
> +systemd[1]: Unit type .swap is not supported on this system.
> +
> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
> +---
> + src/core/manager.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/core/manager.c b/src/core/manager.c
> +index 4775219..bc9b7ec 100644
> +--- a/src/core/manager.c
> ++++ b/src/core/manager.c
> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
> +                 int q;
> + 
> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> +                         continue;
> +                 }
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> new file mode 100644
> index 0000000..f5afd09
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> @@ -0,0 +1,97 @@
> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Mon, 2 Mar 2015 10:34:51 -0500
> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
> +
> +Binary fields were not processed properly, and resulting journal files
> +were non-conforming, resulting in an error ("Invalid field.") when reading.
> +
> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
> +---
> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
> + src/journal-remote/journal-remote-parse.h |  4 +++-
> + 2 files changed, 21 insertions(+), 14 deletions(-)
> +
> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
> +index d9dea8d..afded7e 100644
> +--- a/src/journal-remote/journal-remote-parse.c
> ++++ b/src/journal-remote/journal-remote-parse.c
> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
> +                    LLLLLLLL0011223344...\n
> +                 */
> +                 sep = memchr(line, '=', n);
> +-                if (sep)
> ++                if (sep) {
> +                         /* chomp newline */
> +                         n--;
> +-                else
> ++
> ++                        r = iovw_put(&source->iovw, line, n);
> ++                        if (r < 0)
> ++                                return r;
> ++                } else {
> +                         /* replace \n with = */
> +                         line[n-1] = '=';
> +-                log_trace("Received: %.*s", (int) n, line);
> + 
> +-                r = iovw_put(&source->iovw, line, n);
> +-                if (r < 0) {
> +-                        log_error("Failed to put line in iovect");
> +-                        return r;
> ++                        source->field_len = n;
> ++                        source->state = STATE_DATA_START;
> ++
> ++                        /* we cannot put the field in iovec until we have all data */
> +                 }
> + 
> +-                if (!sep)
> +-                        source->state = STATE_DATA_START;
> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
> ++
> +                 return 0; /* continue */
> +         }
> + 
> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
> + 
> +         case STATE_DATA: {
> +                 void *data;
> ++                char *field;
> + 
> +                 assert(source->data_size > 0);
> + 
> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
> + 
> +                 assert(data);
> + 
> +-                r = iovw_put(&source->iovw, data, source->data_size);
> +-                if (r < 0) {
> +-                        log_error("failed to put binary buffer in iovect");
> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
> ++
> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
> ++                if (r < 0)
> +                         return r;
> +-                }
> + 
> +                 source->state = STATE_DATA_FINISH;
> + 
> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
> +index 8499f4e..22db550 100644
> +--- a/src/journal-remote/journal-remote-parse.h
> ++++ b/src/journal-remote/journal-remote-parse.h
> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
> +         size_t offset;     /* offset to the beginning of live data in the buffer */
> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
> +         size_t filled;     /* total number of bytes in the buffer */
> +-        size_t data_size;  /* size of the binary data chunk being processed */
> ++
> ++        size_t field_len;  /* used for binary fields: the field name length */
> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
> + 
> +         struct iovec_wrapper iovw;
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> new file mode 100644
> index 0000000..79e565b
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> @@ -0,0 +1,37 @@
> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> +Date: Sun, 1 Mar 2015 21:13:10 -0300
> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
> +
> +Logs constantly show
> +
> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
> +
> +This is because ext4 does not support FS_NOCOW_FL.
> +
> +[zj: fold into one conditional as suggested on the ML and
> +     fix (preexisting) r/errno confusion in error message.]
> +
> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
> +---
> + src/journal/journal-file.c | 4 ++--
> + 1 file changed, 2 insertions(+), 2 deletions(-)
> +
> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
> +index 2845e05..0f28718 100644
> +--- a/src/journal/journal-file.c
> ++++ b/src/journal/journal-file.c
> +@@ -2611,8 +2611,8 @@ int journal_file_open(
> +                  * shouldn't be too bad, given that we do our own
> +                  * checksumming). */
> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
> +-                if (r < 0)
> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
> ++                if (r < 0 && r != -ENOTTY)
> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
> + 
> +                 /* Let's attach the creation time to the journal file,
> +                  * so that the vacuuming code knows the age of this
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> new file mode 100644
> index 0000000..0cf9a0a
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> @@ -0,0 +1,53 @@
> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
> +From: Lennart Poettering <lennart@poettering.net>
> +Date: Mon, 2 Mar 2015 20:55:38 +0100
> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
> + happy
> +
> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
> +---
> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
> + 1 file changed, 5 insertions(+), 7 deletions(-)
> +
> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
> +index 028c2a7..22a3a53 100644
> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> +                 .msg_iovlen = 1,
> +                 .msg_name = &sockaddr,
> +         };
> +-        union {
> +-                struct cmsghdr cmsghdr;
> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
> +-        } control;
> ++        struct cmsghdr *control;
> +         _cleanup_close_ int fd = -1;
> +         struct cmsghdr *cmsg = NULL;
> +         const char *e;
> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
> + 
> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
> ++
> +         if (n_fds > 0) {
> +-                msghdr.msg_control = &control;
> ++                msghdr.msg_control = control;
> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
> + 
> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> +                 try_without_ucred = true;
> +                 controllen_without_ucred = msghdr.msg_controllen;
> + 
> +-                msghdr.msg_control = &control;
> ++                msghdr.msg_control = control;
> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
> + 
> +                 if (cmsg)
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> new file mode 100644
> index 0000000..6912489
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> @@ -0,0 +1,84 @@
> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
> +Date: Tue, 3 Mar 2015 00:35:08 +0100
> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
> + filesystems
> +
> +A warning is printed if ACLs cannot be retrieved for any reason other
> +than -ENOSYS. For -ENOSYS, debug log is printed.
> +
> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
> +---
> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
> + 1 file changed, 20 insertions(+), 16 deletions(-)
> +
> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> +index 88ba7e4..187997e 100644
> +--- a/src/tmpfiles/tmpfiles.c
> ++++ b/src/tmpfiles/tmpfiles.c
> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> +         int r;
> +         _cleanup_(acl_free_charpp) char *t = NULL;
> + 
> ++        /* Returns 0 for success, positive error if already warned,
> ++         * negative error otherwise. */
> ++
> +         if (modify) {
> +                 r = acls_for_file(path, type, acl, &dup);
> +                 if (r < 0)
> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> + 
> +         r = acl_set_file(path, type, dup);
> +         if (r < 0)
> +-                return log_error_errno(-errno,
> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
> +-                                       strna(t), path);
> ++                return -log_error_errno(errno,
> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
> ++                                        strna(t), path);
> ++
> +         return 0;
> + }
> + #endif
> + 
> + static int path_set_acls(Item *item, const char *path) {
> ++        int r = 0;
> + #ifdef HAVE_ACL
> +-        int r;
> +-
> +         assert(item);
> +         assert(path);
> + 
> +-        if (item->acl_access) {
> ++        if (item->acl_access)
> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
> +-                if (r < 0)
> +-                        return r;
> +-        }
> + 
> +-        if (item->acl_default) {
> ++        if (r == 0 && item->acl_default)
> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
> +-                if (r < 0)
> +-                        return r;
> +-        }
> +-#endif
> + 
> +-        return 0;
> ++        if (r > 0)
> ++                return -r; /* already warned */
> ++        else if (r == -ENOTSUP) {
> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
> ++                return 0;
> ++        } else if (r < 0)
> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
> ++#endif
> ++        return r;
> + }
> + 
> + static int write_one_file(Item *i, const char *path) {
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> new file mode 100644
> index 0000000..a49a369
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> @@ -0,0 +1,30 @@
> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Tue, 3 Mar 2015 19:07:28 -0500
> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
> + missing
> +
> +On s390 (at least) /sys/class/power_supply is not present. We should
> +treat this like if this directory was empty, and not an error.
> +
> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
> +---
> + src/shared/util.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/shared/util.c b/src/shared/util.c
> +index f24b5b4..8548723 100644
> +--- a/src/shared/util.c
> ++++ b/src/shared/util.c
> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
> + 
> +         d = opendir("/sys/class/power_supply");
> +         if (!d)
> +-                return -errno;
> ++                return errno == ENOENT ? true : -errno;
> + 
> +         for (;;) {
> +                 struct dirent *de;
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
> index 73b930e..9c20b11 100644
> --- a/meta/recipes-core/systemd/systemd_219.bb
> +++ b/meta/recipes-core/systemd/systemd_219.bb
> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
>             file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
>             file://0010-Make-root-s-home-directory-configurable.patch \
>             file://0011-systemd-user-avoid-using-system-auth.patch \
> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
>             file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
>             file://0014-Revert-rules-remove-firmware-loading-rules.patch \
>             file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
>             file://tmpfiles-pam.patch \
> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
>  
>  S = "${WORKDIR}/git"
>  
> +# Appending backport fixes released for version 219-stable
> +SRC_URI_append = "\
> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
> +           file://0008-bootchart-fix-default-init-path.patch \
> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
> +           file://0017-core-rework-device-state-logic.patch \
> +           file://0018-core-fix-return-value-on-OOM.patch \
> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
> +           "
> +
>  SRC_URI_append_libc-uclibc = "\
>              file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
>             "
> -- 
> 1.9.1
> 




^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-03-30 18:13 [PATCH] systemd: v219 with stable fixes Bruno Bottazzini
  2015-03-30 18:20 ` Bottazzini, Bruno
@ 2015-03-31 20:21 ` Bottazzini, Bruno
  2015-03-31 20:25   ` Otavio Salvador
  1 sibling, 1 reply; 12+ messages in thread
From: Bottazzini, Bruno @ 2015-03-31 20:21 UTC (permalink / raw)
  To: openembedded-core

Ping

On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
> Adding patches that fix bugs for 219 version.
> This will get the same consistency of the stable systemd 219 version.
> 
> More details:
> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
> ---
>  ...remote-fix-certificate-status-memory-leak.patch |  31 +
>  ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
>  ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
>  ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
>  ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
>  .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
>  ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
>  .../0008-bootchart-fix-default-init-path.patch     |  44 +
>  ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
>  ...0-Make-root-s-home-directory-configurable.patch |  89 +-
>  ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
>  ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
>  ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
>  ...aker-dependencies-between-mount-and-devic.patch |  33 +
>  ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
>  ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
>  ...l-add-some-hints-how-to-override-settings.patch |  39 +
>  .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
>  .../0018-core-fix-return-value-on-OOM.patch        |  26 +
>  ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
>  ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
>  ...downgrade-unit-type-not-supported-message.patch |  31 +
>  ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
>  ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
>  ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
>  ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
>  ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
>  meta/recipes-core/systemd/systemd_219.bb           |  33 +-
>  28 files changed, 2050 insertions(+), 55 deletions(-)
>  create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>  create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> 
> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> new file mode 100644
> index 0000000..172bea2
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> @@ -0,0 +1,31 @@
> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
> +From: Michal Schmidt <mschmidt@redhat.com>
> +Date: Tue, 17 Feb 2015 10:33:01 +0100
> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
> +
> +The output of gnutls_certificate_verification_status_print() needs to be
> +freed.
> +
> +Noticed this while staring at verify_cert_authorized() to see what could
> +possibly confuse gcc5 on armv7hl to segfault during compilation.
> +
> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
> +---
> + src/journal-remote/microhttpd-util.c | 1 +
> + 1 file changed, 1 insertion(+)
> +
> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> +index 34d9337..de9c6ab 100644
> +--- a/src/journal-remote/microhttpd-util.c
> ++++ b/src/journal-remote/microhttpd-util.c
> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
> + 
> +         log_info("Certificate status: %s", out.data);
> ++        gnutls_free(out.data);
> + 
> +         return status == 0 ? 0 : -EPERM;
> + }
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> new file mode 100644
> index 0000000..f615876
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> @@ -0,0 +1,35 @@
> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
> +From: Michal Schmidt <mschmidt@redhat.com>
> +Date: Tue, 17 Feb 2015 10:36:57 +0100
> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
> +
> +Found by Valgrind while testing the previous memory leak fix.
> +
> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
> +---
> + src/journal-remote/microhttpd-util.c | 6 +++++-
> + 1 file changed, 5 insertions(+), 1 deletion(-)
> +
> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> +index de9c6ab..a95fff1 100644
> +--- a/src/journal-remote/microhttpd-util.c
> ++++ b/src/journal-remote/microhttpd-util.c
> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
> +         return 0;
> + }
> + 
> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
> ++        gnutls_x509_crt_deinit(*p);
> ++}
> ++
> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
> +         const union MHD_ConnectionInfo *ci;
> +         gnutls_session_t session;
> +-        gnutls_x509_crt_t client_cert;
> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
> +         _cleanup_free_ char *buf = NULL;
> +         int r;
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> new file mode 100644
> index 0000000..15fa98c
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> @@ -0,0 +1,28 @@
> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
> +From: Martin Pitt <martin.pitt@ubuntu.com>
> +Date: Tue, 17 Feb 2015 12:47:51 +0100
> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
> +
> +parse_acl() returns the error instead of setting errno.
> +
> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
> +---
> + src/tmpfiles/tmpfiles.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> +index c948d4d..88ba7e4 100644
> +--- a/src/tmpfiles/tmpfiles.c
> ++++ b/src/tmpfiles/tmpfiles.c
> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
> +          * afterwards, so the mask can be added now if necessary. */
> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
> +         if (r < 0)
> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
> +                                   item->argument);
> + #else
> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> new file mode 100644
> index 0000000..f43068d
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> @@ -0,0 +1,26 @@
> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
> +From: Tom Gundersen <teg@jklm.no>
> +Date: Wed, 18 Feb 2015 14:33:50 +0100
> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
> +
> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
> +---
> + src/test/test-utf8.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
> +index befa385..346f852 100644
> +--- a/src/test/test-utf8.c
> ++++ b/src/test/test-utf8.c
> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
> + 
> + static void test_utf16_to_utf8(void) {
> +         char *a = NULL;
> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
> + 
> +         a = utf16_to_utf8(utf16, 14);
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> new file mode 100644
> index 0000000..35fe913
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> @@ -0,0 +1,131 @@
> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Mon, 23 Feb 2015 23:19:54 -0500
> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
> +
> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
> +https://bugs.debian.org/778656
> +
> +Status quo ante can be restored with:
> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
> +
> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
> +---
> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
> + src/shared/acl-util.h |  4 +++
> + 2 files changed, 81 insertions(+), 2 deletions(-)
> +
> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> +index a4ff1ab..cbe09d7 100644
> +--- a/src/shared/acl-util.c
> ++++ b/src/shared/acl-util.c
> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
> +         return 0;
> + }
> + 
> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> ++        acl_tag_t tag_a, tag_b;
> ++
> ++        if (acl_get_tag_type(a, &tag_a) < 0)
> ++                return -errno;
> ++
> ++        if (acl_get_tag_type(b, &tag_b) < 0)
> ++                return -errno;
> ++
> ++        if (tag_a != tag_b)
> ++                return false;
> ++
> ++        switch (tag_a) {
> ++        case ACL_USER_OBJ:
> ++        case ACL_GROUP_OBJ:
> ++        case ACL_MASK:
> ++        case ACL_OTHER:
> ++                /* can have only one of those */
> ++                return true;
> ++        case ACL_USER: {
> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> ++
> ++                uid_a = acl_get_qualifier(a);
> ++                if (!uid_a)
> ++                        return -errno;
> ++
> ++                uid_b = acl_get_qualifier(b);
> ++                if (!uid_b)
> ++                        return -errno;
> ++
> ++                return *uid_a == *uid_b;
> ++        }
> ++        case ACL_GROUP: {
> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> ++
> ++                gid_a = acl_get_qualifier(a);
> ++                if (!gid_a)
> ++                        return -errno;
> ++
> ++                gid_b = acl_get_qualifier(b);
> ++                if (!gid_b)
> ++                        return -errno;
> ++
> ++                return *gid_a == *gid_b;
> ++        }
> ++        default:
> ++                assert_not_reached("Unknown acl tag type");
> ++        }
> ++}
> ++
> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
> ++        acl_entry_t i;
> ++        int r;
> ++
> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
> ++             r > 0;
> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
> ++
> ++                r = acl_entry_equal(i, entry);
> ++                if (r < 0)
> ++                        return r;
> ++                if (r > 0) {
> ++                        *out = i;
> ++                        return 1;
> ++                }
> ++        }
> ++        if (r < 0)
> ++                return -errno;
> ++        return 0;
> ++}
> ++
> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> +         _cleanup_(acl_freep) acl_t old;
> +         acl_entry_t i;
> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> + 
> +                 acl_entry_t j;
> + 
> +-                if (acl_create_entry(&old, &j) < 0)
> +-                        return -errno;
> ++                r = find_acl_entry(old, i, &j);
> ++                if (r < 0)
> ++                        return r;
> ++                if (r == 0)
> ++                        if (acl_create_entry(&old, &j) < 0)
> ++                                return -errno;
> + 
> +                 if (acl_copy_entry(j, i) < 0)
> +                         return -errno;
> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
> +index 90e88ff..fdb9006 100644
> +--- a/src/shared/acl-util.h
> ++++ b/src/shared/acl-util.h
> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
> + #define acl_free_charp acl_free
> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
> ++#define acl_free_uid_tp acl_free
> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
> ++#define acl_free_gid_tp acl_free
> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
> + 
> + #endif
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> new file mode 100644
> index 0000000..fc707bb
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> @@ -0,0 +1,32 @@
> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
> +From: Daniel Mack <daniel@zonque.org>
> +Date: Tue, 24 Feb 2015 13:26:09 +0100
> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
> +
> +  CC       src/shared/libsystemd_shared_la-time-util.lo
> +src/shared/time-util.c: In function 'parse_nsec':
> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
> +                 if (!*s != 0)
> +                         ^
> +
> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
> +---
> + src/shared/time-util.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
> +index 947ac1f..1c36c57 100644
> +--- a/src/shared/time-util.c
> ++++ b/src/shared/time-util.c
> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
> +         s = startswith(p, "infinity");
> +         if (s) {
> +                 s += strspn(s, WHITESPACE);
> +-                if (!*s != 0)
> ++                if (*s != 0)
> +                         return -EINVAL;
> + 
> +                 *nsec = NSEC_INFINITY;
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> new file mode 100644
> index 0000000..161b7b5
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> @@ -0,0 +1,36 @@
> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
> +From: Daniel Mack <daniel@zonque.org>
> +Date: Tue, 24 Feb 2015 13:27:10 +0100
> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
> +
> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
> +---
> + src/test/test-time.c | 6 ++++++
> + 1 file changed, 6 insertions(+)
> +
> +diff --git a/src/test/test-time.c b/src/test/test-time.c
> +index 8cfc4cc..3840fff 100644
> +--- a/src/test/test-time.c
> ++++ b/src/test/test-time.c
> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
> +         assert_se(u == 2);
> +         assert_se(parse_nsec(".7", &u) >= 0);
> +         assert_se(u == 0);
> ++        assert_se(parse_nsec("infinity", &u) >= 0);
> ++        assert_se(u == NSEC_INFINITY);
> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
> ++        assert_se(u == NSEC_INFINITY);
> + 
> +         assert_se(parse_nsec(" xyz ", &u) < 0);
> +         assert_se(parse_nsec("", &u) < 0);
> +         assert_se(parse_nsec(" . ", &u) < 0);
> +         assert_se(parse_nsec(" 5. ", &u) < 0);
> +         assert_se(parse_nsec(".s ", &u) < 0);
> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
> + }
> + 
> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> new file mode 100644
> index 0000000..7eaad1e
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> @@ -0,0 +1,44 @@
> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
> +From: Martin Pitt <martin.pitt@ubuntu.com>
> +Date: Tue, 24 Feb 2015 14:30:10 +0100
> +Subject: [PATCH 08/26] bootchart: fix default init path
> +
> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
> +multi-arch systems.
> +
> +https://launchpad.net/bugs/1423867
> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
> +---
> + Makefile.am               | 1 +
> + src/bootchart/bootchart.c | 2 +-
> + 2 files changed, 2 insertions(+), 1 deletion(-)
> +
> +diff --git a/Makefile.am b/Makefile.am
> +index bf04d31..cc577ce 100644
> +--- a/Makefile.am
> ++++ b/Makefile.am
> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
> + 	-DKEXEC=\"$(KEXEC)\" \
> + 	-DLIBDIR=\"$(libdir)\" \
> + 	-DROOTLIBDIR=\"$(rootlibdir)\" \
> ++	-DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> + 	-DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> + 	-I $(top_srcdir)/src \
> + 	-I $(top_builddir)/src/shared \
> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
> +index 64a384b..175be68 100644
> +--- a/src/bootchart/bootchart.c
> ++++ b/src/bootchart/bootchart.c
> +@@ -76,7 +76,7 @@ int sysfd=-1;
> + #define DEFAULT_HZ 25.0
> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
> + #define DEFAULT_OUTPUT "/run/log"
> + 
> + /* graph defaults */
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> new file mode 100644
> index 0000000..dbffa5b
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> @@ -0,0 +1,44 @@
> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Tue, 24 Feb 2015 10:10:04 -0500
> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
> +
> +It is not necessary when running as telinit, etc.
> +
> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
> +---
> + src/systemctl/systemctl.c | 10 +++++-----
> + 1 file changed, 5 insertions(+), 5 deletions(-)
> +
> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
> +index 21cb898..6b93ec8 100644
> +--- a/src/systemctl/systemctl.c
> ++++ b/src/systemctl/systemctl.c
> +@@ -7204,6 +7204,11 @@ found:
> +                 }
> +         }
> + 
> ++        /* Increase max number of open files to 16K if we can, we
> ++         * might needs this when browsing journal files, which might
> ++         * be split up into many files. */
> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> ++
> +         return verb->dispatch(bus, argv + optind);
> + }
> + 
> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
> +                 goto finish;
> +         }
> + 
> +-        /* Increase max number of open files to 16K if we can, we
> +-         * might needs this when browsing journal files, which might
> +-         * be split up into many files. */
> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> +-
> +         if (!avoid_bus())
> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> index 41b9039..ff2871b 100644
> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> @@ -1,7 +1,7 @@
> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
> -From: Khem Raj <raj.khem@gmail.com>
> -Date: Fri, 20 Feb 2015 05:24:49 +0000
> -Subject: [PATCH 10/11] Make root's home directory configurable
> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
> +Date: Thu, 5 Mar 2015 17:38:12 -0300
> +Subject: [PATCH] Make root's home directory configurable
>  
>  OpenEmbedded has a configurable home directory for root. Allow
>  systemd to be built using its idea of what root's home directory
> @@ -9,32 +9,31 @@ should be.
>  
>  Upstream-Status: Pending
>  
> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
> +compatbile with systemd 219-stable
>  ---
> - Makefile.am                       | 2 ++
> - configure.ac                      | 7 +++++++
> - src/core/unit-printf.c            | 2 +-
> - src/nspawn/nspawn.c               | 4 ++--
> - src/shared/util.c                 | 4 ++--
> - units/console-shell.service.m4.in | 4 ++--
> - units/emergency.service.in        | 4 ++--
> - units/rescue.service.in           | 4 ++--
> - 8 files changed, 20 insertions(+), 11 deletions(-)
> + Makefile.am                | 2 ++
> + configure.ac               | 7 +++++++
> + src/core/unit-printf.c     | 2 +-
> + src/nspawn/nspawn.c        | 5 ++---
> + src/shared/util.c          | 4 ++--
> + units/emergency.service.in | 4 ++--
> + units/rescue.service.in    | 4 ++--
> + 7 files changed, 18 insertions(+), 10 deletions(-)
>  
>  diff --git a/Makefile.am b/Makefile.am
> -index 0fb3f9f..4623963 100644
> +index 93c0509..31ea94d 100644
>  --- a/Makefile.am
>  +++ b/Makefile.am
> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
> - 	-DKEXEC=\"$(KEXEC)\" \
> - 	-DLIBDIR=\"$(libdir)\" \
> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
>   	-DROOTLIBDIR=\"$(rootlibdir)\" \
> -+	-DROOTHOMEDIR=\"$(roothomedir)\" \
> + 	-DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
>   	-DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> ++	-DROOTHOMEDIR=\"$(roothomedir)\" \
>   	-I $(top_srcdir)/src \
>   	-I $(top_builddir)/src/shared \
> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
> + 	-I $(top_srcdir)/src/shared \
> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
>   substitutions = \
>          '|rootlibexecdir=$(rootlibexecdir)|' \
>          '|rootbindir=$(rootbindir)|' \
> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
>          '|SYSTEMCTL=$(rootbindir)/systemctl|' \
>          '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
>  diff --git a/configure.ac b/configure.ac
> -index a5b2e6e..55bb7d8 100644
> +index 01ee8dc..800a587 100644
>  --- a/configure.ac
>  +++ b/configure.ac
> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
>           [],
>           [with_rootlibdir=${libdir}])
>   
> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
>   AC_ARG_WITH([pamlibdir],
>           AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
>           [],
> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
>   AC_SUBST([pamconfdir], [$with_pamconfdir])
>   AC_SUBST([rootprefix], [$with_rootprefix])
>   AC_SUBST([rootlibdir], [$with_rootlibdir])
> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
>   
>   AC_CONFIG_FILES([
>           Makefile po/Makefile.in
> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
>           include_prefix:          ${INCLUDE_PREFIX}
>           lib dir:                 ${libdir}
>           rootlib dir:             ${with_rootlibdir}
> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
>           SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
>           Build Python:            ${PYTHON}
>  diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
> -index 97135db..14d12f1 100644
> +index 7736899..ac5f008 100644
>  --- a/src/core/unit-printf.c
>  +++ b/src/core/unit-printf.c
> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
>                    * best of it if we can, but fail if we can't */
>   
>                   if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
>                           return -ENOTSUP;
>   
>  diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
> -index b597edb..0b32673 100644
> +index 08bfdcf..b44b4cd 100644
>  --- a/src/nspawn/nspawn.c
>  +++ b/src/nspawn/nspawn.c
> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
> +                         r = change_uid_gid(&home);
>                           if (r < 0)
>                                   _exit(EXIT_FAILURE);
> - 
> +-
>  -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
>  +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
>                               (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
>                               (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
>                                   log_oom();
> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
> -                                 execvp(argv[optind], argv + optind);
> - #endif /* HAVE_EXECVPE */
> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
> +                         } else if (argc > optind)
> +                                 execvpe(argv[optind], argv + optind, env_use);
>                           else {
>  -                                chdir(home ? home : "/root");
>  +                                chdir(home ? home : ROOTHOMEDIR);
> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
>                                   execle("/bin/sh", "-sh", NULL, env_use);
>                           }
>  diff --git a/src/shared/util.c b/src/shared/util.c
> -index cbbe3b1..a0e3cc5 100644
> +index 241e752..00adab6 100644
>  --- a/src/shared/util.c
>  +++ b/src/shared/util.c
> -@@ -4609,7 +4609,7 @@ int get_user_creds(
> +@@ -4604,7 +4604,7 @@ int get_user_creds(
>                           *gid = 0;
>   
>                   if (home)
> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
>   
>                   if (shell)
>                           *shell = "/bin/sh";
> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
>           /* Hardcode home directory for root to avoid NSS */
>           u = getuid();
>           if (u == 0) {
> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
>                   if (!h)
>                           return -ENOMEM;
>   
> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
> -index 5c80722..efde5f0 100644
> ---- a/units/console-shell.service.m4.in
> -+++ b/units/console-shell.service.m4.in
> -@@ -15,8 +15,8 @@ After=rc-local.service
> - Before=getty.target
> - 
> - [Service]
> --Environment=HOME=/root
> --WorkingDirectory=/root
> -+Environment=HOME=@roothomedir@
> -+WorkingDirectory=@roothomedir@
> - ExecStart=-@SULOGIN@
> - ExecStopPost=-@SYSTEMCTL@ poweroff
> - Type=idle
>  diff --git a/units/emergency.service.in b/units/emergency.service.in
>  index 2695d7b..7f47b73 100644
>  --- a/units/emergency.service.in
> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
>   ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
>   ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
>  -- 
> -2.1.4
> +1.9.1
>  
> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> new file mode 100644
> index 0000000..1e4a69d
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> @@ -0,0 +1,37 @@
> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> +Date: Tue, 24 Feb 2015 20:40:07 +0100
> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
> +
> +CID#1271344/1271345
> +
> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
> +---
> + src/shared/acl-util.c | 4 ++--
> + 1 file changed, 2 insertions(+), 2 deletions(-)
> +
> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> +index cbe09d7..e67e9ac 100644
> +--- a/src/shared/acl-util.c
> ++++ b/src/shared/acl-util.c
> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> +                 /* can have only one of those */
> +                 return true;
> +         case ACL_USER: {
> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
> + 
> +                 uid_a = acl_get_qualifier(a);
> +                 if (!uid_a)
> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> +                 return *uid_a == *uid_b;
> +         }
> +         case ACL_GROUP: {
> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
> + 
> +                 gid_a = acl_get_qualifier(a);
> +                 if (!gid_a)
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> new file mode 100644
> index 0000000..dca5e20
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> @@ -0,0 +1,28 @@
> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> +Date: Tue, 24 Feb 2015 18:32:31 +0200
> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
> +
> +If we have less samples than expected, systemd-bootchart will crash.
> +
> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
> +---
> + src/bootchart/svg.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
> +index e111fa9..144177c 100644
> +--- a/src/bootchart/svg.c
> ++++ b/src/bootchart/svg.c
> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
> + 
> +                 ps->sample = ps->sample->next;
> +                 sample_hz = ps->sample;
> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
> +                         sample_hz = sample_hz->next;
> + 
> +                 /* subtract bootchart cpu utilization from total */
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> new file mode 100644
> index 0000000..e0cb193
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> @@ -0,0 +1,38 @@
> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> +Date: Mon, 23 Feb 2015 16:01:31 +0200
> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
> +
> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
> +syscalls getrandom and memfd_create").
> +
> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
> +---
> + src/shared/missing.h | 10 ++++++++++
> + 1 file changed, 10 insertions(+)
> +
> +diff --git a/src/shared/missing.h b/src/shared/missing.h
> +index b33a70c..e72631e 100644
> +--- a/src/shared/missing.h
> ++++ b/src/shared/missing.h
> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
> + #    define __NR_getrandom 349
> + #  elif defined(__powerpc__)
> + #    define __NR_getrandom 359
> ++#  elif defined _MIPS_SIM
> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
> ++#      define __NR_getrandom 4353
> ++#    endif
> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
> ++#      define __NR_getrandom 6317
> ++#    endif
> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
> ++#      define __NR_getrandom 5313
> ++#    endif
> + #  else
> + #    warning "__NR_getrandom unknown for your architecture"
> + #    define __NR_getrandom 0xffffffff
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> new file mode 100644
> index 0000000..1b842a2
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> @@ -0,0 +1,33 @@
> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
> +From: Lennart Poettering <lennart@poettering.net>
> +Date: Wed, 25 Feb 2015 22:05:14 +0100
> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
> + units in --user mode
> +
> +When running in user mode unmounting of mount units when a device
> +vanishes is unlikely to work, and even if it would work is already done
> +by PID 1 anyway. HEnce, when creating implicit dependencies between
> +mount units and their backing devices, created a Wants= type dependency
> +in --user mode, but leave a BindsTo= dependency in --system mode.
> +
> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
> +---
> + src/core/unit.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/core/unit.c b/src/core/unit.c
> +index ee8e607..9f1e55e 100644
> +--- a/src/core/unit.c
> ++++ b/src/core/unit.c
> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> +         if (r < 0)
> +                 return r;
> + 
> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
> +         if (r < 0)
> +                 return r;
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> new file mode 100644
> index 0000000..92c4b8f
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> @@ -0,0 +1,43 @@
> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
> +From: Colin Walters <walters@verbum.org>
> +Date: Tue, 17 Feb 2015 13:47:34 -0500
> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
> + caused it
> +
> +I'm trying to track down a relatively recent change in systemd
> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
> +
> +Systemd started to stop sysroot.mount, and this patch should help
> +me debug why at least.
> +
> +While we're here, "break" on the first unit we find that will
> +deactivate, as there's no point in further iteration.
> +
> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
> +---
> + src/core/unit.c | 4 +++-
> + 1 file changed, 3 insertions(+), 1 deletion(-)
> +
> +diff --git a/src/core/unit.c b/src/core/unit.c
> +index 9f1e55e..563f6fe 100644
> +--- a/src/core/unit.c
> ++++ b/src/core/unit.c
> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
> +                         continue;
> + 
> +                 stop = true;
> ++                break;
> +         }
> + 
> +         if (!stop)
> +                 return;
> + 
> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
> ++        assert(other);
> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
> + 
> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> new file mode 100644
> index 0000000..46c25bd
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> @@ -0,0 +1,30 @@
> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Thu, 26 Feb 2015 19:00:11 -0500
> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
> + debug
> +
> +Printing it at info level was tedious. We don't do that for any other
> +overrides.
> +
> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
> +---
> + src/sysctl/sysctl.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
> +index 275a5b7..2415d84 100644
> +--- a/src/sysctl/sysctl.c
> ++++ b/src/sysctl/sysctl.c
> +@@ -176,7 +176,7 @@ found:
> +                         if (streq(value, existing))
> +                                 continue;
> + 
> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
> +                         free(hashmap_remove(sysctl_options, p));
> +                         free(v);
> +                 }
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> new file mode 100644
> index 0000000..87dce1f
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> @@ -0,0 +1,39 @@
> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Thu, 26 Feb 2015 19:05:51 -0500
> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
> +
> +Also a link to decent documentation for sysrq keys. It is surprising
> +hard to find.
> +
> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
> +---
> + sysctl.d/50-default.conf | 9 ++++++++-
> + 1 file changed, 8 insertions(+), 1 deletion(-)
> +
> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
> +index f189233..def151b 100644
> +--- a/sysctl.d/50-default.conf
> ++++ b/sysctl.d/50-default.conf
> +@@ -5,9 +5,16 @@
> + #  the Free Software Foundation; either version 2.1 of the License, or
> + #  (at your option) any later version.
> + 
> +-# See sysctl.d(5) and core(5) for for details.
> ++# See sysctl.d(5) and core(5) for for documentation.
> ++
> ++# To override settings in this file, create a local file in /etc
> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
> ++# there.
> + 
> + # System Request functionality of the kernel (SYNC)
> ++#
> ++# Use kernel.sysrq = 1 to allow all keys.
> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
> + kernel.sysrq = 16
> + 
> + # Append the PID to the core filename
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> new file mode 100644
> index 0000000..a3ab3e4
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> @@ -0,0 +1,912 @@
> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
> +From: Lennart Poettering <lennart@poettering.net>
> +Date: Fri, 27 Feb 2015 21:55:08 +0100
> +Subject: [PATCH 17/26] core: rework device state logic
> +
> +This change introduces a new state "tentative" for device units. Device
> +units are considered "plugged" when udev announced them, "dead" when
> +they are not available in the kernel, and "tentative" when they are
> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
> +announced via udev.
> +
> +This should fix a race when device nodes (like loop devices) are created
> +and immediately mounted. Previously, systemd might end up seeing the
> +mount unit before the device, and would thus pull down the mount because
> +its BindTo dependency on the device would not be fulfilled.
> +
> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
> +---
> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
> + src/core/device.h |  14 ++-
> + src/core/mount.c  |  46 ++++---
> + src/core/swap.c   |  32 +++--
> + src/core/swap.h   |   4 +-
> + src/core/unit.c   |   1 -
> + 6 files changed, 285 insertions(+), 180 deletions(-)
> +
> +diff --git a/src/core/device.c b/src/core/device.c
> +index d3deac3..75b9a46 100644
> +--- a/src/core/device.c
> ++++ b/src/core/device.c
> +@@ -36,7 +36,8 @@
> + 
> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
> +         [DEVICE_DEAD] = UNIT_INACTIVE,
> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
> + };
> + 
> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
> +         d->sysfs = NULL;
> + }
> + 
> ++static int device_set_sysfs(Device *d, const char *sysfs) {
> ++        Device *first;
> ++        char *copy;
> ++        int r;
> ++
> ++        assert(d);
> ++
> ++        if (streq_ptr(d->sysfs, sysfs))
> ++                return 0;
> ++
> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
> ++        if (r < 0)
> ++                return r;
> ++
> ++        copy = strdup(sysfs);
> ++        if (!copy)
> ++                return -ENOMEM;
> ++
> ++        device_unset_sysfs(d);
> ++
> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
> ++        LIST_PREPEND(same_sysfs, first, d);
> ++
> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
> ++        if (r < 0) {
> ++                LIST_REMOVE(same_sysfs, first, d);
> ++                free(copy);
> ++                return r;
> ++        }
> ++
> ++        d->sysfs = copy;
> ++
> ++        return 0;
> ++}
> ++
> + static void device_init(Unit *u) {
> +         Device *d = DEVICE(u);
> + 
> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
> +         assert(d);
> +         assert(d->state == DEVICE_DEAD);
> + 
> +-        if (d->sysfs)
> ++        if (d->found & DEVICE_FOUND_UDEV)
> ++                /* If udev says the device is around, it's around */
> +                 device_set_state(d, DEVICE_PLUGGED);
> ++        else if (d->found != DEVICE_NOT_FOUND)
> ++                /* If a device is found in /proc/self/mountinfo or
> ++                 * /proc/swaps, it's "tentatively" around. */
> ++                device_set_state(d, DEVICE_TENTATIVE);
> + 
> +         return 0;
> + }
> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
> +         return device_state_to_string(DEVICE(u)->state);
> + }
> + 
> +-static int device_add_escaped_name(Unit *u, const char *dn) {
> +-        _cleanup_free_ char *e = NULL;
> +-        int r;
> +-
> +-        assert(u);
> +-        assert(dn);
> +-        assert(dn[0] == '/');
> +-
> +-        e = unit_name_from_path(dn, ".device");
> +-        if (!e)
> +-                return -ENOMEM;
> +-
> +-        r = unit_add_name(u, e);
> +-        if (r < 0 && r != -EEXIST)
> +-                return r;
> +-
> +-        return 0;
> +-}
> +-
> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
> +-        _cleanup_free_ char *e = NULL;
> +-        Unit *u;
> +-
> +-        assert(m);
> +-        assert(dn);
> +-        assert(dn[0] == '/');
> +-        assert(_u);
> +-
> +-        e = unit_name_from_path(dn, ".device");
> +-        if (!e)
> +-                return -ENOMEM;
> +-
> +-        u = manager_get_unit(m, e);
> +-        if (u) {
> +-                *_u = u;
> +-                return 1;
> +-        }
> +-
> +-        return 0;
> +-}
> +-
> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
> +         const char *model;
> ++        int r;
> + 
> +         assert(u);
> +         assert(dev);
> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
> + 
> +                         j = strjoin(model, " ", label, NULL);
> +                         if (j)
> +-                                return unit_set_description(u, j);
> +-                }
> ++                                r = unit_set_description(u, j);
> ++                } else
> ++                        r = unit_set_description(u, model);
> ++        } else
> ++                r = unit_set_description(u, path);
> + 
> +-                return unit_set_description(u, model);
> +-        }
> ++        if (r < 0)
> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
> + 
> +-        return unit_set_description(u, path);
> ++        return r;
> + }
> + 
> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> + 
> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
> +                 if (!n)
> +-                        return -ENOMEM;
> ++                        return log_oom();
> + 
> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
> +                 if (r < 0)
> +-                        return r;
> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
> +         }
> +         if (!isempty(state))
> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
> +-                                 property, strna(udev_device_get_syspath(dev)));
> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
> + 
> +         return 0;
> + }
> + 
> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> ++        _cleanup_free_ char *e = NULL;
> +         const char *sysfs;
> +         Unit *u = NULL;
> +         bool delete;
> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> +         if (!sysfs)
> +                 return 0;
> + 
> +-        r = device_find_escape_name(m, path, &u);
> +-        if (r < 0)
> +-                return r;
> ++        e = unit_name_from_path(path, ".device");
> ++        if (!e)
> ++                return log_oom();
> ++
> ++        u = manager_get_unit(m, e);
> + 
> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
> ++        if (u &&
> ++            DEVICE(u)->sysfs &&
> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
> +                 return -EEXIST;
> ++        }
> + 
> +         if (!u) {
> +                 delete = true;
> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> +                 if (!u)
> +                         return log_oom();
> + 
> +-                r = device_add_escaped_name(u, path);
> ++                r = unit_add_name(u, e);
> +                 if (r < 0)
> +                         goto fail;
> + 
> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> +          * actually been seen yet ->sysfs will not be
> +          * initialized. Hence initialize it if necessary. */
> + 
> +-        if (!DEVICE(u)->sysfs) {
> +-                Device *first;
> +-
> +-                DEVICE(u)->sysfs = strdup(sysfs);
> +-                if (!DEVICE(u)->sysfs) {
> +-                        r = -ENOMEM;
> +-                        goto fail;
> +-                }
> +-
> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
> +-                if (r < 0)
> +-                        goto fail;
> +-
> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
> +-
> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
> +-                if (r < 0)
> +-                        goto fail;
> +-        }
> +-
> +-        device_make_description(u, dev, path);
> ++        r = device_set_sysfs(DEVICE(u), sysfs);
> ++        if (r < 0)
> ++                goto fail;
> + 
> +-        if (main) {
> +-                /* The additional systemd udev properties we only
> +-                 * interpret for the main object */
> ++        (void) device_update_description(u, dev, path);
> + 
> +-                r = device_add_udev_wants(u, dev);
> +-                if (r < 0)
> +-                        goto fail;
> +-        }
> ++        /* The additional systemd udev properties we only interpret
> ++         * for the main object */
> ++        if (main)
> ++                (void) device_add_udev_wants(u, dev);
> + 
> +         /* Note that this won't dispatch the load queue, the caller
> +          * has to do that if needed and appropriate */
> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> +         return 0;
> + 
> + fail:
> +-        log_warning_errno(r, "Failed to load device unit: %m");
> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
> + 
> +         if (delete && u)
> +                 unit_free(u);
> +@@ -342,7 +331,7 @@ fail:
> +         return r;
> + }
> + 
> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
> ++static int device_process_new(Manager *m, struct udev_device *dev) {
> +         const char *sysfs, *dn, *alias;
> +         struct udev_list_entry *item = NULL, *first = NULL;
> +         int r;
> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> +                 return 0;
> + 
> +         /* Add the main unit named after the sysfs path */
> +-        r = device_update_unit(m, dev, sysfs, true);
> ++        r = device_setup_unit(m, dev, sysfs, true);
> +         if (r < 0)
> +                 return r;
> + 
> +         /* Add an additional unit for the device node */
> +         dn = udev_device_get_devnode(dev);
> +         if (dn)
> +-                device_update_unit(m, dev, dn, false);
> ++                (void) device_setup_unit(m, dev, dn, false);
> + 
> +         /* Add additional units for all symlinks */
> +         first = udev_device_get_devlinks_list_entry(dev);
> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> +                             st.st_rdev != udev_device_get_devnum(dev))
> +                                 continue;
> + 
> +-                device_update_unit(m, dev, p, false);
> ++                (void) device_setup_unit(m, dev, p, false);
> +         }
> + 
> +         /* Add additional units for all explicitly configured
> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> +                         e[l] = 0;
> + 
> +                         if (path_is_absolute(e))
> +-                                device_update_unit(m, dev, e, false);
> ++                                (void) device_setup_unit(m, dev, e, false);
> +                         else
> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
> +                 }
> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> +         return 0;
> + }
> + 
> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
> +-        const char *sysfs;
> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
> ++        DeviceFound n;
> ++
> ++        assert(d);
> ++
> ++        n = add ? (d->found | found) : (d->found & ~found);
> ++        if (n == d->found)
> ++                return;
> ++
> ++        d->found = n;
> ++
> ++        if (now) {
> ++                if (d->found & DEVICE_FOUND_UDEV)
> ++                        device_set_state(d, DEVICE_PLUGGED);
> ++                else if (d->found != DEVICE_NOT_FOUND)
> ++                        device_set_state(d, DEVICE_TENTATIVE);
> ++                else
> ++                        device_set_state(d, DEVICE_DEAD);
> ++        }
> ++}
> ++
> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
> +         Device *d, *l;
> + 
> +         assert(m);
> +-        assert(dev);
> ++        assert(sysfs);
> + 
> +-        sysfs = udev_device_get_syspath(dev);
> +-        if (!sysfs)
> +-                return;
> ++        if (found == DEVICE_NOT_FOUND)
> ++                return 0;
> + 
> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
> +         LIST_FOREACH(same_sysfs, d, l)
> +-                device_set_state(d, DEVICE_PLUGGED);
> ++                device_update_found_one(d, add, found, now);
> ++
> ++        return 0;
> + }
> + 
> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
> +-        const char *sysfs;
> +-        Device *d;
> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
> ++        _cleanup_free_ char *e = NULL;
> ++        Unit *u;
> + 
> +         assert(m);
> +-        assert(dev);
> ++        assert(path);
> + 
> +-        sysfs = udev_device_get_syspath(dev);
> +-        if (!sysfs)
> +-                return -ENOMEM;
> ++        if (found == DEVICE_NOT_FOUND)
> ++                return 0;
> + 
> +-        /* Remove all units of this sysfs path */
> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
> +-                device_unset_sysfs(d);
> +-                device_set_state(d, DEVICE_DEAD);
> +-        }
> ++        e = unit_name_from_path(path, ".device");
> ++        if (!e)
> ++                return log_oom();
> + 
> ++        u = manager_get_unit(m, e);
> ++        if (!u)
> ++                return 0;
> ++
> ++        device_update_found_one(DEVICE(u), add, found, now);
> +         return 0;
> + }
> + 
> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
> +         return parse_boolean(ready) != 0;
> + }
> + 
> +-static int device_process_new_path(Manager *m, const char *path) {
> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> +-
> +-        assert(m);
> +-        assert(path);
> +-
> +-        dev = udev_device_new_from_syspath(m->udev, path);
> +-        if (!dev)
> +-                return log_oom();
> +-
> +-        if (!device_is_ready(dev))
> +-                return 0;
> +-
> +-        return device_process_new_device(m, dev);
> +-}
> +-
> + static Unit *device_following(Unit *u) {
> +         Device *d = DEVICE(u);
> +         Device *other, *first = NULL;
> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
> +                 goto fail;
> + 
> +         first = udev_enumerate_get_list_entry(e);
> +-        udev_list_entry_foreach(item, first)
> +-                device_process_new_path(m, udev_list_entry_get_name(item));
> ++        udev_list_entry_foreach(item, first) {
> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> ++                const char *sysfs;
> ++
> ++                sysfs = udev_list_entry_get_name(item);
> ++
> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
> ++                if (!dev) {
> ++                        log_oom();
> ++                        continue;
> ++                }
> ++
> ++                if (!device_is_ready(dev))
> ++                        continue;
> ++
> ++                (void) device_process_new(m, dev);
> ++
> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
> ++        }
> + 
> +         return 0;
> + 
> + fail:
> ++        log_error_errno(r, "Failed to enumerate devices: %m");
> ++
> +         device_shutdown(m);
> +         return r;
> + }
> +@@ -619,7 +634,7 @@ fail:
> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> +         Manager *m = userdata;
> +-        const char *action;
> ++        const char *action, *sysfs;
> +         int r;
> + 
> +         assert(m);
> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> +         if (!dev)
> +                 return 0;
> + 
> ++        sysfs = udev_device_get_syspath(dev);
> ++        if (!sysfs) {
> ++                log_error("Failed to get udev sys path.");
> ++                return 0;
> ++        }
> ++
> +         action = udev_device_get_action(dev);
> +         if (!action) {
> +                 log_error("Failed to get udev action string.");
> +                 return 0;
> +         }
> + 
> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
> +-                r = device_process_removed_device(m, dev);
> +-                if (r < 0)
> +-                        log_error_errno(r, "Failed to process device remove event: %m");
> +-
> +-                r = swap_process_removed_device(m, dev);
> ++        if (streq(action, "remove"))  {
> ++                r = swap_process_device_remove(m, dev);
> +                 if (r < 0)
> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
> + 
> +-        } else {
> +-                r = device_process_new_device(m, dev);
> +-                if (r < 0)
> +-                        log_error_errno(r, "Failed to process device new event: %m");
> ++                /* If we get notified that a device was removed by
> ++                 * udev, then it's completely gone, hence unset all
> ++                 * found bits */
> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
> + 
> +-                r = swap_process_new_device(m, dev);
> ++        } else if (device_is_ready(dev)) {
> ++
> ++                (void) device_process_new(m, dev);
> ++
> ++                r = swap_process_device_new(m, dev);
> +                 if (r < 0)
> +                         log_error_errno(r, "Failed to process swap device new event: %m");
> + 
> +                 manager_dispatch_load_queue(m);
> + 
> +-                device_set_path_plugged(m, dev);
> ++                /* The device is found now, set the udev found bit */
> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
> ++
> ++        } else {
> ++                /* The device is nominally around, but not ready for
> ++                 * us. Hence unset the udev bit, but leave the rest
> ++                 * around. */
> ++
> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
> +         }
> + 
> +         return 0;
> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
> +         return read_only <= 0;
> + }
> + 
> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> ++        struct stat st;
> ++
> ++        assert(m);
> ++        assert(node);
> ++
> ++        /* This is called whenever we find a device referenced in
> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
> ++         * mounted/enabled at a time where udev has not finished
> ++         * probing it yet, and we thus haven't learned about it
> ++         * yet. In this case we will set the device unit to
> ++         * "tentative" state. */
> ++
> ++        if (add) {
> ++                if (!path_startswith(node, "/dev"))
> ++                        return 0;
> ++
> ++                if (stat(node, &st) < 0) {
> ++                        if (errno == ENOENT)
> ++                                return 0;
> ++
> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
> ++                }
> ++
> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
> ++                        return 0;
> ++
> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
> ++                if (!dev) {
> ++                        if (errno == ENOENT)
> ++                                return 0;
> ++
> ++                        return log_oom();
> ++                }
> ++
> ++                /* If the device is known in the kernel and newly
> ++                 * appeared, then we'll create a device unit for it,
> ++                 * under the name referenced in /proc/swaps or
> ++                 * /proc/self/mountinfo. */
> ++
> ++                (void) device_setup_unit(m, dev, node, false);
> ++        }
> ++
> ++        /* Update the device unit's state, should it exist */
> ++        return device_update_found_by_name(m, node, add, found, now);
> ++}
> ++
> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
> +         [DEVICE_DEAD] = "dead",
> +-        [DEVICE_PLUGGED] = "plugged"
> ++        [DEVICE_TENTATIVE] = "tentative",
> ++        [DEVICE_PLUGGED] = "plugged",
> + };
> + 
> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
> +diff --git a/src/core/device.h b/src/core/device.h
> +index bb7ae07..0609b20 100644
> +--- a/src/core/device.h
> ++++ b/src/core/device.h
> +@@ -29,20 +29,28 @@ typedef struct Device Device;
> +  * simplifies the state engine greatly */
> + typedef enum DeviceState {
> +         DEVICE_DEAD,
> +-        DEVICE_PLUGGED,
> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
> ++        DEVICE_PLUGGED,   /* announced by udev */
> +         _DEVICE_STATE_MAX,
> +         _DEVICE_STATE_INVALID = -1
> + } DeviceState;
> + 
> ++typedef enum DeviceFound {
> ++        DEVICE_NOT_FOUND = 0,
> ++        DEVICE_FOUND_UDEV = 1,
> ++        DEVICE_FOUND_MOUNT = 2,
> ++        DEVICE_FOUND_SWAP = 4,
> ++} DeviceFound;
> ++
> + struct Device {
> +         Unit meta;
> + 
> +         char *sysfs;
> ++        DeviceFound found;
> + 
> +         /* In order to be able to distinguish dependencies on
> +         different device nodes we might end up creating multiple
> +         devices for the same sysfs path. We chain them up here. */
> +-
> +         LIST_FIELDS(struct Device, same_sysfs);
> + 
> +         DeviceState state;
> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
> + 
> + const char* device_state_to_string(DeviceState i) _const_;
> + DeviceState device_state_from_string(const char *s) _pure_;
> ++
> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
> +diff --git a/src/core/mount.c b/src/core/mount.c
> +index f3977e6..c971330 100644
> +--- a/src/core/mount.c
> ++++ b/src/core/mount.c
> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
> +         return 0;
> + }
> + 
> +-static int mount_add_one(
> ++static int mount_setup_unit(
> +                 Manager *m,
> +                 const char *what,
> +                 const char *where,
> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
> + 
> +                 u = unit_new(m, sizeof(Mount));
> +                 if (!u)
> +-                        return -ENOMEM;
> ++                        return log_oom();
> + 
> +                 r = unit_add_name(u, e);
> +                 if (r < 0)
> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
> +         return 0;
> + 
> + fail:
> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
> ++
> +         if (delete && u)
> +                 unit_free(u);
> + 
> +@@ -1554,33 +1556,36 @@ fail:
> + }
> + 
> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
> +-        struct libmnt_fs *fs;
> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
> +         int r = 0;
> + 
> +         assert(m);
> + 
> +-        tb = mnt_new_table();
> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
> +-        if (!tb || !itr)
> ++        t = mnt_new_table();
> ++        if (!t)
> +                 return log_oom();
> + 
> +-        r = mnt_table_parse_mtab(tb, NULL);
> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
> ++        if (!i)
> ++                return log_oom();
> ++
> ++        r = mnt_table_parse_mtab(t, NULL);
> +         if (r < 0)
> +-                return r;
> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
> + 
> +         r = 0;
> +         for (;;) {
> +                 const char *device, *path, *options, *fstype;
> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
> ++                struct libmnt_fs *fs;
> +                 int k;
> + 
> +-                k = mnt_table_next_fs(tb, itr, &fs);
> ++                k = mnt_table_next_fs(t, i, &fs);
> +                 if (k == 1)
> +                         break;
> +-                else if (k < 0)
> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
> ++                if (k < 0)
> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
> + 
> +                 device = mnt_fs_get_source(fs);
> +                 path = mnt_fs_get_target(fs);
> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> +                 fstype = mnt_fs_get_fstype(fs);
> + 
> +                 d = cunescape(device);
> ++                if (!d)
> ++                        return log_oom();
> ++
> +                 p = cunescape(path);
> +-                if (!d || !p)
> ++                if (!p)
> +                         return log_oom();
> + 
> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
> ++
> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
> +                 if (r == 0 && k < 0)
> +                         r = k;
> +         }
> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> + 
> +         r = mount_load_proc_self_mountinfo(m, true);
> +         if (r < 0) {
> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
> +-
> +                 /* Reset flags, just in case, for later calls */
> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
> +                         Mount *mount = MOUNT(u);
> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> +                                 break;
> +                         }
> + 
> ++                        if (mount->parameters_proc_self_mountinfo.what)
> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
> ++
> ++
> +                 } else if (mount->just_mounted || mount->just_changed) {
> + 
> +                         /* New or changed mount entry */
> +diff --git a/src/core/swap.c b/src/core/swap.c
> +index 6997921..5c19af5 100644
> +--- a/src/core/swap.c
> ++++ b/src/core/swap.c
> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
> +         return swap_verify(s);
> + }
> + 
> +-static int swap_add_one(
> ++static int swap_setup_unit(
> +                 Manager *m,
> +                 const char *what,
> +                 const char *what_proc_swaps,
> +@@ -363,8 +363,10 @@ static int swap_add_one(
> + 
> +         if (u &&
> +             SWAP(u)->from_proc_swaps &&
> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
> +                 return -EEXIST;
> ++        }
> + 
> +         if (!u) {
> +                 delete = true;
> +@@ -379,7 +381,7 @@ static int swap_add_one(
> + 
> +                 SWAP(u)->what = strdup(what);
> +                 if (!SWAP(u)->what) {
> +-                        r = log_oom();
> ++                        r = -ENOMEM;
> +                         goto fail;
> +                 }
> + 
> +@@ -407,7 +409,6 @@ static int swap_add_one(
> +         p->priority = priority;
> + 
> +         unit_add_to_dbus_queue(u);
> +-
> +         return 0;
> + 
> + fail:
> +@@ -419,7 +420,7 @@ fail:
> +         return r;
> + }
> + 
> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
> +         struct udev_list_entry *item = NULL, *first = NULL;
> +         const char *dn;
> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> + 
> +         assert(m);
> + 
> +-        r = swap_add_one(m, device, device, prio, set_flags);
> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
> +         if (r < 0)
> +                 return r;
> + 
> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> +         /* Add the main device node */
> +         dn = udev_device_get_devnode(d);
> +         if (dn && !streq(dn, device))
> +-                swap_add_one(m, dn, device, prio, set_flags);
> ++                swap_setup_unit(m, dn, device, prio, set_flags);
> + 
> +         /* Add additional units for all symlinks */
> +         first = udev_device_get_devlinks_list_entry(d);
> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> +                             st.st_rdev != udev_device_get_devnum(d))
> +                                 continue;
> + 
> +-                swap_add_one(m, p, device, prio, set_flags);
> ++                swap_setup_unit(m, p, device, prio, set_flags);
> +         }
> + 
> +         return r;
> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
> +                         if (k == EOF)
> +                                 break;
> + 
> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
> +                         continue;
> +                 }
> + 
> +                 d = cunescape(dev);
> +                 if (!d)
> +-                        return -ENOMEM;
> ++                        return log_oom();
> ++
> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
> + 
> +-                k = swap_process_new_swap(m, d, prio, set_flags);
> ++                k = swap_process_new(m, d, prio, set_flags);
> +                 if (k < 0)
> +                         r = k;
> +         }
> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
> +                                 break;
> +                         }
> + 
> ++                        if (swap->what)
> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
> ++
> +                 } else if (swap->just_activated) {
> + 
> +                         /* New swap entry */
> +@@ -1298,7 +1304,7 @@ fail:
> +         return r;
> + }
> + 
> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
> +         struct udev_list_entry *item = NULL, *first = NULL;
> +         _cleanup_free_ char *e = NULL;
> +         const char *dn;
> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
> +         return r;
> + }
> + 
> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
> +         const char *dn;
> +         int r = 0;
> +         Swap *s;
> +diff --git a/src/core/swap.h b/src/core/swap.h
> +index 73e64d8..914a2db 100644
> +--- a/src/core/swap.h
> ++++ b/src/core/swap.h
> +@@ -116,8 +116,8 @@ struct Swap {
> + 
> + extern const UnitVTable swap_vtable;
> + 
> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
> + 
> + const char* swap_state_to_string(SwapState i) _const_;
> + SwapState swap_state_from_string(const char *s) _pure_;
> +diff --git a/src/core/unit.c b/src/core/unit.c
> +index 563f6fe..a6558ee 100644
> +--- a/src/core/unit.c
> ++++ b/src/core/unit.c
> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> +                 return -ENOMEM;
> + 
> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
> +-
> +         if (r < 0)
> +                 return r;
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> new file mode 100644
> index 0000000..d614085
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> @@ -0,0 +1,26 @@
> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> +Date: Sat, 28 Feb 2015 23:39:55 +0100
> +Subject: [PATCH 18/26] core: fix return value on OOM
> +
> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
> +---
> + src/core/device.c | 2 ++
> + 1 file changed, 2 insertions(+)
> +
> +diff --git a/src/core/device.c b/src/core/device.c
> +index 75b9a46..1cc103c 100644
> +--- a/src/core/device.c
> ++++ b/src/core/device.c
> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
> +                         j = strjoin(model, " ", label, NULL);
> +                         if (j)
> +                                 r = unit_set_description(u, j);
> ++                        else
> ++                                r = -ENOMEM;
> +                 } else
> +                         r = unit_set_description(u, model);
> +         } else
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> new file mode 100644
> index 0000000..d94da60
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> @@ -0,0 +1,33 @@
> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
> +Date: Thu, 19 Feb 2015 20:47:28 +0100
> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
> + bus on dbus1
> +
> +This fixes "machinectl login" on systems configured with --disable-kdbus.
> +
> +The error was:
> +machinectl login foo
> +Failed to get machine PTY: Input/output error
> +
> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
> +---
> + src/machine/machine-dbus.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
> +index b46f0a8..b0f0f66 100644
> +--- a/src/machine/machine-dbus.c
> ++++ b/src/machine/machine-dbus.c
> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
> + #ifdef ENABLE_KDBUS
> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
> + #else
> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
> + #endif
> +         if (!container_bus->address)
> +                 return -ENOMEM;
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> new file mode 100644
> index 0000000..fcc2adf
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> @@ -0,0 +1,25 @@
> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> +Date: Fri, 20 Feb 2015 15:35:11 -0300
> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
> +
> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
> +---
> + src/shared/util.c | 1 +
> + 1 file changed, 1 insertion(+)
> +
> +diff --git a/src/shared/util.c b/src/shared/util.c
> +index ba035ca..f24b5b4 100644
> +--- a/src/shared/util.c
> ++++ b/src/shared/util.c
> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
> + 
> + bool fstype_is_network(const char *fstype) {
> +         static const char table[] =
> ++                "afs\0"
> +                 "cifs\0"
> +                 "smbfs\0"
> +                 "sshfs\0"
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> new file mode 100644
> index 0000000..02e279d
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> @@ -0,0 +1,31 @@
> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
> +Date: Fri, 20 Feb 2015 10:53:28 +0100
> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
> +
> +Otherwise every daemon reload prints out warnings like:
> +
> +systemd[1]: Unit type .busname is not supported on this system.
> +systemd[1]: Unit type .swap is not supported on this system.
> +
> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
> +---
> + src/core/manager.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/core/manager.c b/src/core/manager.c
> +index 4775219..bc9b7ec 100644
> +--- a/src/core/manager.c
> ++++ b/src/core/manager.c
> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
> +                 int q;
> + 
> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> +                         continue;
> +                 }
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> new file mode 100644
> index 0000000..f5afd09
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> @@ -0,0 +1,97 @@
> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Mon, 2 Mar 2015 10:34:51 -0500
> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
> +
> +Binary fields were not processed properly, and resulting journal files
> +were non-conforming, resulting in an error ("Invalid field.") when reading.
> +
> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
> +---
> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
> + src/journal-remote/journal-remote-parse.h |  4 +++-
> + 2 files changed, 21 insertions(+), 14 deletions(-)
> +
> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
> +index d9dea8d..afded7e 100644
> +--- a/src/journal-remote/journal-remote-parse.c
> ++++ b/src/journal-remote/journal-remote-parse.c
> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
> +                    LLLLLLLL0011223344...\n
> +                 */
> +                 sep = memchr(line, '=', n);
> +-                if (sep)
> ++                if (sep) {
> +                         /* chomp newline */
> +                         n--;
> +-                else
> ++
> ++                        r = iovw_put(&source->iovw, line, n);
> ++                        if (r < 0)
> ++                                return r;
> ++                } else {
> +                         /* replace \n with = */
> +                         line[n-1] = '=';
> +-                log_trace("Received: %.*s", (int) n, line);
> + 
> +-                r = iovw_put(&source->iovw, line, n);
> +-                if (r < 0) {
> +-                        log_error("Failed to put line in iovect");
> +-                        return r;
> ++                        source->field_len = n;
> ++                        source->state = STATE_DATA_START;
> ++
> ++                        /* we cannot put the field in iovec until we have all data */
> +                 }
> + 
> +-                if (!sep)
> +-                        source->state = STATE_DATA_START;
> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
> ++
> +                 return 0; /* continue */
> +         }
> + 
> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
> + 
> +         case STATE_DATA: {
> +                 void *data;
> ++                char *field;
> + 
> +                 assert(source->data_size > 0);
> + 
> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
> + 
> +                 assert(data);
> + 
> +-                r = iovw_put(&source->iovw, data, source->data_size);
> +-                if (r < 0) {
> +-                        log_error("failed to put binary buffer in iovect");
> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
> ++
> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
> ++                if (r < 0)
> +                         return r;
> +-                }
> + 
> +                 source->state = STATE_DATA_FINISH;
> + 
> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
> +index 8499f4e..22db550 100644
> +--- a/src/journal-remote/journal-remote-parse.h
> ++++ b/src/journal-remote/journal-remote-parse.h
> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
> +         size_t offset;     /* offset to the beginning of live data in the buffer */
> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
> +         size_t filled;     /* total number of bytes in the buffer */
> +-        size_t data_size;  /* size of the binary data chunk being processed */
> ++
> ++        size_t field_len;  /* used for binary fields: the field name length */
> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
> + 
> +         struct iovec_wrapper iovw;
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> new file mode 100644
> index 0000000..79e565b
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> @@ -0,0 +1,37 @@
> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> +Date: Sun, 1 Mar 2015 21:13:10 -0300
> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
> +
> +Logs constantly show
> +
> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
> +
> +This is because ext4 does not support FS_NOCOW_FL.
> +
> +[zj: fold into one conditional as suggested on the ML and
> +     fix (preexisting) r/errno confusion in error message.]
> +
> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
> +---
> + src/journal/journal-file.c | 4 ++--
> + 1 file changed, 2 insertions(+), 2 deletions(-)
> +
> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
> +index 2845e05..0f28718 100644
> +--- a/src/journal/journal-file.c
> ++++ b/src/journal/journal-file.c
> +@@ -2611,8 +2611,8 @@ int journal_file_open(
> +                  * shouldn't be too bad, given that we do our own
> +                  * checksumming). */
> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
> +-                if (r < 0)
> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
> ++                if (r < 0 && r != -ENOTTY)
> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
> + 
> +                 /* Let's attach the creation time to the journal file,
> +                  * so that the vacuuming code knows the age of this
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> new file mode 100644
> index 0000000..0cf9a0a
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> @@ -0,0 +1,53 @@
> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
> +From: Lennart Poettering <lennart@poettering.net>
> +Date: Mon, 2 Mar 2015 20:55:38 +0100
> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
> + happy
> +
> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
> +---
> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
> + 1 file changed, 5 insertions(+), 7 deletions(-)
> +
> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
> +index 028c2a7..22a3a53 100644
> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> +                 .msg_iovlen = 1,
> +                 .msg_name = &sockaddr,
> +         };
> +-        union {
> +-                struct cmsghdr cmsghdr;
> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
> +-        } control;
> ++        struct cmsghdr *control;
> +         _cleanup_close_ int fd = -1;
> +         struct cmsghdr *cmsg = NULL;
> +         const char *e;
> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
> + 
> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
> ++
> +         if (n_fds > 0) {
> +-                msghdr.msg_control = &control;
> ++                msghdr.msg_control = control;
> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
> + 
> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> +                 try_without_ucred = true;
> +                 controllen_without_ucred = msghdr.msg_controllen;
> + 
> +-                msghdr.msg_control = &control;
> ++                msghdr.msg_control = control;
> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
> + 
> +                 if (cmsg)
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> new file mode 100644
> index 0000000..6912489
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> @@ -0,0 +1,84 @@
> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
> +Date: Tue, 3 Mar 2015 00:35:08 +0100
> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
> + filesystems
> +
> +A warning is printed if ACLs cannot be retrieved for any reason other
> +than -ENOSYS. For -ENOSYS, debug log is printed.
> +
> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
> +---
> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
> + 1 file changed, 20 insertions(+), 16 deletions(-)
> +
> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> +index 88ba7e4..187997e 100644
> +--- a/src/tmpfiles/tmpfiles.c
> ++++ b/src/tmpfiles/tmpfiles.c
> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> +         int r;
> +         _cleanup_(acl_free_charpp) char *t = NULL;
> + 
> ++        /* Returns 0 for success, positive error if already warned,
> ++         * negative error otherwise. */
> ++
> +         if (modify) {
> +                 r = acls_for_file(path, type, acl, &dup);
> +                 if (r < 0)
> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> + 
> +         r = acl_set_file(path, type, dup);
> +         if (r < 0)
> +-                return log_error_errno(-errno,
> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
> +-                                       strna(t), path);
> ++                return -log_error_errno(errno,
> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
> ++                                        strna(t), path);
> ++
> +         return 0;
> + }
> + #endif
> + 
> + static int path_set_acls(Item *item, const char *path) {
> ++        int r = 0;
> + #ifdef HAVE_ACL
> +-        int r;
> +-
> +         assert(item);
> +         assert(path);
> + 
> +-        if (item->acl_access) {
> ++        if (item->acl_access)
> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
> +-                if (r < 0)
> +-                        return r;
> +-        }
> + 
> +-        if (item->acl_default) {
> ++        if (r == 0 && item->acl_default)
> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
> +-                if (r < 0)
> +-                        return r;
> +-        }
> +-#endif
> + 
> +-        return 0;
> ++        if (r > 0)
> ++                return -r; /* already warned */
> ++        else if (r == -ENOTSUP) {
> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
> ++                return 0;
> ++        } else if (r < 0)
> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
> ++#endif
> ++        return r;
> + }
> + 
> + static int write_one_file(Item *i, const char *path) {
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> new file mode 100644
> index 0000000..a49a369
> --- /dev/null
> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> @@ -0,0 +1,30 @@
> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> +Date: Tue, 3 Mar 2015 19:07:28 -0500
> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
> + missing
> +
> +On s390 (at least) /sys/class/power_supply is not present. We should
> +treat this like if this directory was empty, and not an error.
> +
> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
> +---
> + src/shared/util.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/shared/util.c b/src/shared/util.c
> +index f24b5b4..8548723 100644
> +--- a/src/shared/util.c
> ++++ b/src/shared/util.c
> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
> + 
> +         d = opendir("/sys/class/power_supply");
> +         if (!d)
> +-                return -errno;
> ++                return errno == ENOENT ? true : -errno;
> + 
> +         for (;;) {
> +                 struct dirent *de;
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
> index 73b930e..9c20b11 100644
> --- a/meta/recipes-core/systemd/systemd_219.bb
> +++ b/meta/recipes-core/systemd/systemd_219.bb
> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
>             file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
>             file://0010-Make-root-s-home-directory-configurable.patch \
>             file://0011-systemd-user-avoid-using-system-auth.patch \
> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
>             file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
>             file://0014-Revert-rules-remove-firmware-loading-rules.patch \
>             file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
>             file://tmpfiles-pam.patch \
> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
>  
>  S = "${WORKDIR}/git"
>  
> +# Appending backport fixes released for version 219-stable
> +SRC_URI_append = "\
> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
> +           file://0008-bootchart-fix-default-init-path.patch \
> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
> +           file://0017-core-rework-device-state-logic.patch \
> +           file://0018-core-fix-return-value-on-OOM.patch \
> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
> +           "
> +
>  SRC_URI_append_libc-uclibc = "\
>              file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
>             "
> -- 
> 1.9.1
> 




^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-03-31 20:21 ` Bottazzini, Bruno
@ 2015-03-31 20:25   ` Otavio Salvador
  2015-04-01 21:08     ` Bottazzini, Bruno
  0 siblings, 1 reply; 12+ messages in thread
From: Otavio Salvador @ 2015-03-31 20:25 UTC (permalink / raw)
  To: Bottazzini, Bruno; +Cc: Patches and discussions about the oe-core layer

I am not a heavy user of systemd so I prefer other people (Khem?) to
comment on this ...

On Tue, Mar 31, 2015 at 5:21 PM, Bottazzini, Bruno
<bruno.bottazzini@intel.com> wrote:
> Ping
>
> On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
>> Adding patches that fix bugs for 219 version.
>> This will get the same consistency of the stable systemd 219 version.
>>
>> More details:
>> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
>> ---
>>  ...remote-fix-certificate-status-memory-leak.patch |  31 +
>>  ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
>>  ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
>>  ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
>>  ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
>>  .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
>>  ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
>>  .../0008-bootchart-fix-default-init-path.patch     |  44 +
>>  ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
>>  ...0-Make-root-s-home-directory-configurable.patch |  89 +-
>>  ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
>>  ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
>>  ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
>>  ...aker-dependencies-between-mount-and-devic.patch |  33 +
>>  ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
>>  ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
>>  ...l-add-some-hints-how-to-override-settings.patch |  39 +
>>  .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
>>  .../0018-core-fix-return-value-on-OOM.patch        |  26 +
>>  ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
>>  ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
>>  ...downgrade-unit-type-not-supported-message.patch |  31 +
>>  ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
>>  ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
>>  ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
>>  ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
>>  ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
>>  meta/recipes-core/systemd/systemd_219.bb           |  33 +-
>>  28 files changed, 2050 insertions(+), 55 deletions(-)
>>  create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>>  create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
>>
>> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>> new file mode 100644
>> index 0000000..172bea2
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>> @@ -0,0 +1,31 @@
>> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
>> +From: Michal Schmidt <mschmidt@redhat.com>
>> +Date: Tue, 17 Feb 2015 10:33:01 +0100
>> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
>> +
>> +The output of gnutls_certificate_verification_status_print() needs to be
>> +freed.
>> +
>> +Noticed this while staring at verify_cert_authorized() to see what could
>> +possibly confuse gcc5 on armv7hl to segfault during compilation.
>> +
>> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
>> +---
>> + src/journal-remote/microhttpd-util.c | 1 +
>> + 1 file changed, 1 insertion(+)
>> +
>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
>> +index 34d9337..de9c6ab 100644
>> +--- a/src/journal-remote/microhttpd-util.c
>> ++++ b/src/journal-remote/microhttpd-util.c
>> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
>> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
>> +
>> +         log_info("Certificate status: %s", out.data);
>> ++        gnutls_free(out.data);
>> +
>> +         return status == 0 ? 0 : -EPERM;
>> + }
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>> new file mode 100644
>> index 0000000..f615876
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>> @@ -0,0 +1,35 @@
>> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
>> +From: Michal Schmidt <mschmidt@redhat.com>
>> +Date: Tue, 17 Feb 2015 10:36:57 +0100
>> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
>> +
>> +Found by Valgrind while testing the previous memory leak fix.
>> +
>> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
>> +---
>> + src/journal-remote/microhttpd-util.c | 6 +++++-
>> + 1 file changed, 5 insertions(+), 1 deletion(-)
>> +
>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
>> +index de9c6ab..a95fff1 100644
>> +--- a/src/journal-remote/microhttpd-util.c
>> ++++ b/src/journal-remote/microhttpd-util.c
>> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
>> +         return 0;
>> + }
>> +
>> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
>> ++        gnutls_x509_crt_deinit(*p);
>> ++}
>> ++
>> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
>> +         const union MHD_ConnectionInfo *ci;
>> +         gnutls_session_t session;
>> +-        gnutls_x509_crt_t client_cert;
>> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
>> +         _cleanup_free_ char *buf = NULL;
>> +         int r;
>> +
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>> new file mode 100644
>> index 0000000..15fa98c
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>> @@ -0,0 +1,28 @@
>> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
>> +From: Martin Pitt <martin.pitt@ubuntu.com>
>> +Date: Tue, 17 Feb 2015 12:47:51 +0100
>> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
>> +
>> +parse_acl() returns the error instead of setting errno.
>> +
>> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
>> +---
>> + src/tmpfiles/tmpfiles.c | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
>> +index c948d4d..88ba7e4 100644
>> +--- a/src/tmpfiles/tmpfiles.c
>> ++++ b/src/tmpfiles/tmpfiles.c
>> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
>> +          * afterwards, so the mask can be added now if necessary. */
>> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
>> +         if (r < 0)
>> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
>> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
>> +                                   item->argument);
>> + #else
>> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>> new file mode 100644
>> index 0000000..f43068d
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>> @@ -0,0 +1,26 @@
>> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
>> +From: Tom Gundersen <teg@jklm.no>
>> +Date: Wed, 18 Feb 2015 14:33:50 +0100
>> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
>> +
>> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
>> +---
>> + src/test/test-utf8.c | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
>> +index befa385..346f852 100644
>> +--- a/src/test/test-utf8.c
>> ++++ b/src/test/test-utf8.c
>> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
>> +
>> + static void test_utf16_to_utf8(void) {
>> +         char *a = NULL;
>> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
>> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
>> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
>> +
>> +         a = utf16_to_utf8(utf16, 14);
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>> new file mode 100644
>> index 0000000..35fe913
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>> @@ -0,0 +1,131 @@
>> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>> +Date: Mon, 23 Feb 2015 23:19:54 -0500
>> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
>> +
>> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
>> +https://bugs.debian.org/778656
>> +
>> +Status quo ante can be restored with:
>> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
>> +
>> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
>> +---
>> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
>> + src/shared/acl-util.h |  4 +++
>> + 2 files changed, 81 insertions(+), 2 deletions(-)
>> +
>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
>> +index a4ff1ab..cbe09d7 100644
>> +--- a/src/shared/acl-util.c
>> ++++ b/src/shared/acl-util.c
>> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
>> +         return 0;
>> + }
>> +
>> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
>> ++        acl_tag_t tag_a, tag_b;
>> ++
>> ++        if (acl_get_tag_type(a, &tag_a) < 0)
>> ++                return -errno;
>> ++
>> ++        if (acl_get_tag_type(b, &tag_b) < 0)
>> ++                return -errno;
>> ++
>> ++        if (tag_a != tag_b)
>> ++                return false;
>> ++
>> ++        switch (tag_a) {
>> ++        case ACL_USER_OBJ:
>> ++        case ACL_GROUP_OBJ:
>> ++        case ACL_MASK:
>> ++        case ACL_OTHER:
>> ++                /* can have only one of those */
>> ++                return true;
>> ++        case ACL_USER: {
>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
>> ++
>> ++                uid_a = acl_get_qualifier(a);
>> ++                if (!uid_a)
>> ++                        return -errno;
>> ++
>> ++                uid_b = acl_get_qualifier(b);
>> ++                if (!uid_b)
>> ++                        return -errno;
>> ++
>> ++                return *uid_a == *uid_b;
>> ++        }
>> ++        case ACL_GROUP: {
>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
>> ++
>> ++                gid_a = acl_get_qualifier(a);
>> ++                if (!gid_a)
>> ++                        return -errno;
>> ++
>> ++                gid_b = acl_get_qualifier(b);
>> ++                if (!gid_b)
>> ++                        return -errno;
>> ++
>> ++                return *gid_a == *gid_b;
>> ++        }
>> ++        default:
>> ++                assert_not_reached("Unknown acl tag type");
>> ++        }
>> ++}
>> ++
>> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
>> ++        acl_entry_t i;
>> ++        int r;
>> ++
>> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
>> ++             r > 0;
>> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
>> ++
>> ++                r = acl_entry_equal(i, entry);
>> ++                if (r < 0)
>> ++                        return r;
>> ++                if (r > 0) {
>> ++                        *out = i;
>> ++                        return 1;
>> ++                }
>> ++        }
>> ++        if (r < 0)
>> ++                return -errno;
>> ++        return 0;
>> ++}
>> ++
>> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
>> +         _cleanup_(acl_freep) acl_t old;
>> +         acl_entry_t i;
>> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
>> +
>> +                 acl_entry_t j;
>> +
>> +-                if (acl_create_entry(&old, &j) < 0)
>> +-                        return -errno;
>> ++                r = find_acl_entry(old, i, &j);
>> ++                if (r < 0)
>> ++                        return r;
>> ++                if (r == 0)
>> ++                        if (acl_create_entry(&old, &j) < 0)
>> ++                                return -errno;
>> +
>> +                 if (acl_copy_entry(j, i) < 0)
>> +                         return -errno;
>> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
>> +index 90e88ff..fdb9006 100644
>> +--- a/src/shared/acl-util.h
>> ++++ b/src/shared/acl-util.h
>> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
>> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
>> + #define acl_free_charp acl_free
>> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
>> ++#define acl_free_uid_tp acl_free
>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
>> ++#define acl_free_gid_tp acl_free
>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
>> +
>> + #endif
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>> new file mode 100644
>> index 0000000..fc707bb
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>> @@ -0,0 +1,32 @@
>> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
>> +From: Daniel Mack <daniel@zonque.org>
>> +Date: Tue, 24 Feb 2015 13:26:09 +0100
>> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
>> +
>> +  CC       src/shared/libsystemd_shared_la-time-util.lo
>> +src/shared/time-util.c: In function 'parse_nsec':
>> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
>> +                 if (!*s != 0)
>> +                         ^
>> +
>> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
>> +---
>> + src/shared/time-util.c | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
>> +index 947ac1f..1c36c57 100644
>> +--- a/src/shared/time-util.c
>> ++++ b/src/shared/time-util.c
>> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
>> +         s = startswith(p, "infinity");
>> +         if (s) {
>> +                 s += strspn(s, WHITESPACE);
>> +-                if (!*s != 0)
>> ++                if (*s != 0)
>> +                         return -EINVAL;
>> +
>> +                 *nsec = NSEC_INFINITY;
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>> new file mode 100644
>> index 0000000..161b7b5
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>> @@ -0,0 +1,36 @@
>> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
>> +From: Daniel Mack <daniel@zonque.org>
>> +Date: Tue, 24 Feb 2015 13:27:10 +0100
>> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
>> +
>> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
>> +---
>> + src/test/test-time.c | 6 ++++++
>> + 1 file changed, 6 insertions(+)
>> +
>> +diff --git a/src/test/test-time.c b/src/test/test-time.c
>> +index 8cfc4cc..3840fff 100644
>> +--- a/src/test/test-time.c
>> ++++ b/src/test/test-time.c
>> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
>> +         assert_se(u == 2);
>> +         assert_se(parse_nsec(".7", &u) >= 0);
>> +         assert_se(u == 0);
>> ++        assert_se(parse_nsec("infinity", &u) >= 0);
>> ++        assert_se(u == NSEC_INFINITY);
>> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
>> ++        assert_se(u == NSEC_INFINITY);
>> +
>> +         assert_se(parse_nsec(" xyz ", &u) < 0);
>> +         assert_se(parse_nsec("", &u) < 0);
>> +         assert_se(parse_nsec(" . ", &u) < 0);
>> +         assert_se(parse_nsec(" 5. ", &u) < 0);
>> +         assert_se(parse_nsec(".s ", &u) < 0);
>> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
>> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
>> + }
>> +
>> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>> new file mode 100644
>> index 0000000..7eaad1e
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>> @@ -0,0 +1,44 @@
>> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
>> +From: Martin Pitt <martin.pitt@ubuntu.com>
>> +Date: Tue, 24 Feb 2015 14:30:10 +0100
>> +Subject: [PATCH 08/26] bootchart: fix default init path
>> +
>> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
>> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
>> +multi-arch systems.
>> +
>> +https://launchpad.net/bugs/1423867
>> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
>> +---
>> + Makefile.am               | 1 +
>> + src/bootchart/bootchart.c | 2 +-
>> + 2 files changed, 2 insertions(+), 1 deletion(-)
>> +
>> +diff --git a/Makefile.am b/Makefile.am
>> +index bf04d31..cc577ce 100644
>> +--- a/Makefile.am
>> ++++ b/Makefile.am
>> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
>> +     -DKEXEC=\"$(KEXEC)\" \
>> +     -DLIBDIR=\"$(libdir)\" \
>> +     -DROOTLIBDIR=\"$(rootlibdir)\" \
>> ++    -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
>> +     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
>> +     -I $(top_srcdir)/src \
>> +     -I $(top_builddir)/src/shared \
>> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
>> +index 64a384b..175be68 100644
>> +--- a/src/bootchart/bootchart.c
>> ++++ b/src/bootchart/bootchart.c
>> +@@ -76,7 +76,7 @@ int sysfd=-1;
>> + #define DEFAULT_HZ 25.0
>> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
>> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
>> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
>> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
>> + #define DEFAULT_OUTPUT "/run/log"
>> +
>> + /* graph defaults */
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>> new file mode 100644
>> index 0000000..dbffa5b
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>> @@ -0,0 +1,44 @@
>> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>> +Date: Tue, 24 Feb 2015 10:10:04 -0500
>> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
>> +
>> +It is not necessary when running as telinit, etc.
>> +
>> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
>> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
>> +---
>> + src/systemctl/systemctl.c | 10 +++++-----
>> + 1 file changed, 5 insertions(+), 5 deletions(-)
>> +
>> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
>> +index 21cb898..6b93ec8 100644
>> +--- a/src/systemctl/systemctl.c
>> ++++ b/src/systemctl/systemctl.c
>> +@@ -7204,6 +7204,11 @@ found:
>> +                 }
>> +         }
>> +
>> ++        /* Increase max number of open files to 16K if we can, we
>> ++         * might needs this when browsing journal files, which might
>> ++         * be split up into many files. */
>> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
>> ++
>> +         return verb->dispatch(bus, argv + optind);
>> + }
>> +
>> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
>> +                 goto finish;
>> +         }
>> +
>> +-        /* Increase max number of open files to 16K if we can, we
>> +-         * might needs this when browsing journal files, which might
>> +-         * be split up into many files. */
>> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
>> +-
>> +         if (!avoid_bus())
>> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
>> +
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
>> index 41b9039..ff2871b 100644
>> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
>> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
>> @@ -1,7 +1,7 @@
>> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
>> -From: Khem Raj <raj.khem@gmail.com>
>> -Date: Fri, 20 Feb 2015 05:24:49 +0000
>> -Subject: [PATCH 10/11] Make root's home directory configurable
>> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
>> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
>> +Date: Thu, 5 Mar 2015 17:38:12 -0300
>> +Subject: [PATCH] Make root's home directory configurable
>>
>>  OpenEmbedded has a configurable home directory for root. Allow
>>  systemd to be built using its idea of what root's home directory
>> @@ -9,32 +9,31 @@ should be.
>>
>>  Upstream-Status: Pending
>>
>> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
>> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
>> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
>> +compatbile with systemd 219-stable
>>  ---
>> - Makefile.am                       | 2 ++
>> - configure.ac                      | 7 +++++++
>> - src/core/unit-printf.c            | 2 +-
>> - src/nspawn/nspawn.c               | 4 ++--
>> - src/shared/util.c                 | 4 ++--
>> - units/console-shell.service.m4.in | 4 ++--
>> - units/emergency.service.in        | 4 ++--
>> - units/rescue.service.in           | 4 ++--
>> - 8 files changed, 20 insertions(+), 11 deletions(-)
>> + Makefile.am                | 2 ++
>> + configure.ac               | 7 +++++++
>> + src/core/unit-printf.c     | 2 +-
>> + src/nspawn/nspawn.c        | 5 ++---
>> + src/shared/util.c          | 4 ++--
>> + units/emergency.service.in | 4 ++--
>> + units/rescue.service.in    | 4 ++--
>> + 7 files changed, 18 insertions(+), 10 deletions(-)
>>
>>  diff --git a/Makefile.am b/Makefile.am
>> -index 0fb3f9f..4623963 100644
>> +index 93c0509..31ea94d 100644
>>  --- a/Makefile.am
>>  +++ b/Makefile.am
>> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
>> -     -DKEXEC=\"$(KEXEC)\" \
>> -     -DLIBDIR=\"$(libdir)\" \
>> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
>>       -DROOTLIBDIR=\"$(rootlibdir)\" \
>> -+    -DROOTHOMEDIR=\"$(roothomedir)\" \
>> +     -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
>>       -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
>> ++    -DROOTHOMEDIR=\"$(roothomedir)\" \
>>       -I $(top_srcdir)/src \
>>       -I $(top_builddir)/src/shared \
>> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
>> +     -I $(top_srcdir)/src/shared \
>> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
>>   substitutions = \
>>          '|rootlibexecdir=$(rootlibexecdir)|' \
>>          '|rootbindir=$(rootbindir)|' \
>> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
>>          '|SYSTEMCTL=$(rootbindir)/systemctl|' \
>>          '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
>>  diff --git a/configure.ac b/configure.ac
>> -index a5b2e6e..55bb7d8 100644
>> +index 01ee8dc..800a587 100644
>>  --- a/configure.ac
>>  +++ b/configure.ac
>> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
>> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
>>           [],
>>           [with_rootlibdir=${libdir}])
>>
>> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
>>   AC_ARG_WITH([pamlibdir],
>>           AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
>>           [],
>> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
>> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
>>   AC_SUBST([pamconfdir], [$with_pamconfdir])
>>   AC_SUBST([rootprefix], [$with_rootprefix])
>>   AC_SUBST([rootlibdir], [$with_rootlibdir])
>> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
>>
>>   AC_CONFIG_FILES([
>>           Makefile po/Makefile.in
>> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
>> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
>>           include_prefix:          ${INCLUDE_PREFIX}
>>           lib dir:                 ${libdir}
>>           rootlib dir:             ${with_rootlibdir}
>> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
>>           SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
>>           Build Python:            ${PYTHON}
>>  diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
>> -index 97135db..14d12f1 100644
>> +index 7736899..ac5f008 100644
>>  --- a/src/core/unit-printf.c
>>  +++ b/src/core/unit-printf.c
>> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
>> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
>>                    * best of it if we can, but fail if we can't */
>>
>>                   if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
>> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
>>                           return -ENOTSUP;
>>
>>  diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
>> -index b597edb..0b32673 100644
>> +index 08bfdcf..b44b4cd 100644
>>  --- a/src/nspawn/nspawn.c
>>  +++ b/src/nspawn/nspawn.c
>> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
>> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
>> +                         r = change_uid_gid(&home);
>>                           if (r < 0)
>>                                   _exit(EXIT_FAILURE);
>> -
>> +-
>>  -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
>>  +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
>>                               (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
>>                               (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
>>                                   log_oom();
>> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
>> -                                 execvp(argv[optind], argv + optind);
>> - #endif /* HAVE_EXECVPE */
>> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
>> +                         } else if (argc > optind)
>> +                                 execvpe(argv[optind], argv + optind, env_use);
>>                           else {
>>  -                                chdir(home ? home : "/root");
>>  +                                chdir(home ? home : ROOTHOMEDIR);
>> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
>>                                   execle("/bin/sh", "-sh", NULL, env_use);
>>                           }
>>  diff --git a/src/shared/util.c b/src/shared/util.c
>> -index cbbe3b1..a0e3cc5 100644
>> +index 241e752..00adab6 100644
>>  --- a/src/shared/util.c
>>  +++ b/src/shared/util.c
>> -@@ -4609,7 +4609,7 @@ int get_user_creds(
>> +@@ -4604,7 +4604,7 @@ int get_user_creds(
>>                           *gid = 0;
>>
>>                   if (home)
>> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
>>
>>                   if (shell)
>>                           *shell = "/bin/sh";
>> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
>> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
>>           /* Hardcode home directory for root to avoid NSS */
>>           u = getuid();
>>           if (u == 0) {
>> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
>>                   if (!h)
>>                           return -ENOMEM;
>>
>> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
>> -index 5c80722..efde5f0 100644
>> ---- a/units/console-shell.service.m4.in
>> -+++ b/units/console-shell.service.m4.in
>> -@@ -15,8 +15,8 @@ After=rc-local.service
>> - Before=getty.target
>> -
>> - [Service]
>> --Environment=HOME=/root
>> --WorkingDirectory=/root
>> -+Environment=HOME=@roothomedir@
>> -+WorkingDirectory=@roothomedir@
>> - ExecStart=-@SULOGIN@
>> - ExecStopPost=-@SYSTEMCTL@ poweroff
>> - Type=idle
>>  diff --git a/units/emergency.service.in b/units/emergency.service.in
>>  index 2695d7b..7f47b73 100644
>>  --- a/units/emergency.service.in
>> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
>>   ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
>>   ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
>>  --
>> -2.1.4
>> +1.9.1
>>
>> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>> new file mode 100644
>> index 0000000..1e4a69d
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>> @@ -0,0 +1,37 @@
>> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
>> +Date: Tue, 24 Feb 2015 20:40:07 +0100
>> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
>> +
>> +CID#1271344/1271345
>> +
>> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
>> +---
>> + src/shared/acl-util.c | 4 ++--
>> + 1 file changed, 2 insertions(+), 2 deletions(-)
>> +
>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
>> +index cbe09d7..e67e9ac 100644
>> +--- a/src/shared/acl-util.c
>> ++++ b/src/shared/acl-util.c
>> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
>> +                 /* can have only one of those */
>> +                 return true;
>> +         case ACL_USER: {
>> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
>> +
>> +                 uid_a = acl_get_qualifier(a);
>> +                 if (!uid_a)
>> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
>> +                 return *uid_a == *uid_b;
>> +         }
>> +         case ACL_GROUP: {
>> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
>> +
>> +                 gid_a = acl_get_qualifier(a);
>> +                 if (!gid_a)
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>> new file mode 100644
>> index 0000000..dca5e20
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>> @@ -0,0 +1,28 @@
>> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
>> +Date: Tue, 24 Feb 2015 18:32:31 +0200
>> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
>> +
>> +If we have less samples than expected, systemd-bootchart will crash.
>> +
>> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
>> +---
>> + src/bootchart/svg.c | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
>> +index e111fa9..144177c 100644
>> +--- a/src/bootchart/svg.c
>> ++++ b/src/bootchart/svg.c
>> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
>> +
>> +                 ps->sample = ps->sample->next;
>> +                 sample_hz = ps->sample;
>> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
>> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
>> +                         sample_hz = sample_hz->next;
>> +
>> +                 /* subtract bootchart cpu utilization from total */
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>> new file mode 100644
>> index 0000000..e0cb193
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>> @@ -0,0 +1,38 @@
>> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
>> +Date: Mon, 23 Feb 2015 16:01:31 +0200
>> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
>> +
>> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
>> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
>> +syscalls getrandom and memfd_create").
>> +
>> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
>> +---
>> + src/shared/missing.h | 10 ++++++++++
>> + 1 file changed, 10 insertions(+)
>> +
>> +diff --git a/src/shared/missing.h b/src/shared/missing.h
>> +index b33a70c..e72631e 100644
>> +--- a/src/shared/missing.h
>> ++++ b/src/shared/missing.h
>> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
>> + #    define __NR_getrandom 349
>> + #  elif defined(__powerpc__)
>> + #    define __NR_getrandom 359
>> ++#  elif defined _MIPS_SIM
>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
>> ++#      define __NR_getrandom 4353
>> ++#    endif
>> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
>> ++#      define __NR_getrandom 6317
>> ++#    endif
>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
>> ++#      define __NR_getrandom 5313
>> ++#    endif
>> + #  else
>> + #    warning "__NR_getrandom unknown for your architecture"
>> + #    define __NR_getrandom 0xffffffff
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>> new file mode 100644
>> index 0000000..1b842a2
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>> @@ -0,0 +1,33 @@
>> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
>> +From: Lennart Poettering <lennart@poettering.net>
>> +Date: Wed, 25 Feb 2015 22:05:14 +0100
>> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
>> + units in --user mode
>> +
>> +When running in user mode unmounting of mount units when a device
>> +vanishes is unlikely to work, and even if it would work is already done
>> +by PID 1 anyway. HEnce, when creating implicit dependencies between
>> +mount units and their backing devices, created a Wants= type dependency
>> +in --user mode, but leave a BindsTo= dependency in --system mode.
>> +
>> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
>> +---
>> + src/core/unit.c | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/src/core/unit.c b/src/core/unit.c
>> +index ee8e607..9f1e55e 100644
>> +--- a/src/core/unit.c
>> ++++ b/src/core/unit.c
>> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
>> +         if (r < 0)
>> +                 return r;
>> +
>> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
>> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
>> +         if (r < 0)
>> +                 return r;
>> +
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>> new file mode 100644
>> index 0000000..92c4b8f
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>> @@ -0,0 +1,43 @@
>> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
>> +From: Colin Walters <walters@verbum.org>
>> +Date: Tue, 17 Feb 2015 13:47:34 -0500
>> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
>> + caused it
>> +
>> +I'm trying to track down a relatively recent change in systemd
>> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
>> +
>> +Systemd started to stop sysroot.mount, and this patch should help
>> +me debug why at least.
>> +
>> +While we're here, "break" on the first unit we find that will
>> +deactivate, as there's no point in further iteration.
>> +
>> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
>> +---
>> + src/core/unit.c | 4 +++-
>> + 1 file changed, 3 insertions(+), 1 deletion(-)
>> +
>> +diff --git a/src/core/unit.c b/src/core/unit.c
>> +index 9f1e55e..563f6fe 100644
>> +--- a/src/core/unit.c
>> ++++ b/src/core/unit.c
>> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
>> +                         continue;
>> +
>> +                 stop = true;
>> ++                break;
>> +         }
>> +
>> +         if (!stop)
>> +                 return;
>> +
>> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
>> ++        assert(other);
>> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
>> +
>> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
>> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>> new file mode 100644
>> index 0000000..46c25bd
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>> @@ -0,0 +1,30 @@
>> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>> +Date: Thu, 26 Feb 2015 19:00:11 -0500
>> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
>> + debug
>> +
>> +Printing it at info level was tedious. We don't do that for any other
>> +overrides.
>> +
>> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
>> +---
>> + src/sysctl/sysctl.c | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
>> +index 275a5b7..2415d84 100644
>> +--- a/src/sysctl/sysctl.c
>> ++++ b/src/sysctl/sysctl.c
>> +@@ -176,7 +176,7 @@ found:
>> +                         if (streq(value, existing))
>> +                                 continue;
>> +
>> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
>> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
>> +                         free(hashmap_remove(sysctl_options, p));
>> +                         free(v);
>> +                 }
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>> new file mode 100644
>> index 0000000..87dce1f
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>> @@ -0,0 +1,39 @@
>> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>> +Date: Thu, 26 Feb 2015 19:05:51 -0500
>> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
>> +
>> +Also a link to decent documentation for sysrq keys. It is surprising
>> +hard to find.
>> +
>> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
>> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
>> +---
>> + sysctl.d/50-default.conf | 9 ++++++++-
>> + 1 file changed, 8 insertions(+), 1 deletion(-)
>> +
>> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
>> +index f189233..def151b 100644
>> +--- a/sysctl.d/50-default.conf
>> ++++ b/sysctl.d/50-default.conf
>> +@@ -5,9 +5,16 @@
>> + #  the Free Software Foundation; either version 2.1 of the License, or
>> + #  (at your option) any later version.
>> +
>> +-# See sysctl.d(5) and core(5) for for details.
>> ++# See sysctl.d(5) and core(5) for for documentation.
>> ++
>> ++# To override settings in this file, create a local file in /etc
>> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
>> ++# there.
>> +
>> + # System Request functionality of the kernel (SYNC)
>> ++#
>> ++# Use kernel.sysrq = 1 to allow all keys.
>> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
>> + kernel.sysrq = 16
>> +
>> + # Append the PID to the core filename
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>> new file mode 100644
>> index 0000000..a3ab3e4
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>> @@ -0,0 +1,912 @@
>> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
>> +From: Lennart Poettering <lennart@poettering.net>
>> +Date: Fri, 27 Feb 2015 21:55:08 +0100
>> +Subject: [PATCH 17/26] core: rework device state logic
>> +
>> +This change introduces a new state "tentative" for device units. Device
>> +units are considered "plugged" when udev announced them, "dead" when
>> +they are not available in the kernel, and "tentative" when they are
>> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
>> +announced via udev.
>> +
>> +This should fix a race when device nodes (like loop devices) are created
>> +and immediately mounted. Previously, systemd might end up seeing the
>> +mount unit before the device, and would thus pull down the mount because
>> +its BindTo dependency on the device would not be fulfilled.
>> +
>> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
>> +---
>> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
>> + src/core/device.h |  14 ++-
>> + src/core/mount.c  |  46 ++++---
>> + src/core/swap.c   |  32 +++--
>> + src/core/swap.h   |   4 +-
>> + src/core/unit.c   |   1 -
>> + 6 files changed, 285 insertions(+), 180 deletions(-)
>> +
>> +diff --git a/src/core/device.c b/src/core/device.c
>> +index d3deac3..75b9a46 100644
>> +--- a/src/core/device.c
>> ++++ b/src/core/device.c
>> +@@ -36,7 +36,8 @@
>> +
>> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
>> +         [DEVICE_DEAD] = UNIT_INACTIVE,
>> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
>> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
>> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
>> + };
>> +
>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
>> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
>> +         d->sysfs = NULL;
>> + }
>> +
>> ++static int device_set_sysfs(Device *d, const char *sysfs) {
>> ++        Device *first;
>> ++        char *copy;
>> ++        int r;
>> ++
>> ++        assert(d);
>> ++
>> ++        if (streq_ptr(d->sysfs, sysfs))
>> ++                return 0;
>> ++
>> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
>> ++        if (r < 0)
>> ++                return r;
>> ++
>> ++        copy = strdup(sysfs);
>> ++        if (!copy)
>> ++                return -ENOMEM;
>> ++
>> ++        device_unset_sysfs(d);
>> ++
>> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
>> ++        LIST_PREPEND(same_sysfs, first, d);
>> ++
>> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
>> ++        if (r < 0) {
>> ++                LIST_REMOVE(same_sysfs, first, d);
>> ++                free(copy);
>> ++                return r;
>> ++        }
>> ++
>> ++        d->sysfs = copy;
>> ++
>> ++        return 0;
>> ++}
>> ++
>> + static void device_init(Unit *u) {
>> +         Device *d = DEVICE(u);
>> +
>> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
>> +         assert(d);
>> +         assert(d->state == DEVICE_DEAD);
>> +
>> +-        if (d->sysfs)
>> ++        if (d->found & DEVICE_FOUND_UDEV)
>> ++                /* If udev says the device is around, it's around */
>> +                 device_set_state(d, DEVICE_PLUGGED);
>> ++        else if (d->found != DEVICE_NOT_FOUND)
>> ++                /* If a device is found in /proc/self/mountinfo or
>> ++                 * /proc/swaps, it's "tentatively" around. */
>> ++                device_set_state(d, DEVICE_TENTATIVE);
>> +
>> +         return 0;
>> + }
>> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
>> +         return device_state_to_string(DEVICE(u)->state);
>> + }
>> +
>> +-static int device_add_escaped_name(Unit *u, const char *dn) {
>> +-        _cleanup_free_ char *e = NULL;
>> +-        int r;
>> +-
>> +-        assert(u);
>> +-        assert(dn);
>> +-        assert(dn[0] == '/');
>> +-
>> +-        e = unit_name_from_path(dn, ".device");
>> +-        if (!e)
>> +-                return -ENOMEM;
>> +-
>> +-        r = unit_add_name(u, e);
>> +-        if (r < 0 && r != -EEXIST)
>> +-                return r;
>> +-
>> +-        return 0;
>> +-}
>> +-
>> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
>> +-        _cleanup_free_ char *e = NULL;
>> +-        Unit *u;
>> +-
>> +-        assert(m);
>> +-        assert(dn);
>> +-        assert(dn[0] == '/');
>> +-        assert(_u);
>> +-
>> +-        e = unit_name_from_path(dn, ".device");
>> +-        if (!e)
>> +-                return -ENOMEM;
>> +-
>> +-        u = manager_get_unit(m, e);
>> +-        if (u) {
>> +-                *_u = u;
>> +-                return 1;
>> +-        }
>> +-
>> +-        return 0;
>> +-}
>> +-
>> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
>> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
>> +         const char *model;
>> ++        int r;
>> +
>> +         assert(u);
>> +         assert(dev);
>> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
>> +
>> +                         j = strjoin(model, " ", label, NULL);
>> +                         if (j)
>> +-                                return unit_set_description(u, j);
>> +-                }
>> ++                                r = unit_set_description(u, j);
>> ++                } else
>> ++                        r = unit_set_description(u, model);
>> ++        } else
>> ++                r = unit_set_description(u, path);
>> +
>> +-                return unit_set_description(u, model);
>> +-        }
>> ++        if (r < 0)
>> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
>> +
>> +-        return unit_set_description(u, path);
>> ++        return r;
>> + }
>> +
>> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
>> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
>> +
>> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
>> +                 if (!n)
>> +-                        return -ENOMEM;
>> ++                        return log_oom();
>> +
>> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
>> +                 if (r < 0)
>> +-                        return r;
>> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
>> +         }
>> +         if (!isempty(state))
>> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
>> +-                                 property, strna(udev_device_get_syspath(dev)));
>> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
>> +
>> +         return 0;
>> + }
>> +
>> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
>> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
>> ++        _cleanup_free_ char *e = NULL;
>> +         const char *sysfs;
>> +         Unit *u = NULL;
>> +         bool delete;
>> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>> +         if (!sysfs)
>> +                 return 0;
>> +
>> +-        r = device_find_escape_name(m, path, &u);
>> +-        if (r < 0)
>> +-                return r;
>> ++        e = unit_name_from_path(path, ".device");
>> ++        if (!e)
>> ++                return log_oom();
>> ++
>> ++        u = manager_get_unit(m, e);
>> +
>> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
>> ++        if (u &&
>> ++            DEVICE(u)->sysfs &&
>> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
>> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
>> +                 return -EEXIST;
>> ++        }
>> +
>> +         if (!u) {
>> +                 delete = true;
>> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>> +                 if (!u)
>> +                         return log_oom();
>> +
>> +-                r = device_add_escaped_name(u, path);
>> ++                r = unit_add_name(u, e);
>> +                 if (r < 0)
>> +                         goto fail;
>> +
>> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>> +          * actually been seen yet ->sysfs will not be
>> +          * initialized. Hence initialize it if necessary. */
>> +
>> +-        if (!DEVICE(u)->sysfs) {
>> +-                Device *first;
>> +-
>> +-                DEVICE(u)->sysfs = strdup(sysfs);
>> +-                if (!DEVICE(u)->sysfs) {
>> +-                        r = -ENOMEM;
>> +-                        goto fail;
>> +-                }
>> +-
>> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
>> +-                if (r < 0)
>> +-                        goto fail;
>> +-
>> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
>> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
>> +-
>> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
>> +-                if (r < 0)
>> +-                        goto fail;
>> +-        }
>> +-
>> +-        device_make_description(u, dev, path);
>> ++        r = device_set_sysfs(DEVICE(u), sysfs);
>> ++        if (r < 0)
>> ++                goto fail;
>> +
>> +-        if (main) {
>> +-                /* The additional systemd udev properties we only
>> +-                 * interpret for the main object */
>> ++        (void) device_update_description(u, dev, path);
>> +
>> +-                r = device_add_udev_wants(u, dev);
>> +-                if (r < 0)
>> +-                        goto fail;
>> +-        }
>> ++        /* The additional systemd udev properties we only interpret
>> ++         * for the main object */
>> ++        if (main)
>> ++                (void) device_add_udev_wants(u, dev);
>> +
>> +         /* Note that this won't dispatch the load queue, the caller
>> +          * has to do that if needed and appropriate */
>> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>> +         return 0;
>> +
>> + fail:
>> +-        log_warning_errno(r, "Failed to load device unit: %m");
>> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
>> +
>> +         if (delete && u)
>> +                 unit_free(u);
>> +@@ -342,7 +331,7 @@ fail:
>> +         return r;
>> + }
>> +
>> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
>> ++static int device_process_new(Manager *m, struct udev_device *dev) {
>> +         const char *sysfs, *dn, *alias;
>> +         struct udev_list_entry *item = NULL, *first = NULL;
>> +         int r;
>> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>> +                 return 0;
>> +
>> +         /* Add the main unit named after the sysfs path */
>> +-        r = device_update_unit(m, dev, sysfs, true);
>> ++        r = device_setup_unit(m, dev, sysfs, true);
>> +         if (r < 0)
>> +                 return r;
>> +
>> +         /* Add an additional unit for the device node */
>> +         dn = udev_device_get_devnode(dev);
>> +         if (dn)
>> +-                device_update_unit(m, dev, dn, false);
>> ++                (void) device_setup_unit(m, dev, dn, false);
>> +
>> +         /* Add additional units for all symlinks */
>> +         first = udev_device_get_devlinks_list_entry(dev);
>> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>> +                             st.st_rdev != udev_device_get_devnum(dev))
>> +                                 continue;
>> +
>> +-                device_update_unit(m, dev, p, false);
>> ++                (void) device_setup_unit(m, dev, p, false);
>> +         }
>> +
>> +         /* Add additional units for all explicitly configured
>> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>> +                         e[l] = 0;
>> +
>> +                         if (path_is_absolute(e))
>> +-                                device_update_unit(m, dev, e, false);
>> ++                                (void) device_setup_unit(m, dev, e, false);
>> +                         else
>> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
>> +                 }
>> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>> +         return 0;
>> + }
>> +
>> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
>> +-        const char *sysfs;
>> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
>> ++        DeviceFound n;
>> ++
>> ++        assert(d);
>> ++
>> ++        n = add ? (d->found | found) : (d->found & ~found);
>> ++        if (n == d->found)
>> ++                return;
>> ++
>> ++        d->found = n;
>> ++
>> ++        if (now) {
>> ++                if (d->found & DEVICE_FOUND_UDEV)
>> ++                        device_set_state(d, DEVICE_PLUGGED);
>> ++                else if (d->found != DEVICE_NOT_FOUND)
>> ++                        device_set_state(d, DEVICE_TENTATIVE);
>> ++                else
>> ++                        device_set_state(d, DEVICE_DEAD);
>> ++        }
>> ++}
>> ++
>> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
>> +         Device *d, *l;
>> +
>> +         assert(m);
>> +-        assert(dev);
>> ++        assert(sysfs);
>> +
>> +-        sysfs = udev_device_get_syspath(dev);
>> +-        if (!sysfs)
>> +-                return;
>> ++        if (found == DEVICE_NOT_FOUND)
>> ++                return 0;
>> +
>> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
>> +         LIST_FOREACH(same_sysfs, d, l)
>> +-                device_set_state(d, DEVICE_PLUGGED);
>> ++                device_update_found_one(d, add, found, now);
>> ++
>> ++        return 0;
>> + }
>> +
>> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
>> +-        const char *sysfs;
>> +-        Device *d;
>> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
>> ++        _cleanup_free_ char *e = NULL;
>> ++        Unit *u;
>> +
>> +         assert(m);
>> +-        assert(dev);
>> ++        assert(path);
>> +
>> +-        sysfs = udev_device_get_syspath(dev);
>> +-        if (!sysfs)
>> +-                return -ENOMEM;
>> ++        if (found == DEVICE_NOT_FOUND)
>> ++                return 0;
>> +
>> +-        /* Remove all units of this sysfs path */
>> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
>> +-                device_unset_sysfs(d);
>> +-                device_set_state(d, DEVICE_DEAD);
>> +-        }
>> ++        e = unit_name_from_path(path, ".device");
>> ++        if (!e)
>> ++                return log_oom();
>> +
>> ++        u = manager_get_unit(m, e);
>> ++        if (!u)
>> ++                return 0;
>> ++
>> ++        device_update_found_one(DEVICE(u), add, found, now);
>> +         return 0;
>> + }
>> +
>> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
>> +         return parse_boolean(ready) != 0;
>> + }
>> +
>> +-static int device_process_new_path(Manager *m, const char *path) {
>> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>> +-
>> +-        assert(m);
>> +-        assert(path);
>> +-
>> +-        dev = udev_device_new_from_syspath(m->udev, path);
>> +-        if (!dev)
>> +-                return log_oom();
>> +-
>> +-        if (!device_is_ready(dev))
>> +-                return 0;
>> +-
>> +-        return device_process_new_device(m, dev);
>> +-}
>> +-
>> + static Unit *device_following(Unit *u) {
>> +         Device *d = DEVICE(u);
>> +         Device *other, *first = NULL;
>> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
>> +                 goto fail;
>> +
>> +         first = udev_enumerate_get_list_entry(e);
>> +-        udev_list_entry_foreach(item, first)
>> +-                device_process_new_path(m, udev_list_entry_get_name(item));
>> ++        udev_list_entry_foreach(item, first) {
>> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>> ++                const char *sysfs;
>> ++
>> ++                sysfs = udev_list_entry_get_name(item);
>> ++
>> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
>> ++                if (!dev) {
>> ++                        log_oom();
>> ++                        continue;
>> ++                }
>> ++
>> ++                if (!device_is_ready(dev))
>> ++                        continue;
>> ++
>> ++                (void) device_process_new(m, dev);
>> ++
>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
>> ++        }
>> +
>> +         return 0;
>> +
>> + fail:
>> ++        log_error_errno(r, "Failed to enumerate devices: %m");
>> ++
>> +         device_shutdown(m);
>> +         return r;
>> + }
>> +@@ -619,7 +634,7 @@ fail:
>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
>> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>> +         Manager *m = userdata;
>> +-        const char *action;
>> ++        const char *action, *sysfs;
>> +         int r;
>> +
>> +         assert(m);
>> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
>> +         if (!dev)
>> +                 return 0;
>> +
>> ++        sysfs = udev_device_get_syspath(dev);
>> ++        if (!sysfs) {
>> ++                log_error("Failed to get udev sys path.");
>> ++                return 0;
>> ++        }
>> ++
>> +         action = udev_device_get_action(dev);
>> +         if (!action) {
>> +                 log_error("Failed to get udev action string.");
>> +                 return 0;
>> +         }
>> +
>> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
>> +-                r = device_process_removed_device(m, dev);
>> +-                if (r < 0)
>> +-                        log_error_errno(r, "Failed to process device remove event: %m");
>> +-
>> +-                r = swap_process_removed_device(m, dev);
>> ++        if (streq(action, "remove"))  {
>> ++                r = swap_process_device_remove(m, dev);
>> +                 if (r < 0)
>> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
>> +
>> +-        } else {
>> +-                r = device_process_new_device(m, dev);
>> +-                if (r < 0)
>> +-                        log_error_errno(r, "Failed to process device new event: %m");
>> ++                /* If we get notified that a device was removed by
>> ++                 * udev, then it's completely gone, hence unset all
>> ++                 * found bits */
>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
>> +
>> +-                r = swap_process_new_device(m, dev);
>> ++        } else if (device_is_ready(dev)) {
>> ++
>> ++                (void) device_process_new(m, dev);
>> ++
>> ++                r = swap_process_device_new(m, dev);
>> +                 if (r < 0)
>> +                         log_error_errno(r, "Failed to process swap device new event: %m");
>> +
>> +                 manager_dispatch_load_queue(m);
>> +
>> +-                device_set_path_plugged(m, dev);
>> ++                /* The device is found now, set the udev found bit */
>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
>> ++
>> ++        } else {
>> ++                /* The device is nominally around, but not ready for
>> ++                 * us. Hence unset the udev bit, but leave the rest
>> ++                 * around. */
>> ++
>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
>> +         }
>> +
>> +         return 0;
>> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
>> +         return read_only <= 0;
>> + }
>> +
>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
>> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>> ++        struct stat st;
>> ++
>> ++        assert(m);
>> ++        assert(node);
>> ++
>> ++        /* This is called whenever we find a device referenced in
>> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
>> ++         * mounted/enabled at a time where udev has not finished
>> ++         * probing it yet, and we thus haven't learned about it
>> ++         * yet. In this case we will set the device unit to
>> ++         * "tentative" state. */
>> ++
>> ++        if (add) {
>> ++                if (!path_startswith(node, "/dev"))
>> ++                        return 0;
>> ++
>> ++                if (stat(node, &st) < 0) {
>> ++                        if (errno == ENOENT)
>> ++                                return 0;
>> ++
>> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
>> ++                }
>> ++
>> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
>> ++                        return 0;
>> ++
>> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
>> ++                if (!dev) {
>> ++                        if (errno == ENOENT)
>> ++                                return 0;
>> ++
>> ++                        return log_oom();
>> ++                }
>> ++
>> ++                /* If the device is known in the kernel and newly
>> ++                 * appeared, then we'll create a device unit for it,
>> ++                 * under the name referenced in /proc/swaps or
>> ++                 * /proc/self/mountinfo. */
>> ++
>> ++                (void) device_setup_unit(m, dev, node, false);
>> ++        }
>> ++
>> ++        /* Update the device unit's state, should it exist */
>> ++        return device_update_found_by_name(m, node, add, found, now);
>> ++}
>> ++
>> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
>> +         [DEVICE_DEAD] = "dead",
>> +-        [DEVICE_PLUGGED] = "plugged"
>> ++        [DEVICE_TENTATIVE] = "tentative",
>> ++        [DEVICE_PLUGGED] = "plugged",
>> + };
>> +
>> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
>> +diff --git a/src/core/device.h b/src/core/device.h
>> +index bb7ae07..0609b20 100644
>> +--- a/src/core/device.h
>> ++++ b/src/core/device.h
>> +@@ -29,20 +29,28 @@ typedef struct Device Device;
>> +  * simplifies the state engine greatly */
>> + typedef enum DeviceState {
>> +         DEVICE_DEAD,
>> +-        DEVICE_PLUGGED,
>> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
>> ++        DEVICE_PLUGGED,   /* announced by udev */
>> +         _DEVICE_STATE_MAX,
>> +         _DEVICE_STATE_INVALID = -1
>> + } DeviceState;
>> +
>> ++typedef enum DeviceFound {
>> ++        DEVICE_NOT_FOUND = 0,
>> ++        DEVICE_FOUND_UDEV = 1,
>> ++        DEVICE_FOUND_MOUNT = 2,
>> ++        DEVICE_FOUND_SWAP = 4,
>> ++} DeviceFound;
>> ++
>> + struct Device {
>> +         Unit meta;
>> +
>> +         char *sysfs;
>> ++        DeviceFound found;
>> +
>> +         /* In order to be able to distinguish dependencies on
>> +         different device nodes we might end up creating multiple
>> +         devices for the same sysfs path. We chain them up here. */
>> +-
>> +         LIST_FIELDS(struct Device, same_sysfs);
>> +
>> +         DeviceState state;
>> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
>> +
>> + const char* device_state_to_string(DeviceState i) _const_;
>> + DeviceState device_state_from_string(const char *s) _pure_;
>> ++
>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
>> +diff --git a/src/core/mount.c b/src/core/mount.c
>> +index f3977e6..c971330 100644
>> +--- a/src/core/mount.c
>> ++++ b/src/core/mount.c
>> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
>> +         return 0;
>> + }
>> +
>> +-static int mount_add_one(
>> ++static int mount_setup_unit(
>> +                 Manager *m,
>> +                 const char *what,
>> +                 const char *where,
>> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
>> +
>> +                 u = unit_new(m, sizeof(Mount));
>> +                 if (!u)
>> +-                        return -ENOMEM;
>> ++                        return log_oom();
>> +
>> +                 r = unit_add_name(u, e);
>> +                 if (r < 0)
>> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
>> +         return 0;
>> +
>> + fail:
>> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
>> ++
>> +         if (delete && u)
>> +                 unit_free(u);
>> +
>> +@@ -1554,33 +1556,36 @@ fail:
>> + }
>> +
>> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
>> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
>> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
>> +-        struct libmnt_fs *fs;
>> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
>> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
>> +         int r = 0;
>> +
>> +         assert(m);
>> +
>> +-        tb = mnt_new_table();
>> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
>> +-        if (!tb || !itr)
>> ++        t = mnt_new_table();
>> ++        if (!t)
>> +                 return log_oom();
>> +
>> +-        r = mnt_table_parse_mtab(tb, NULL);
>> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
>> ++        if (!i)
>> ++                return log_oom();
>> ++
>> ++        r = mnt_table_parse_mtab(t, NULL);
>> +         if (r < 0)
>> +-                return r;
>> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
>> +
>> +         r = 0;
>> +         for (;;) {
>> +                 const char *device, *path, *options, *fstype;
>> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
>> ++                struct libmnt_fs *fs;
>> +                 int k;
>> +
>> +-                k = mnt_table_next_fs(tb, itr, &fs);
>> ++                k = mnt_table_next_fs(t, i, &fs);
>> +                 if (k == 1)
>> +                         break;
>> +-                else if (k < 0)
>> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
>> ++                if (k < 0)
>> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
>> +
>> +                 device = mnt_fs_get_source(fs);
>> +                 path = mnt_fs_get_target(fs);
>> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
>> +                 fstype = mnt_fs_get_fstype(fs);
>> +
>> +                 d = cunescape(device);
>> ++                if (!d)
>> ++                        return log_oom();
>> ++
>> +                 p = cunescape(path);
>> +-                if (!d || !p)
>> ++                if (!p)
>> +                         return log_oom();
>> +
>> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
>> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
>> ++
>> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
>> +                 if (r == 0 && k < 0)
>> +                         r = k;
>> +         }
>> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
>> +
>> +         r = mount_load_proc_self_mountinfo(m, true);
>> +         if (r < 0) {
>> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
>> +-
>> +                 /* Reset flags, just in case, for later calls */
>> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
>> +                         Mount *mount = MOUNT(u);
>> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
>> +                                 break;
>> +                         }
>> +
>> ++                        if (mount->parameters_proc_self_mountinfo.what)
>> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
>> ++
>> ++
>> +                 } else if (mount->just_mounted || mount->just_changed) {
>> +
>> +                         /* New or changed mount entry */
>> +diff --git a/src/core/swap.c b/src/core/swap.c
>> +index 6997921..5c19af5 100644
>> +--- a/src/core/swap.c
>> ++++ b/src/core/swap.c
>> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
>> +         return swap_verify(s);
>> + }
>> +
>> +-static int swap_add_one(
>> ++static int swap_setup_unit(
>> +                 Manager *m,
>> +                 const char *what,
>> +                 const char *what_proc_swaps,
>> +@@ -363,8 +363,10 @@ static int swap_add_one(
>> +
>> +         if (u &&
>> +             SWAP(u)->from_proc_swaps &&
>> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
>> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
>> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
>> +                 return -EEXIST;
>> ++        }
>> +
>> +         if (!u) {
>> +                 delete = true;
>> +@@ -379,7 +381,7 @@ static int swap_add_one(
>> +
>> +                 SWAP(u)->what = strdup(what);
>> +                 if (!SWAP(u)->what) {
>> +-                        r = log_oom();
>> ++                        r = -ENOMEM;
>> +                         goto fail;
>> +                 }
>> +
>> +@@ -407,7 +409,6 @@ static int swap_add_one(
>> +         p->priority = priority;
>> +
>> +         unit_add_to_dbus_queue(u);
>> +-
>> +         return 0;
>> +
>> + fail:
>> +@@ -419,7 +420,7 @@ fail:
>> +         return r;
>> + }
>> +
>> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
>> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
>> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
>> +         struct udev_list_entry *item = NULL, *first = NULL;
>> +         const char *dn;
>> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
>> +
>> +         assert(m);
>> +
>> +-        r = swap_add_one(m, device, device, prio, set_flags);
>> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
>> +         if (r < 0)
>> +                 return r;
>> +
>> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
>> +         /* Add the main device node */
>> +         dn = udev_device_get_devnode(d);
>> +         if (dn && !streq(dn, device))
>> +-                swap_add_one(m, dn, device, prio, set_flags);
>> ++                swap_setup_unit(m, dn, device, prio, set_flags);
>> +
>> +         /* Add additional units for all symlinks */
>> +         first = udev_device_get_devlinks_list_entry(d);
>> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
>> +                             st.st_rdev != udev_device_get_devnum(d))
>> +                                 continue;
>> +
>> +-                swap_add_one(m, p, device, prio, set_flags);
>> ++                swap_setup_unit(m, p, device, prio, set_flags);
>> +         }
>> +
>> +         return r;
>> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
>> +                         if (k == EOF)
>> +                                 break;
>> +
>> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
>> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
>> +                         continue;
>> +                 }
>> +
>> +                 d = cunescape(dev);
>> +                 if (!d)
>> +-                        return -ENOMEM;
>> ++                        return log_oom();
>> ++
>> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
>> +
>> +-                k = swap_process_new_swap(m, d, prio, set_flags);
>> ++                k = swap_process_new(m, d, prio, set_flags);
>> +                 if (k < 0)
>> +                         r = k;
>> +         }
>> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
>> +                                 break;
>> +                         }
>> +
>> ++                        if (swap->what)
>> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
>> ++
>> +                 } else if (swap->just_activated) {
>> +
>> +                         /* New swap entry */
>> +@@ -1298,7 +1304,7 @@ fail:
>> +         return r;
>> + }
>> +
>> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
>> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
>> +         struct udev_list_entry *item = NULL, *first = NULL;
>> +         _cleanup_free_ char *e = NULL;
>> +         const char *dn;
>> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
>> +         return r;
>> + }
>> +
>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
>> +         const char *dn;
>> +         int r = 0;
>> +         Swap *s;
>> +diff --git a/src/core/swap.h b/src/core/swap.h
>> +index 73e64d8..914a2db 100644
>> +--- a/src/core/swap.h
>> ++++ b/src/core/swap.h
>> +@@ -116,8 +116,8 @@ struct Swap {
>> +
>> + extern const UnitVTable swap_vtable;
>> +
>> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
>> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
>> +
>> + const char* swap_state_to_string(SwapState i) _const_;
>> + SwapState swap_state_from_string(const char *s) _pure_;
>> +diff --git a/src/core/unit.c b/src/core/unit.c
>> +index 563f6fe..a6558ee 100644
>> +--- a/src/core/unit.c
>> ++++ b/src/core/unit.c
>> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
>> +                 return -ENOMEM;
>> +
>> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
>> +-
>> +         if (r < 0)
>> +                 return r;
>> +
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>> new file mode 100644
>> index 0000000..d614085
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>> @@ -0,0 +1,26 @@
>> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
>> +Date: Sat, 28 Feb 2015 23:39:55 +0100
>> +Subject: [PATCH 18/26] core: fix return value on OOM
>> +
>> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
>> +---
>> + src/core/device.c | 2 ++
>> + 1 file changed, 2 insertions(+)
>> +
>> +diff --git a/src/core/device.c b/src/core/device.c
>> +index 75b9a46..1cc103c 100644
>> +--- a/src/core/device.c
>> ++++ b/src/core/device.c
>> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
>> +                         j = strjoin(model, " ", label, NULL);
>> +                         if (j)
>> +                                 r = unit_set_description(u, j);
>> ++                        else
>> ++                                r = -ENOMEM;
>> +                 } else
>> +                         r = unit_set_description(u, model);
>> +         } else
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>> new file mode 100644
>> index 0000000..d94da60
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>> @@ -0,0 +1,33 @@
>> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
>> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
>> +Date: Thu, 19 Feb 2015 20:47:28 +0100
>> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
>> + bus on dbus1
>> +
>> +This fixes "machinectl login" on systems configured with --disable-kdbus.
>> +
>> +The error was:
>> +machinectl login foo
>> +Failed to get machine PTY: Input/output error
>> +
>> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
>> +---
>> + src/machine/machine-dbus.c | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
>> +index b46f0a8..b0f0f66 100644
>> +--- a/src/machine/machine-dbus.c
>> ++++ b/src/machine/machine-dbus.c
>> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
>> + #ifdef ENABLE_KDBUS
>> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
>> + #else
>> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
>> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
>> + #endif
>> +         if (!container_bus->address)
>> +                 return -ENOMEM;
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>> new file mode 100644
>> index 0000000..fcc2adf
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>> @@ -0,0 +1,25 @@
>> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
>> +Date: Fri, 20 Feb 2015 15:35:11 -0300
>> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
>> +
>> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
>> +---
>> + src/shared/util.c | 1 +
>> + 1 file changed, 1 insertion(+)
>> +
>> +diff --git a/src/shared/util.c b/src/shared/util.c
>> +index ba035ca..f24b5b4 100644
>> +--- a/src/shared/util.c
>> ++++ b/src/shared/util.c
>> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
>> +
>> + bool fstype_is_network(const char *fstype) {
>> +         static const char table[] =
>> ++                "afs\0"
>> +                 "cifs\0"
>> +                 "smbfs\0"
>> +                 "sshfs\0"
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>> new file mode 100644
>> index 0000000..02e279d
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>> @@ -0,0 +1,31 @@
>> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
>> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
>> +Date: Fri, 20 Feb 2015 10:53:28 +0100
>> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
>> +
>> +Otherwise every daemon reload prints out warnings like:
>> +
>> +systemd[1]: Unit type .busname is not supported on this system.
>> +systemd[1]: Unit type .swap is not supported on this system.
>> +
>> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
>> +---
>> + src/core/manager.c | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/src/core/manager.c b/src/core/manager.c
>> +index 4775219..bc9b7ec 100644
>> +--- a/src/core/manager.c
>> ++++ b/src/core/manager.c
>> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
>> +                 int q;
>> +
>> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
>> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
>> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
>> +                         continue;
>> +                 }
>> +
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>> new file mode 100644
>> index 0000000..f5afd09
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>> @@ -0,0 +1,97 @@
>> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>> +Date: Mon, 2 Mar 2015 10:34:51 -0500
>> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
>> +
>> +Binary fields were not processed properly, and resulting journal files
>> +were non-conforming, resulting in an error ("Invalid field.") when reading.
>> +
>> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
>> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
>> +---
>> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
>> + src/journal-remote/journal-remote-parse.h |  4 +++-
>> + 2 files changed, 21 insertions(+), 14 deletions(-)
>> +
>> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
>> +index d9dea8d..afded7e 100644
>> +--- a/src/journal-remote/journal-remote-parse.c
>> ++++ b/src/journal-remote/journal-remote-parse.c
>> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
>> +                    LLLLLLLL0011223344...\n
>> +                 */
>> +                 sep = memchr(line, '=', n);
>> +-                if (sep)
>> ++                if (sep) {
>> +                         /* chomp newline */
>> +                         n--;
>> +-                else
>> ++
>> ++                        r = iovw_put(&source->iovw, line, n);
>> ++                        if (r < 0)
>> ++                                return r;
>> ++                } else {
>> +                         /* replace \n with = */
>> +                         line[n-1] = '=';
>> +-                log_trace("Received: %.*s", (int) n, line);
>> +
>> +-                r = iovw_put(&source->iovw, line, n);
>> +-                if (r < 0) {
>> +-                        log_error("Failed to put line in iovect");
>> +-                        return r;
>> ++                        source->field_len = n;
>> ++                        source->state = STATE_DATA_START;
>> ++
>> ++                        /* we cannot put the field in iovec until we have all data */
>> +                 }
>> +
>> +-                if (!sep)
>> +-                        source->state = STATE_DATA_START;
>> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
>> ++
>> +                 return 0; /* continue */
>> +         }
>> +
>> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
>> +
>> +         case STATE_DATA: {
>> +                 void *data;
>> ++                char *field;
>> +
>> +                 assert(source->data_size > 0);
>> +
>> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
>> +
>> +                 assert(data);
>> +
>> +-                r = iovw_put(&source->iovw, data, source->data_size);
>> +-                if (r < 0) {
>> +-                        log_error("failed to put binary buffer in iovect");
>> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
>> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
>> ++
>> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
>> ++                if (r < 0)
>> +                         return r;
>> +-                }
>> +
>> +                 source->state = STATE_DATA_FINISH;
>> +
>> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
>> +index 8499f4e..22db550 100644
>> +--- a/src/journal-remote/journal-remote-parse.h
>> ++++ b/src/journal-remote/journal-remote-parse.h
>> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
>> +         size_t offset;     /* offset to the beginning of live data in the buffer */
>> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
>> +         size_t filled;     /* total number of bytes in the buffer */
>> +-        size_t data_size;  /* size of the binary data chunk being processed */
>> ++
>> ++        size_t field_len;  /* used for binary fields: the field name length */
>> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
>> +
>> +         struct iovec_wrapper iovw;
>> +
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>> new file mode 100644
>> index 0000000..79e565b
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>> @@ -0,0 +1,37 @@
>> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
>> +Date: Sun, 1 Mar 2015 21:13:10 -0300
>> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
>> +
>> +Logs constantly show
>> +
>> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
>> +
>> +This is because ext4 does not support FS_NOCOW_FL.
>> +
>> +[zj: fold into one conditional as suggested on the ML and
>> +     fix (preexisting) r/errno confusion in error message.]
>> +
>> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
>> +---
>> + src/journal/journal-file.c | 4 ++--
>> + 1 file changed, 2 insertions(+), 2 deletions(-)
>> +
>> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
>> +index 2845e05..0f28718 100644
>> +--- a/src/journal/journal-file.c
>> ++++ b/src/journal/journal-file.c
>> +@@ -2611,8 +2611,8 @@ int journal_file_open(
>> +                  * shouldn't be too bad, given that we do our own
>> +                  * checksumming). */
>> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
>> +-                if (r < 0)
>> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
>> ++                if (r < 0 && r != -ENOTTY)
>> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
>> +
>> +                 /* Let's attach the creation time to the journal file,
>> +                  * so that the vacuuming code knows the age of this
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>> new file mode 100644
>> index 0000000..0cf9a0a
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>> @@ -0,0 +1,53 @@
>> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
>> +From: Lennart Poettering <lennart@poettering.net>
>> +Date: Mon, 2 Mar 2015 20:55:38 +0100
>> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
>> + happy
>> +
>> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
>> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
>> +---
>> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
>> + 1 file changed, 5 insertions(+), 7 deletions(-)
>> +
>> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
>> +index 028c2a7..22a3a53 100644
>> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
>> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
>> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
>> +                 .msg_iovlen = 1,
>> +                 .msg_name = &sockaddr,
>> +         };
>> +-        union {
>> +-                struct cmsghdr cmsghdr;
>> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
>> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
>> +-        } control;
>> ++        struct cmsghdr *control;
>> +         _cleanup_close_ int fd = -1;
>> +         struct cmsghdr *cmsg = NULL;
>> +         const char *e;
>> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
>> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
>> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
>> +
>> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
>> ++
>> +         if (n_fds > 0) {
>> +-                msghdr.msg_control = &control;
>> ++                msghdr.msg_control = control;
>> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
>> +
>> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
>> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
>> +                 try_without_ucred = true;
>> +                 controllen_without_ucred = msghdr.msg_controllen;
>> +
>> +-                msghdr.msg_control = &control;
>> ++                msghdr.msg_control = control;
>> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
>> +
>> +                 if (cmsg)
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>> new file mode 100644
>> index 0000000..6912489
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>> @@ -0,0 +1,84 @@
>> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
>> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
>> +Date: Tue, 3 Mar 2015 00:35:08 +0100
>> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
>> + filesystems
>> +
>> +A warning is printed if ACLs cannot be retrieved for any reason other
>> +than -ENOSYS. For -ENOSYS, debug log is printed.
>> +
>> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
>> +---
>> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
>> + 1 file changed, 20 insertions(+), 16 deletions(-)
>> +
>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
>> +index 88ba7e4..187997e 100644
>> +--- a/src/tmpfiles/tmpfiles.c
>> ++++ b/src/tmpfiles/tmpfiles.c
>> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
>> +         int r;
>> +         _cleanup_(acl_free_charpp) char *t = NULL;
>> +
>> ++        /* Returns 0 for success, positive error if already warned,
>> ++         * negative error otherwise. */
>> ++
>> +         if (modify) {
>> +                 r = acls_for_file(path, type, acl, &dup);
>> +                 if (r < 0)
>> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
>> +
>> +         r = acl_set_file(path, type, dup);
>> +         if (r < 0)
>> +-                return log_error_errno(-errno,
>> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
>> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
>> +-                                       strna(t), path);
>> ++                return -log_error_errno(errno,
>> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
>> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
>> ++                                        strna(t), path);
>> ++
>> +         return 0;
>> + }
>> + #endif
>> +
>> + static int path_set_acls(Item *item, const char *path) {
>> ++        int r = 0;
>> + #ifdef HAVE_ACL
>> +-        int r;
>> +-
>> +         assert(item);
>> +         assert(path);
>> +
>> +-        if (item->acl_access) {
>> ++        if (item->acl_access)
>> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
>> +-                if (r < 0)
>> +-                        return r;
>> +-        }
>> +
>> +-        if (item->acl_default) {
>> ++        if (r == 0 && item->acl_default)
>> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
>> +-                if (r < 0)
>> +-                        return r;
>> +-        }
>> +-#endif
>> +
>> +-        return 0;
>> ++        if (r > 0)
>> ++                return -r; /* already warned */
>> ++        else if (r == -ENOTSUP) {
>> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
>> ++                return 0;
>> ++        } else if (r < 0)
>> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
>> ++#endif
>> ++        return r;
>> + }
>> +
>> + static int write_one_file(Item *i, const char *path) {
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
>> new file mode 100644
>> index 0000000..a49a369
>> --- /dev/null
>> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
>> @@ -0,0 +1,30 @@
>> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>> +Date: Tue, 3 Mar 2015 19:07:28 -0500
>> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
>> + missing
>> +
>> +On s390 (at least) /sys/class/power_supply is not present. We should
>> +treat this like if this directory was empty, and not an error.
>> +
>> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
>> +---
>> + src/shared/util.c | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/src/shared/util.c b/src/shared/util.c
>> +index f24b5b4..8548723 100644
>> +--- a/src/shared/util.c
>> ++++ b/src/shared/util.c
>> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
>> +
>> +         d = opendir("/sys/class/power_supply");
>> +         if (!d)
>> +-                return -errno;
>> ++                return errno == ENOENT ? true : -errno;
>> +
>> +         for (;;) {
>> +                 struct dirent *de;
>> +--
>> +1.9.1
>> +
>> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
>> index 73b930e..9c20b11 100644
>> --- a/meta/recipes-core/systemd/systemd_219.bb
>> +++ b/meta/recipes-core/systemd/systemd_219.bb
>> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
>>             file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
>>             file://0010-Make-root-s-home-directory-configurable.patch \
>>             file://0011-systemd-user-avoid-using-system-auth.patch \
>> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
>> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
>>             file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
>> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
>>             file://0014-Revert-rules-remove-firmware-loading-rules.patch \
>>             file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
>>             file://tmpfiles-pam.patch \
>> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
>>
>>  S = "${WORKDIR}/git"
>>
>> +# Appending backport fixes released for version 219-stable
>> +SRC_URI_append = "\
>> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
>> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
>> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
>> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
>> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
>> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
>> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
>> +           file://0008-bootchart-fix-default-init-path.patch \
>> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
>> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
>> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
>> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
>> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
>> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
>> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
>> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
>> +           file://0017-core-rework-device-state-logic.patch \
>> +           file://0018-core-fix-return-value-on-OOM.patch \
>> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
>> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
>> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
>> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
>> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
>> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
>> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
>> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
>> +           "
>> +
>>  SRC_URI_append_libc-uclibc = "\
>>              file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
>>             "
>> --
>> 1.9.1
>>
>
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core



-- 
Otavio Salvador                             O.S. Systems
http://www.ossystems.com.br        http://code.ossystems.com.br
Mobile: +55 (53) 9981-7854            Mobile: +1 (347) 903-9750


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-03-31 20:25   ` Otavio Salvador
@ 2015-04-01 21:08     ` Bottazzini, Bruno
  2015-04-01 21:14       ` Khem Raj
  0 siblings, 1 reply; 12+ messages in thread
From: Bottazzini, Bruno @ 2015-04-01 21:08 UTC (permalink / raw)
  To: Khem Raj; +Cc: Patches and discussions about the oe-core layer

Khem,

Could you verify this patch and see if this satisfies what you have
pointed previously ?

Do you think this patch is ready to go to master ?

Regards,

On Ter, 2015-03-31 at 17:25 -0300, Otavio Salvador wrote:
> I am not a heavy user of systemd so I prefer other people (Khem?) to
> comment on this ...
> 
> On Tue, Mar 31, 2015 at 5:21 PM, Bottazzini, Bruno
> <bruno.bottazzini@intel.com> wrote:
> > Ping
> >
> > On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
> >> Adding patches that fix bugs for 219 version.
> >> This will get the same consistency of the stable systemd 219 version.
> >>
> >> More details:
> >> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
> >> ---
> >>  ...remote-fix-certificate-status-memory-leak.patch |  31 +
> >>  ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
> >>  ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
> >>  ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
> >>  ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
> >>  .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
> >>  ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
> >>  .../0008-bootchart-fix-default-init-path.patch     |  44 +
> >>  ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
> >>  ...0-Make-root-s-home-directory-configurable.patch |  89 +-
> >>  ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
> >>  ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
> >>  ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
> >>  ...aker-dependencies-between-mount-and-devic.patch |  33 +
> >>  ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
> >>  ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
> >>  ...l-add-some-hints-how-to-override-settings.patch |  39 +
> >>  .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
> >>  .../0018-core-fix-return-value-on-OOM.patch        |  26 +
> >>  ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
> >>  ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
> >>  ...downgrade-unit-type-not-supported-message.patch |  31 +
> >>  ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
> >>  ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
> >>  ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
> >>  ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
> >>  ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
> >>  meta/recipes-core/systemd/systemd_219.bb           |  33 +-
> >>  28 files changed, 2050 insertions(+), 55 deletions(-)
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> >>  create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> >>
> >> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> >> new file mode 100644
> >> index 0000000..172bea2
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> >> @@ -0,0 +1,31 @@
> >> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
> >> +From: Michal Schmidt <mschmidt@redhat.com>
> >> +Date: Tue, 17 Feb 2015 10:33:01 +0100
> >> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
> >> +
> >> +The output of gnutls_certificate_verification_status_print() needs to be
> >> +freed.
> >> +
> >> +Noticed this while staring at verify_cert_authorized() to see what could
> >> +possibly confuse gcc5 on armv7hl to segfault during compilation.
> >> +
> >> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
> >> +---
> >> + src/journal-remote/microhttpd-util.c | 1 +
> >> + 1 file changed, 1 insertion(+)
> >> +
> >> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> >> +index 34d9337..de9c6ab 100644
> >> +--- a/src/journal-remote/microhttpd-util.c
> >> ++++ b/src/journal-remote/microhttpd-util.c
> >> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
> >> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
> >> +
> >> +         log_info("Certificate status: %s", out.data);
> >> ++        gnutls_free(out.data);
> >> +
> >> +         return status == 0 ? 0 : -EPERM;
> >> + }
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> >> new file mode 100644
> >> index 0000000..f615876
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> >> @@ -0,0 +1,35 @@
> >> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
> >> +From: Michal Schmidt <mschmidt@redhat.com>
> >> +Date: Tue, 17 Feb 2015 10:36:57 +0100
> >> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
> >> +
> >> +Found by Valgrind while testing the previous memory leak fix.
> >> +
> >> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
> >> +---
> >> + src/journal-remote/microhttpd-util.c | 6 +++++-
> >> + 1 file changed, 5 insertions(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> >> +index de9c6ab..a95fff1 100644
> >> +--- a/src/journal-remote/microhttpd-util.c
> >> ++++ b/src/journal-remote/microhttpd-util.c
> >> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
> >> +         return 0;
> >> + }
> >> +
> >> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
> >> ++        gnutls_x509_crt_deinit(*p);
> >> ++}
> >> ++
> >> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
> >> +         const union MHD_ConnectionInfo *ci;
> >> +         gnutls_session_t session;
> >> +-        gnutls_x509_crt_t client_cert;
> >> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
> >> +         _cleanup_free_ char *buf = NULL;
> >> +         int r;
> >> +
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> >> new file mode 100644
> >> index 0000000..15fa98c
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> >> @@ -0,0 +1,28 @@
> >> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
> >> +From: Martin Pitt <martin.pitt@ubuntu.com>
> >> +Date: Tue, 17 Feb 2015 12:47:51 +0100
> >> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
> >> +
> >> +parse_acl() returns the error instead of setting errno.
> >> +
> >> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
> >> +---
> >> + src/tmpfiles/tmpfiles.c | 2 +-
> >> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> >> +index c948d4d..88ba7e4 100644
> >> +--- a/src/tmpfiles/tmpfiles.c
> >> ++++ b/src/tmpfiles/tmpfiles.c
> >> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
> >> +          * afterwards, so the mask can be added now if necessary. */
> >> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
> >> +         if (r < 0)
> >> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
> >> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
> >> +                                   item->argument);
> >> + #else
> >> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> >> new file mode 100644
> >> index 0000000..f43068d
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> >> @@ -0,0 +1,26 @@
> >> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
> >> +From: Tom Gundersen <teg@jklm.no>
> >> +Date: Wed, 18 Feb 2015 14:33:50 +0100
> >> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
> >> +
> >> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
> >> +---
> >> + src/test/test-utf8.c | 2 +-
> >> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
> >> +index befa385..346f852 100644
> >> +--- a/src/test/test-utf8.c
> >> ++++ b/src/test/test-utf8.c
> >> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
> >> +
> >> + static void test_utf16_to_utf8(void) {
> >> +         char *a = NULL;
> >> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
> >> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
> >> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
> >> +
> >> +         a = utf16_to_utf8(utf16, 14);
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> >> new file mode 100644
> >> index 0000000..35fe913
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> >> @@ -0,0 +1,131 @@
> >> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
> >> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >> +Date: Mon, 23 Feb 2015 23:19:54 -0500
> >> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
> >> +
> >> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
> >> +https://bugs.debian.org/778656
> >> +
> >> +Status quo ante can be restored with:
> >> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
> >> +
> >> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
> >> +---
> >> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
> >> + src/shared/acl-util.h |  4 +++
> >> + 2 files changed, 81 insertions(+), 2 deletions(-)
> >> +
> >> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> >> +index a4ff1ab..cbe09d7 100644
> >> +--- a/src/shared/acl-util.c
> >> ++++ b/src/shared/acl-util.c
> >> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
> >> +         return 0;
> >> + }
> >> +
> >> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> >> ++        acl_tag_t tag_a, tag_b;
> >> ++
> >> ++        if (acl_get_tag_type(a, &tag_a) < 0)
> >> ++                return -errno;
> >> ++
> >> ++        if (acl_get_tag_type(b, &tag_b) < 0)
> >> ++                return -errno;
> >> ++
> >> ++        if (tag_a != tag_b)
> >> ++                return false;
> >> ++
> >> ++        switch (tag_a) {
> >> ++        case ACL_USER_OBJ:
> >> ++        case ACL_GROUP_OBJ:
> >> ++        case ACL_MASK:
> >> ++        case ACL_OTHER:
> >> ++                /* can have only one of those */
> >> ++                return true;
> >> ++        case ACL_USER: {
> >> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> >> ++
> >> ++                uid_a = acl_get_qualifier(a);
> >> ++                if (!uid_a)
> >> ++                        return -errno;
> >> ++
> >> ++                uid_b = acl_get_qualifier(b);
> >> ++                if (!uid_b)
> >> ++                        return -errno;
> >> ++
> >> ++                return *uid_a == *uid_b;
> >> ++        }
> >> ++        case ACL_GROUP: {
> >> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> >> ++
> >> ++                gid_a = acl_get_qualifier(a);
> >> ++                if (!gid_a)
> >> ++                        return -errno;
> >> ++
> >> ++                gid_b = acl_get_qualifier(b);
> >> ++                if (!gid_b)
> >> ++                        return -errno;
> >> ++
> >> ++                return *gid_a == *gid_b;
> >> ++        }
> >> ++        default:
> >> ++                assert_not_reached("Unknown acl tag type");
> >> ++        }
> >> ++}
> >> ++
> >> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
> >> ++        acl_entry_t i;
> >> ++        int r;
> >> ++
> >> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
> >> ++             r > 0;
> >> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
> >> ++
> >> ++                r = acl_entry_equal(i, entry);
> >> ++                if (r < 0)
> >> ++                        return r;
> >> ++                if (r > 0) {
> >> ++                        *out = i;
> >> ++                        return 1;
> >> ++                }
> >> ++        }
> >> ++        if (r < 0)
> >> ++                return -errno;
> >> ++        return 0;
> >> ++}
> >> ++
> >> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> >> +         _cleanup_(acl_freep) acl_t old;
> >> +         acl_entry_t i;
> >> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> >> +
> >> +                 acl_entry_t j;
> >> +
> >> +-                if (acl_create_entry(&old, &j) < 0)
> >> +-                        return -errno;
> >> ++                r = find_acl_entry(old, i, &j);
> >> ++                if (r < 0)
> >> ++                        return r;
> >> ++                if (r == 0)
> >> ++                        if (acl_create_entry(&old, &j) < 0)
> >> ++                                return -errno;
> >> +
> >> +                 if (acl_copy_entry(j, i) < 0)
> >> +                         return -errno;
> >> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
> >> +index 90e88ff..fdb9006 100644
> >> +--- a/src/shared/acl-util.h
> >> ++++ b/src/shared/acl-util.h
> >> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
> >> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
> >> + #define acl_free_charp acl_free
> >> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
> >> ++#define acl_free_uid_tp acl_free
> >> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
> >> ++#define acl_free_gid_tp acl_free
> >> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
> >> +
> >> + #endif
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> >> new file mode 100644
> >> index 0000000..fc707bb
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> >> @@ -0,0 +1,32 @@
> >> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
> >> +From: Daniel Mack <daniel@zonque.org>
> >> +Date: Tue, 24 Feb 2015 13:26:09 +0100
> >> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
> >> +
> >> +  CC       src/shared/libsystemd_shared_la-time-util.lo
> >> +src/shared/time-util.c: In function 'parse_nsec':
> >> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
> >> +                 if (!*s != 0)
> >> +                         ^
> >> +
> >> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
> >> +---
> >> + src/shared/time-util.c | 2 +-
> >> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
> >> +index 947ac1f..1c36c57 100644
> >> +--- a/src/shared/time-util.c
> >> ++++ b/src/shared/time-util.c
> >> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
> >> +         s = startswith(p, "infinity");
> >> +         if (s) {
> >> +                 s += strspn(s, WHITESPACE);
> >> +-                if (!*s != 0)
> >> ++                if (*s != 0)
> >> +                         return -EINVAL;
> >> +
> >> +                 *nsec = NSEC_INFINITY;
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> >> new file mode 100644
> >> index 0000000..161b7b5
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> >> @@ -0,0 +1,36 @@
> >> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
> >> +From: Daniel Mack <daniel@zonque.org>
> >> +Date: Tue, 24 Feb 2015 13:27:10 +0100
> >> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
> >> +
> >> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
> >> +---
> >> + src/test/test-time.c | 6 ++++++
> >> + 1 file changed, 6 insertions(+)
> >> +
> >> +diff --git a/src/test/test-time.c b/src/test/test-time.c
> >> +index 8cfc4cc..3840fff 100644
> >> +--- a/src/test/test-time.c
> >> ++++ b/src/test/test-time.c
> >> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
> >> +         assert_se(u == 2);
> >> +         assert_se(parse_nsec(".7", &u) >= 0);
> >> +         assert_se(u == 0);
> >> ++        assert_se(parse_nsec("infinity", &u) >= 0);
> >> ++        assert_se(u == NSEC_INFINITY);
> >> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
> >> ++        assert_se(u == NSEC_INFINITY);
> >> +
> >> +         assert_se(parse_nsec(" xyz ", &u) < 0);
> >> +         assert_se(parse_nsec("", &u) < 0);
> >> +         assert_se(parse_nsec(" . ", &u) < 0);
> >> +         assert_se(parse_nsec(" 5. ", &u) < 0);
> >> +         assert_se(parse_nsec(".s ", &u) < 0);
> >> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
> >> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
> >> + }
> >> +
> >> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> >> new file mode 100644
> >> index 0000000..7eaad1e
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> >> @@ -0,0 +1,44 @@
> >> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
> >> +From: Martin Pitt <martin.pitt@ubuntu.com>
> >> +Date: Tue, 24 Feb 2015 14:30:10 +0100
> >> +Subject: [PATCH 08/26] bootchart: fix default init path
> >> +
> >> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
> >> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
> >> +multi-arch systems.
> >> +
> >> +https://launchpad.net/bugs/1423867
> >> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
> >> +---
> >> + Makefile.am               | 1 +
> >> + src/bootchart/bootchart.c | 2 +-
> >> + 2 files changed, 2 insertions(+), 1 deletion(-)
> >> +
> >> +diff --git a/Makefile.am b/Makefile.am
> >> +index bf04d31..cc577ce 100644
> >> +--- a/Makefile.am
> >> ++++ b/Makefile.am
> >> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
> >> +     -DKEXEC=\"$(KEXEC)\" \
> >> +     -DLIBDIR=\"$(libdir)\" \
> >> +     -DROOTLIBDIR=\"$(rootlibdir)\" \
> >> ++    -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> >> +     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> >> +     -I $(top_srcdir)/src \
> >> +     -I $(top_builddir)/src/shared \
> >> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
> >> +index 64a384b..175be68 100644
> >> +--- a/src/bootchart/bootchart.c
> >> ++++ b/src/bootchart/bootchart.c
> >> +@@ -76,7 +76,7 @@ int sysfd=-1;
> >> + #define DEFAULT_HZ 25.0
> >> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
> >> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
> >> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
> >> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
> >> + #define DEFAULT_OUTPUT "/run/log"
> >> +
> >> + /* graph defaults */
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> >> new file mode 100644
> >> index 0000000..dbffa5b
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> >> @@ -0,0 +1,44 @@
> >> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
> >> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >> +Date: Tue, 24 Feb 2015 10:10:04 -0500
> >> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
> >> +
> >> +It is not necessary when running as telinit, etc.
> >> +
> >> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
> >> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
> >> +---
> >> + src/systemctl/systemctl.c | 10 +++++-----
> >> + 1 file changed, 5 insertions(+), 5 deletions(-)
> >> +
> >> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
> >> +index 21cb898..6b93ec8 100644
> >> +--- a/src/systemctl/systemctl.c
> >> ++++ b/src/systemctl/systemctl.c
> >> +@@ -7204,6 +7204,11 @@ found:
> >> +                 }
> >> +         }
> >> +
> >> ++        /* Increase max number of open files to 16K if we can, we
> >> ++         * might needs this when browsing journal files, which might
> >> ++         * be split up into many files. */
> >> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> >> ++
> >> +         return verb->dispatch(bus, argv + optind);
> >> + }
> >> +
> >> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
> >> +                 goto finish;
> >> +         }
> >> +
> >> +-        /* Increase max number of open files to 16K if we can, we
> >> +-         * might needs this when browsing journal files, which might
> >> +-         * be split up into many files. */
> >> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> >> +-
> >> +         if (!avoid_bus())
> >> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
> >> +
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> >> index 41b9039..ff2871b 100644
> >> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> >> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> >> @@ -1,7 +1,7 @@
> >> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
> >> -From: Khem Raj <raj.khem@gmail.com>
> >> -Date: Fri, 20 Feb 2015 05:24:49 +0000
> >> -Subject: [PATCH 10/11] Make root's home directory configurable
> >> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
> >> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
> >> +Date: Thu, 5 Mar 2015 17:38:12 -0300
> >> +Subject: [PATCH] Make root's home directory configurable
> >>
> >>  OpenEmbedded has a configurable home directory for root. Allow
> >>  systemd to be built using its idea of what root's home directory
> >> @@ -9,32 +9,31 @@ should be.
> >>
> >>  Upstream-Status: Pending
> >>
> >> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
> >> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
> >> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
> >> +compatbile with systemd 219-stable
> >>  ---
> >> - Makefile.am                       | 2 ++
> >> - configure.ac                      | 7 +++++++
> >> - src/core/unit-printf.c            | 2 +-
> >> - src/nspawn/nspawn.c               | 4 ++--
> >> - src/shared/util.c                 | 4 ++--
> >> - units/console-shell.service.m4.in | 4 ++--
> >> - units/emergency.service.in        | 4 ++--
> >> - units/rescue.service.in           | 4 ++--
> >> - 8 files changed, 20 insertions(+), 11 deletions(-)
> >> + Makefile.am                | 2 ++
> >> + configure.ac               | 7 +++++++
> >> + src/core/unit-printf.c     | 2 +-
> >> + src/nspawn/nspawn.c        | 5 ++---
> >> + src/shared/util.c          | 4 ++--
> >> + units/emergency.service.in | 4 ++--
> >> + units/rescue.service.in    | 4 ++--
> >> + 7 files changed, 18 insertions(+), 10 deletions(-)
> >>
> >>  diff --git a/Makefile.am b/Makefile.am
> >> -index 0fb3f9f..4623963 100644
> >> +index 93c0509..31ea94d 100644
> >>  --- a/Makefile.am
> >>  +++ b/Makefile.am
> >> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
> >> -     -DKEXEC=\"$(KEXEC)\" \
> >> -     -DLIBDIR=\"$(libdir)\" \
> >> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
> >>       -DROOTLIBDIR=\"$(rootlibdir)\" \
> >> -+    -DROOTHOMEDIR=\"$(roothomedir)\" \
> >> +     -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> >>       -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> >> ++    -DROOTHOMEDIR=\"$(roothomedir)\" \
> >>       -I $(top_srcdir)/src \
> >>       -I $(top_builddir)/src/shared \
> >> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
> >> +     -I $(top_srcdir)/src/shared \
> >> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
> >>   substitutions = \
> >>          '|rootlibexecdir=$(rootlibexecdir)|' \
> >>          '|rootbindir=$(rootbindir)|' \
> >> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
> >>          '|SYSTEMCTL=$(rootbindir)/systemctl|' \
> >>          '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
> >>  diff --git a/configure.ac b/configure.ac
> >> -index a5b2e6e..55bb7d8 100644
> >> +index 01ee8dc..800a587 100644
> >>  --- a/configure.ac
> >>  +++ b/configure.ac
> >> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
> >> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
> >>           [],
> >>           [with_rootlibdir=${libdir}])
> >>
> >> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
> >>   AC_ARG_WITH([pamlibdir],
> >>           AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
> >>           [],
> >> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> >> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> >>   AC_SUBST([pamconfdir], [$with_pamconfdir])
> >>   AC_SUBST([rootprefix], [$with_rootprefix])
> >>   AC_SUBST([rootlibdir], [$with_rootlibdir])
> >> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
> >>
> >>   AC_CONFIG_FILES([
> >>           Makefile po/Makefile.in
> >> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
> >> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
> >>           include_prefix:          ${INCLUDE_PREFIX}
> >>           lib dir:                 ${libdir}
> >>           rootlib dir:             ${with_rootlibdir}
> >> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
> >>           SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
> >>           Build Python:            ${PYTHON}
> >>  diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
> >> -index 97135db..14d12f1 100644
> >> +index 7736899..ac5f008 100644
> >>  --- a/src/core/unit-printf.c
> >>  +++ b/src/core/unit-printf.c
> >> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> >> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> >>                    * best of it if we can, but fail if we can't */
> >>
> >>                   if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
> >> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
> >>                           return -ENOTSUP;
> >>
> >>  diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
> >> -index b597edb..0b32673 100644
> >> +index 08bfdcf..b44b4cd 100644
> >>  --- a/src/nspawn/nspawn.c
> >>  +++ b/src/nspawn/nspawn.c
> >> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
> >> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
> >> +                         r = change_uid_gid(&home);
> >>                           if (r < 0)
> >>                                   _exit(EXIT_FAILURE);
> >> -
> >> +-
> >>  -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
> >>  +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
> >>                               (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
> >>                               (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
> >>                                   log_oom();
> >> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
> >> -                                 execvp(argv[optind], argv + optind);
> >> - #endif /* HAVE_EXECVPE */
> >> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
> >> +                         } else if (argc > optind)
> >> +                                 execvpe(argv[optind], argv + optind, env_use);
> >>                           else {
> >>  -                                chdir(home ? home : "/root");
> >>  +                                chdir(home ? home : ROOTHOMEDIR);
> >> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
> >>                                   execle("/bin/sh", "-sh", NULL, env_use);
> >>                           }
> >>  diff --git a/src/shared/util.c b/src/shared/util.c
> >> -index cbbe3b1..a0e3cc5 100644
> >> +index 241e752..00adab6 100644
> >>  --- a/src/shared/util.c
> >>  +++ b/src/shared/util.c
> >> -@@ -4609,7 +4609,7 @@ int get_user_creds(
> >> +@@ -4604,7 +4604,7 @@ int get_user_creds(
> >>                           *gid = 0;
> >>
> >>                   if (home)
> >> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
> >>
> >>                   if (shell)
> >>                           *shell = "/bin/sh";
> >> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
> >> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
> >>           /* Hardcode home directory for root to avoid NSS */
> >>           u = getuid();
> >>           if (u == 0) {
> >> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
> >>                   if (!h)
> >>                           return -ENOMEM;
> >>
> >> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
> >> -index 5c80722..efde5f0 100644
> >> ---- a/units/console-shell.service.m4.in
> >> -+++ b/units/console-shell.service.m4.in
> >> -@@ -15,8 +15,8 @@ After=rc-local.service
> >> - Before=getty.target
> >> -
> >> - [Service]
> >> --Environment=HOME=/root
> >> --WorkingDirectory=/root
> >> -+Environment=HOME=@roothomedir@
> >> -+WorkingDirectory=@roothomedir@
> >> - ExecStart=-@SULOGIN@
> >> - ExecStopPost=-@SYSTEMCTL@ poweroff
> >> - Type=idle
> >>  diff --git a/units/emergency.service.in b/units/emergency.service.in
> >>  index 2695d7b..7f47b73 100644
> >>  --- a/units/emergency.service.in
> >> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
> >>   ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
> >>   ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
> >>  --
> >> -2.1.4
> >> +1.9.1
> >>
> >> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> >> new file mode 100644
> >> index 0000000..1e4a69d
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> >> @@ -0,0 +1,37 @@
> >> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
> >> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> >> +Date: Tue, 24 Feb 2015 20:40:07 +0100
> >> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
> >> +
> >> +CID#1271344/1271345
> >> +
> >> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
> >> +---
> >> + src/shared/acl-util.c | 4 ++--
> >> + 1 file changed, 2 insertions(+), 2 deletions(-)
> >> +
> >> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> >> +index cbe09d7..e67e9ac 100644
> >> +--- a/src/shared/acl-util.c
> >> ++++ b/src/shared/acl-util.c
> >> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> >> +                 /* can have only one of those */
> >> +                 return true;
> >> +         case ACL_USER: {
> >> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> >> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
> >> +
> >> +                 uid_a = acl_get_qualifier(a);
> >> +                 if (!uid_a)
> >> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> >> +                 return *uid_a == *uid_b;
> >> +         }
> >> +         case ACL_GROUP: {
> >> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> >> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
> >> +
> >> +                 gid_a = acl_get_qualifier(a);
> >> +                 if (!gid_a)
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> >> new file mode 100644
> >> index 0000000..dca5e20
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> >> @@ -0,0 +1,28 @@
> >> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
> >> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> >> +Date: Tue, 24 Feb 2015 18:32:31 +0200
> >> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
> >> +
> >> +If we have less samples than expected, systemd-bootchart will crash.
> >> +
> >> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
> >> +---
> >> + src/bootchart/svg.c | 2 +-
> >> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
> >> +index e111fa9..144177c 100644
> >> +--- a/src/bootchart/svg.c
> >> ++++ b/src/bootchart/svg.c
> >> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
> >> +
> >> +                 ps->sample = ps->sample->next;
> >> +                 sample_hz = ps->sample;
> >> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
> >> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
> >> +                         sample_hz = sample_hz->next;
> >> +
> >> +                 /* subtract bootchart cpu utilization from total */
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> >> new file mode 100644
> >> index 0000000..e0cb193
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> >> @@ -0,0 +1,38 @@
> >> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
> >> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> >> +Date: Mon, 23 Feb 2015 16:01:31 +0200
> >> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
> >> +
> >> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
> >> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
> >> +syscalls getrandom and memfd_create").
> >> +
> >> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
> >> +---
> >> + src/shared/missing.h | 10 ++++++++++
> >> + 1 file changed, 10 insertions(+)
> >> +
> >> +diff --git a/src/shared/missing.h b/src/shared/missing.h
> >> +index b33a70c..e72631e 100644
> >> +--- a/src/shared/missing.h
> >> ++++ b/src/shared/missing.h
> >> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
> >> + #    define __NR_getrandom 349
> >> + #  elif defined(__powerpc__)
> >> + #    define __NR_getrandom 359
> >> ++#  elif defined _MIPS_SIM
> >> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
> >> ++#      define __NR_getrandom 4353
> >> ++#    endif
> >> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
> >> ++#      define __NR_getrandom 6317
> >> ++#    endif
> >> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
> >> ++#      define __NR_getrandom 5313
> >> ++#    endif
> >> + #  else
> >> + #    warning "__NR_getrandom unknown for your architecture"
> >> + #    define __NR_getrandom 0xffffffff
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> >> new file mode 100644
> >> index 0000000..1b842a2
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> >> @@ -0,0 +1,33 @@
> >> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
> >> +From: Lennart Poettering <lennart@poettering.net>
> >> +Date: Wed, 25 Feb 2015 22:05:14 +0100
> >> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
> >> + units in --user mode
> >> +
> >> +When running in user mode unmounting of mount units when a device
> >> +vanishes is unlikely to work, and even if it would work is already done
> >> +by PID 1 anyway. HEnce, when creating implicit dependencies between
> >> +mount units and their backing devices, created a Wants= type dependency
> >> +in --user mode, but leave a BindsTo= dependency in --system mode.
> >> +
> >> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
> >> +---
> >> + src/core/unit.c | 2 +-
> >> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/core/unit.c b/src/core/unit.c
> >> +index ee8e607..9f1e55e 100644
> >> +--- a/src/core/unit.c
> >> ++++ b/src/core/unit.c
> >> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> >> +         if (r < 0)
> >> +                 return r;
> >> +
> >> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
> >> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
> >> +         if (r < 0)
> >> +                 return r;
> >> +
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> >> new file mode 100644
> >> index 0000000..92c4b8f
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> >> @@ -0,0 +1,43 @@
> >> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
> >> +From: Colin Walters <walters@verbum.org>
> >> +Date: Tue, 17 Feb 2015 13:47:34 -0500
> >> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
> >> + caused it
> >> +
> >> +I'm trying to track down a relatively recent change in systemd
> >> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
> >> +
> >> +Systemd started to stop sysroot.mount, and this patch should help
> >> +me debug why at least.
> >> +
> >> +While we're here, "break" on the first unit we find that will
> >> +deactivate, as there's no point in further iteration.
> >> +
> >> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
> >> +---
> >> + src/core/unit.c | 4 +++-
> >> + 1 file changed, 3 insertions(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/core/unit.c b/src/core/unit.c
> >> +index 9f1e55e..563f6fe 100644
> >> +--- a/src/core/unit.c
> >> ++++ b/src/core/unit.c
> >> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
> >> +                         continue;
> >> +
> >> +                 stop = true;
> >> ++                break;
> >> +         }
> >> +
> >> +         if (!stop)
> >> +                 return;
> >> +
> >> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
> >> ++        assert(other);
> >> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
> >> +
> >> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
> >> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> >> new file mode 100644
> >> index 0000000..46c25bd
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> >> @@ -0,0 +1,30 @@
> >> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
> >> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >> +Date: Thu, 26 Feb 2015 19:00:11 -0500
> >> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
> >> + debug
> >> +
> >> +Printing it at info level was tedious. We don't do that for any other
> >> +overrides.
> >> +
> >> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
> >> +---
> >> + src/sysctl/sysctl.c | 2 +-
> >> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
> >> +index 275a5b7..2415d84 100644
> >> +--- a/src/sysctl/sysctl.c
> >> ++++ b/src/sysctl/sysctl.c
> >> +@@ -176,7 +176,7 @@ found:
> >> +                         if (streq(value, existing))
> >> +                                 continue;
> >> +
> >> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
> >> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
> >> +                         free(hashmap_remove(sysctl_options, p));
> >> +                         free(v);
> >> +                 }
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> >> new file mode 100644
> >> index 0000000..87dce1f
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> >> @@ -0,0 +1,39 @@
> >> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
> >> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >> +Date: Thu, 26 Feb 2015 19:05:51 -0500
> >> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
> >> +
> >> +Also a link to decent documentation for sysrq keys. It is surprising
> >> +hard to find.
> >> +
> >> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
> >> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
> >> +---
> >> + sysctl.d/50-default.conf | 9 ++++++++-
> >> + 1 file changed, 8 insertions(+), 1 deletion(-)
> >> +
> >> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
> >> +index f189233..def151b 100644
> >> +--- a/sysctl.d/50-default.conf
> >> ++++ b/sysctl.d/50-default.conf
> >> +@@ -5,9 +5,16 @@
> >> + #  the Free Software Foundation; either version 2.1 of the License, or
> >> + #  (at your option) any later version.
> >> +
> >> +-# See sysctl.d(5) and core(5) for for details.
> >> ++# See sysctl.d(5) and core(5) for for documentation.
> >> ++
> >> ++# To override settings in this file, create a local file in /etc
> >> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
> >> ++# there.
> >> +
> >> + # System Request functionality of the kernel (SYNC)
> >> ++#
> >> ++# Use kernel.sysrq = 1 to allow all keys.
> >> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
> >> + kernel.sysrq = 16
> >> +
> >> + # Append the PID to the core filename
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> >> new file mode 100644
> >> index 0000000..a3ab3e4
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> >> @@ -0,0 +1,912 @@
> >> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
> >> +From: Lennart Poettering <lennart@poettering.net>
> >> +Date: Fri, 27 Feb 2015 21:55:08 +0100
> >> +Subject: [PATCH 17/26] core: rework device state logic
> >> +
> >> +This change introduces a new state "tentative" for device units. Device
> >> +units are considered "plugged" when udev announced them, "dead" when
> >> +they are not available in the kernel, and "tentative" when they are
> >> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
> >> +announced via udev.
> >> +
> >> +This should fix a race when device nodes (like loop devices) are created
> >> +and immediately mounted. Previously, systemd might end up seeing the
> >> +mount unit before the device, and would thus pull down the mount because
> >> +its BindTo dependency on the device would not be fulfilled.
> >> +
> >> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
> >> +---
> >> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
> >> + src/core/device.h |  14 ++-
> >> + src/core/mount.c  |  46 ++++---
> >> + src/core/swap.c   |  32 +++--
> >> + src/core/swap.h   |   4 +-
> >> + src/core/unit.c   |   1 -
> >> + 6 files changed, 285 insertions(+), 180 deletions(-)
> >> +
> >> +diff --git a/src/core/device.c b/src/core/device.c
> >> +index d3deac3..75b9a46 100644
> >> +--- a/src/core/device.c
> >> ++++ b/src/core/device.c
> >> +@@ -36,7 +36,8 @@
> >> +
> >> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
> >> +         [DEVICE_DEAD] = UNIT_INACTIVE,
> >> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
> >> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
> >> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
> >> + };
> >> +
> >> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
> >> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
> >> +         d->sysfs = NULL;
> >> + }
> >> +
> >> ++static int device_set_sysfs(Device *d, const char *sysfs) {
> >> ++        Device *first;
> >> ++        char *copy;
> >> ++        int r;
> >> ++
> >> ++        assert(d);
> >> ++
> >> ++        if (streq_ptr(d->sysfs, sysfs))
> >> ++                return 0;
> >> ++
> >> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
> >> ++        if (r < 0)
> >> ++                return r;
> >> ++
> >> ++        copy = strdup(sysfs);
> >> ++        if (!copy)
> >> ++                return -ENOMEM;
> >> ++
> >> ++        device_unset_sysfs(d);
> >> ++
> >> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
> >> ++        LIST_PREPEND(same_sysfs, first, d);
> >> ++
> >> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
> >> ++        if (r < 0) {
> >> ++                LIST_REMOVE(same_sysfs, first, d);
> >> ++                free(copy);
> >> ++                return r;
> >> ++        }
> >> ++
> >> ++        d->sysfs = copy;
> >> ++
> >> ++        return 0;
> >> ++}
> >> ++
> >> + static void device_init(Unit *u) {
> >> +         Device *d = DEVICE(u);
> >> +
> >> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
> >> +         assert(d);
> >> +         assert(d->state == DEVICE_DEAD);
> >> +
> >> +-        if (d->sysfs)
> >> ++        if (d->found & DEVICE_FOUND_UDEV)
> >> ++                /* If udev says the device is around, it's around */
> >> +                 device_set_state(d, DEVICE_PLUGGED);
> >> ++        else if (d->found != DEVICE_NOT_FOUND)
> >> ++                /* If a device is found in /proc/self/mountinfo or
> >> ++                 * /proc/swaps, it's "tentatively" around. */
> >> ++                device_set_state(d, DEVICE_TENTATIVE);
> >> +
> >> +         return 0;
> >> + }
> >> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
> >> +         return device_state_to_string(DEVICE(u)->state);
> >> + }
> >> +
> >> +-static int device_add_escaped_name(Unit *u, const char *dn) {
> >> +-        _cleanup_free_ char *e = NULL;
> >> +-        int r;
> >> +-
> >> +-        assert(u);
> >> +-        assert(dn);
> >> +-        assert(dn[0] == '/');
> >> +-
> >> +-        e = unit_name_from_path(dn, ".device");
> >> +-        if (!e)
> >> +-                return -ENOMEM;
> >> +-
> >> +-        r = unit_add_name(u, e);
> >> +-        if (r < 0 && r != -EEXIST)
> >> +-                return r;
> >> +-
> >> +-        return 0;
> >> +-}
> >> +-
> >> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
> >> +-        _cleanup_free_ char *e = NULL;
> >> +-        Unit *u;
> >> +-
> >> +-        assert(m);
> >> +-        assert(dn);
> >> +-        assert(dn[0] == '/');
> >> +-        assert(_u);
> >> +-
> >> +-        e = unit_name_from_path(dn, ".device");
> >> +-        if (!e)
> >> +-                return -ENOMEM;
> >> +-
> >> +-        u = manager_get_unit(m, e);
> >> +-        if (u) {
> >> +-                *_u = u;
> >> +-                return 1;
> >> +-        }
> >> +-
> >> +-        return 0;
> >> +-}
> >> +-
> >> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
> >> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
> >> +         const char *model;
> >> ++        int r;
> >> +
> >> +         assert(u);
> >> +         assert(dev);
> >> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
> >> +
> >> +                         j = strjoin(model, " ", label, NULL);
> >> +                         if (j)
> >> +-                                return unit_set_description(u, j);
> >> +-                }
> >> ++                                r = unit_set_description(u, j);
> >> ++                } else
> >> ++                        r = unit_set_description(u, model);
> >> ++        } else
> >> ++                r = unit_set_description(u, path);
> >> +
> >> +-                return unit_set_description(u, model);
> >> +-        }
> >> ++        if (r < 0)
> >> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
> >> +
> >> +-        return unit_set_description(u, path);
> >> ++        return r;
> >> + }
> >> +
> >> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> >> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> >> +
> >> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
> >> +                 if (!n)
> >> +-                        return -ENOMEM;
> >> ++                        return log_oom();
> >> +
> >> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
> >> +                 if (r < 0)
> >> +-                        return r;
> >> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
> >> +         }
> >> +         if (!isempty(state))
> >> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
> >> +-                                 property, strna(udev_device_get_syspath(dev)));
> >> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
> >> +
> >> +         return 0;
> >> + }
> >> +
> >> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> >> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> >> ++        _cleanup_free_ char *e = NULL;
> >> +         const char *sysfs;
> >> +         Unit *u = NULL;
> >> +         bool delete;
> >> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >> +         if (!sysfs)
> >> +                 return 0;
> >> +
> >> +-        r = device_find_escape_name(m, path, &u);
> >> +-        if (r < 0)
> >> +-                return r;
> >> ++        e = unit_name_from_path(path, ".device");
> >> ++        if (!e)
> >> ++                return log_oom();
> >> ++
> >> ++        u = manager_get_unit(m, e);
> >> +
> >> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
> >> ++        if (u &&
> >> ++            DEVICE(u)->sysfs &&
> >> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
> >> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
> >> +                 return -EEXIST;
> >> ++        }
> >> +
> >> +         if (!u) {
> >> +                 delete = true;
> >> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >> +                 if (!u)
> >> +                         return log_oom();
> >> +
> >> +-                r = device_add_escaped_name(u, path);
> >> ++                r = unit_add_name(u, e);
> >> +                 if (r < 0)
> >> +                         goto fail;
> >> +
> >> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >> +          * actually been seen yet ->sysfs will not be
> >> +          * initialized. Hence initialize it if necessary. */
> >> +
> >> +-        if (!DEVICE(u)->sysfs) {
> >> +-                Device *first;
> >> +-
> >> +-                DEVICE(u)->sysfs = strdup(sysfs);
> >> +-                if (!DEVICE(u)->sysfs) {
> >> +-                        r = -ENOMEM;
> >> +-                        goto fail;
> >> +-                }
> >> +-
> >> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
> >> +-                if (r < 0)
> >> +-                        goto fail;
> >> +-
> >> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
> >> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
> >> +-
> >> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
> >> +-                if (r < 0)
> >> +-                        goto fail;
> >> +-        }
> >> +-
> >> +-        device_make_description(u, dev, path);
> >> ++        r = device_set_sysfs(DEVICE(u), sysfs);
> >> ++        if (r < 0)
> >> ++                goto fail;
> >> +
> >> +-        if (main) {
> >> +-                /* The additional systemd udev properties we only
> >> +-                 * interpret for the main object */
> >> ++        (void) device_update_description(u, dev, path);
> >> +
> >> +-                r = device_add_udev_wants(u, dev);
> >> +-                if (r < 0)
> >> +-                        goto fail;
> >> +-        }
> >> ++        /* The additional systemd udev properties we only interpret
> >> ++         * for the main object */
> >> ++        if (main)
> >> ++                (void) device_add_udev_wants(u, dev);
> >> +
> >> +         /* Note that this won't dispatch the load queue, the caller
> >> +          * has to do that if needed and appropriate */
> >> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >> +         return 0;
> >> +
> >> + fail:
> >> +-        log_warning_errno(r, "Failed to load device unit: %m");
> >> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
> >> +
> >> +         if (delete && u)
> >> +                 unit_free(u);
> >> +@@ -342,7 +331,7 @@ fail:
> >> +         return r;
> >> + }
> >> +
> >> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >> ++static int device_process_new(Manager *m, struct udev_device *dev) {
> >> +         const char *sysfs, *dn, *alias;
> >> +         struct udev_list_entry *item = NULL, *first = NULL;
> >> +         int r;
> >> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >> +                 return 0;
> >> +
> >> +         /* Add the main unit named after the sysfs path */
> >> +-        r = device_update_unit(m, dev, sysfs, true);
> >> ++        r = device_setup_unit(m, dev, sysfs, true);
> >> +         if (r < 0)
> >> +                 return r;
> >> +
> >> +         /* Add an additional unit for the device node */
> >> +         dn = udev_device_get_devnode(dev);
> >> +         if (dn)
> >> +-                device_update_unit(m, dev, dn, false);
> >> ++                (void) device_setup_unit(m, dev, dn, false);
> >> +
> >> +         /* Add additional units for all symlinks */
> >> +         first = udev_device_get_devlinks_list_entry(dev);
> >> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >> +                             st.st_rdev != udev_device_get_devnum(dev))
> >> +                                 continue;
> >> +
> >> +-                device_update_unit(m, dev, p, false);
> >> ++                (void) device_setup_unit(m, dev, p, false);
> >> +         }
> >> +
> >> +         /* Add additional units for all explicitly configured
> >> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >> +                         e[l] = 0;
> >> +
> >> +                         if (path_is_absolute(e))
> >> +-                                device_update_unit(m, dev, e, false);
> >> ++                                (void) device_setup_unit(m, dev, e, false);
> >> +                         else
> >> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
> >> +                 }
> >> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >> +         return 0;
> >> + }
> >> +
> >> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
> >> +-        const char *sysfs;
> >> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
> >> ++        DeviceFound n;
> >> ++
> >> ++        assert(d);
> >> ++
> >> ++        n = add ? (d->found | found) : (d->found & ~found);
> >> ++        if (n == d->found)
> >> ++                return;
> >> ++
> >> ++        d->found = n;
> >> ++
> >> ++        if (now) {
> >> ++                if (d->found & DEVICE_FOUND_UDEV)
> >> ++                        device_set_state(d, DEVICE_PLUGGED);
> >> ++                else if (d->found != DEVICE_NOT_FOUND)
> >> ++                        device_set_state(d, DEVICE_TENTATIVE);
> >> ++                else
> >> ++                        device_set_state(d, DEVICE_DEAD);
> >> ++        }
> >> ++}
> >> ++
> >> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
> >> +         Device *d, *l;
> >> +
> >> +         assert(m);
> >> +-        assert(dev);
> >> ++        assert(sysfs);
> >> +
> >> +-        sysfs = udev_device_get_syspath(dev);
> >> +-        if (!sysfs)
> >> +-                return;
> >> ++        if (found == DEVICE_NOT_FOUND)
> >> ++                return 0;
> >> +
> >> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
> >> +         LIST_FOREACH(same_sysfs, d, l)
> >> +-                device_set_state(d, DEVICE_PLUGGED);
> >> ++                device_update_found_one(d, add, found, now);
> >> ++
> >> ++        return 0;
> >> + }
> >> +
> >> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
> >> +-        const char *sysfs;
> >> +-        Device *d;
> >> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
> >> ++        _cleanup_free_ char *e = NULL;
> >> ++        Unit *u;
> >> +
> >> +         assert(m);
> >> +-        assert(dev);
> >> ++        assert(path);
> >> +
> >> +-        sysfs = udev_device_get_syspath(dev);
> >> +-        if (!sysfs)
> >> +-                return -ENOMEM;
> >> ++        if (found == DEVICE_NOT_FOUND)
> >> ++                return 0;
> >> +
> >> +-        /* Remove all units of this sysfs path */
> >> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
> >> +-                device_unset_sysfs(d);
> >> +-                device_set_state(d, DEVICE_DEAD);
> >> +-        }
> >> ++        e = unit_name_from_path(path, ".device");
> >> ++        if (!e)
> >> ++                return log_oom();
> >> +
> >> ++        u = manager_get_unit(m, e);
> >> ++        if (!u)
> >> ++                return 0;
> >> ++
> >> ++        device_update_found_one(DEVICE(u), add, found, now);
> >> +         return 0;
> >> + }
> >> +
> >> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
> >> +         return parse_boolean(ready) != 0;
> >> + }
> >> +
> >> +-static int device_process_new_path(Manager *m, const char *path) {
> >> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >> +-
> >> +-        assert(m);
> >> +-        assert(path);
> >> +-
> >> +-        dev = udev_device_new_from_syspath(m->udev, path);
> >> +-        if (!dev)
> >> +-                return log_oom();
> >> +-
> >> +-        if (!device_is_ready(dev))
> >> +-                return 0;
> >> +-
> >> +-        return device_process_new_device(m, dev);
> >> +-}
> >> +-
> >> + static Unit *device_following(Unit *u) {
> >> +         Device *d = DEVICE(u);
> >> +         Device *other, *first = NULL;
> >> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
> >> +                 goto fail;
> >> +
> >> +         first = udev_enumerate_get_list_entry(e);
> >> +-        udev_list_entry_foreach(item, first)
> >> +-                device_process_new_path(m, udev_list_entry_get_name(item));
> >> ++        udev_list_entry_foreach(item, first) {
> >> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >> ++                const char *sysfs;
> >> ++
> >> ++                sysfs = udev_list_entry_get_name(item);
> >> ++
> >> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
> >> ++                if (!dev) {
> >> ++                        log_oom();
> >> ++                        continue;
> >> ++                }
> >> ++
> >> ++                if (!device_is_ready(dev))
> >> ++                        continue;
> >> ++
> >> ++                (void) device_process_new(m, dev);
> >> ++
> >> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
> >> ++        }
> >> +
> >> +         return 0;
> >> +
> >> + fail:
> >> ++        log_error_errno(r, "Failed to enumerate devices: %m");
> >> ++
> >> +         device_shutdown(m);
> >> +         return r;
> >> + }
> >> +@@ -619,7 +634,7 @@ fail:
> >> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
> >> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >> +         Manager *m = userdata;
> >> +-        const char *action;
> >> ++        const char *action, *sysfs;
> >> +         int r;
> >> +
> >> +         assert(m);
> >> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> >> +         if (!dev)
> >> +                 return 0;
> >> +
> >> ++        sysfs = udev_device_get_syspath(dev);
> >> ++        if (!sysfs) {
> >> ++                log_error("Failed to get udev sys path.");
> >> ++                return 0;
> >> ++        }
> >> ++
> >> +         action = udev_device_get_action(dev);
> >> +         if (!action) {
> >> +                 log_error("Failed to get udev action string.");
> >> +                 return 0;
> >> +         }
> >> +
> >> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
> >> +-                r = device_process_removed_device(m, dev);
> >> +-                if (r < 0)
> >> +-                        log_error_errno(r, "Failed to process device remove event: %m");
> >> +-
> >> +-                r = swap_process_removed_device(m, dev);
> >> ++        if (streq(action, "remove"))  {
> >> ++                r = swap_process_device_remove(m, dev);
> >> +                 if (r < 0)
> >> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
> >> +
> >> +-        } else {
> >> +-                r = device_process_new_device(m, dev);
> >> +-                if (r < 0)
> >> +-                        log_error_errno(r, "Failed to process device new event: %m");
> >> ++                /* If we get notified that a device was removed by
> >> ++                 * udev, then it's completely gone, hence unset all
> >> ++                 * found bits */
> >> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
> >> +
> >> +-                r = swap_process_new_device(m, dev);
> >> ++        } else if (device_is_ready(dev)) {
> >> ++
> >> ++                (void) device_process_new(m, dev);
> >> ++
> >> ++                r = swap_process_device_new(m, dev);
> >> +                 if (r < 0)
> >> +                         log_error_errno(r, "Failed to process swap device new event: %m");
> >> +
> >> +                 manager_dispatch_load_queue(m);
> >> +
> >> +-                device_set_path_plugged(m, dev);
> >> ++                /* The device is found now, set the udev found bit */
> >> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
> >> ++
> >> ++        } else {
> >> ++                /* The device is nominally around, but not ready for
> >> ++                 * us. Hence unset the udev bit, but leave the rest
> >> ++                 * around. */
> >> ++
> >> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
> >> +         }
> >> +
> >> +         return 0;
> >> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
> >> +         return read_only <= 0;
> >> + }
> >> +
> >> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
> >> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >> ++        struct stat st;
> >> ++
> >> ++        assert(m);
> >> ++        assert(node);
> >> ++
> >> ++        /* This is called whenever we find a device referenced in
> >> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
> >> ++         * mounted/enabled at a time where udev has not finished
> >> ++         * probing it yet, and we thus haven't learned about it
> >> ++         * yet. In this case we will set the device unit to
> >> ++         * "tentative" state. */
> >> ++
> >> ++        if (add) {
> >> ++                if (!path_startswith(node, "/dev"))
> >> ++                        return 0;
> >> ++
> >> ++                if (stat(node, &st) < 0) {
> >> ++                        if (errno == ENOENT)
> >> ++                                return 0;
> >> ++
> >> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
> >> ++                }
> >> ++
> >> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
> >> ++                        return 0;
> >> ++
> >> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
> >> ++                if (!dev) {
> >> ++                        if (errno == ENOENT)
> >> ++                                return 0;
> >> ++
> >> ++                        return log_oom();
> >> ++                }
> >> ++
> >> ++                /* If the device is known in the kernel and newly
> >> ++                 * appeared, then we'll create a device unit for it,
> >> ++                 * under the name referenced in /proc/swaps or
> >> ++                 * /proc/self/mountinfo. */
> >> ++
> >> ++                (void) device_setup_unit(m, dev, node, false);
> >> ++        }
> >> ++
> >> ++        /* Update the device unit's state, should it exist */
> >> ++        return device_update_found_by_name(m, node, add, found, now);
> >> ++}
> >> ++
> >> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
> >> +         [DEVICE_DEAD] = "dead",
> >> +-        [DEVICE_PLUGGED] = "plugged"
> >> ++        [DEVICE_TENTATIVE] = "tentative",
> >> ++        [DEVICE_PLUGGED] = "plugged",
> >> + };
> >> +
> >> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
> >> +diff --git a/src/core/device.h b/src/core/device.h
> >> +index bb7ae07..0609b20 100644
> >> +--- a/src/core/device.h
> >> ++++ b/src/core/device.h
> >> +@@ -29,20 +29,28 @@ typedef struct Device Device;
> >> +  * simplifies the state engine greatly */
> >> + typedef enum DeviceState {
> >> +         DEVICE_DEAD,
> >> +-        DEVICE_PLUGGED,
> >> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
> >> ++        DEVICE_PLUGGED,   /* announced by udev */
> >> +         _DEVICE_STATE_MAX,
> >> +         _DEVICE_STATE_INVALID = -1
> >> + } DeviceState;
> >> +
> >> ++typedef enum DeviceFound {
> >> ++        DEVICE_NOT_FOUND = 0,
> >> ++        DEVICE_FOUND_UDEV = 1,
> >> ++        DEVICE_FOUND_MOUNT = 2,
> >> ++        DEVICE_FOUND_SWAP = 4,
> >> ++} DeviceFound;
> >> ++
> >> + struct Device {
> >> +         Unit meta;
> >> +
> >> +         char *sysfs;
> >> ++        DeviceFound found;
> >> +
> >> +         /* In order to be able to distinguish dependencies on
> >> +         different device nodes we might end up creating multiple
> >> +         devices for the same sysfs path. We chain them up here. */
> >> +-
> >> +         LIST_FIELDS(struct Device, same_sysfs);
> >> +
> >> +         DeviceState state;
> >> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
> >> +
> >> + const char* device_state_to_string(DeviceState i) _const_;
> >> + DeviceState device_state_from_string(const char *s) _pure_;
> >> ++
> >> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
> >> +diff --git a/src/core/mount.c b/src/core/mount.c
> >> +index f3977e6..c971330 100644
> >> +--- a/src/core/mount.c
> >> ++++ b/src/core/mount.c
> >> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
> >> +         return 0;
> >> + }
> >> +
> >> +-static int mount_add_one(
> >> ++static int mount_setup_unit(
> >> +                 Manager *m,
> >> +                 const char *what,
> >> +                 const char *where,
> >> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
> >> +
> >> +                 u = unit_new(m, sizeof(Mount));
> >> +                 if (!u)
> >> +-                        return -ENOMEM;
> >> ++                        return log_oom();
> >> +
> >> +                 r = unit_add_name(u, e);
> >> +                 if (r < 0)
> >> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
> >> +         return 0;
> >> +
> >> + fail:
> >> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
> >> ++
> >> +         if (delete && u)
> >> +                 unit_free(u);
> >> +
> >> +@@ -1554,33 +1556,36 @@ fail:
> >> + }
> >> +
> >> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> >> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
> >> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
> >> +-        struct libmnt_fs *fs;
> >> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
> >> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
> >> +         int r = 0;
> >> +
> >> +         assert(m);
> >> +
> >> +-        tb = mnt_new_table();
> >> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
> >> +-        if (!tb || !itr)
> >> ++        t = mnt_new_table();
> >> ++        if (!t)
> >> +                 return log_oom();
> >> +
> >> +-        r = mnt_table_parse_mtab(tb, NULL);
> >> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
> >> ++        if (!i)
> >> ++                return log_oom();
> >> ++
> >> ++        r = mnt_table_parse_mtab(t, NULL);
> >> +         if (r < 0)
> >> +-                return r;
> >> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
> >> +
> >> +         r = 0;
> >> +         for (;;) {
> >> +                 const char *device, *path, *options, *fstype;
> >> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
> >> ++                struct libmnt_fs *fs;
> >> +                 int k;
> >> +
> >> +-                k = mnt_table_next_fs(tb, itr, &fs);
> >> ++                k = mnt_table_next_fs(t, i, &fs);
> >> +                 if (k == 1)
> >> +                         break;
> >> +-                else if (k < 0)
> >> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
> >> ++                if (k < 0)
> >> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
> >> +
> >> +                 device = mnt_fs_get_source(fs);
> >> +                 path = mnt_fs_get_target(fs);
> >> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> >> +                 fstype = mnt_fs_get_fstype(fs);
> >> +
> >> +                 d = cunescape(device);
> >> ++                if (!d)
> >> ++                        return log_oom();
> >> ++
> >> +                 p = cunescape(path);
> >> +-                if (!d || !p)
> >> ++                if (!p)
> >> +                         return log_oom();
> >> +
> >> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
> >> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
> >> ++
> >> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
> >> +                 if (r == 0 && k < 0)
> >> +                         r = k;
> >> +         }
> >> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> >> +
> >> +         r = mount_load_proc_self_mountinfo(m, true);
> >> +         if (r < 0) {
> >> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
> >> +-
> >> +                 /* Reset flags, just in case, for later calls */
> >> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
> >> +                         Mount *mount = MOUNT(u);
> >> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> >> +                                 break;
> >> +                         }
> >> +
> >> ++                        if (mount->parameters_proc_self_mountinfo.what)
> >> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
> >> ++
> >> ++
> >> +                 } else if (mount->just_mounted || mount->just_changed) {
> >> +
> >> +                         /* New or changed mount entry */
> >> +diff --git a/src/core/swap.c b/src/core/swap.c
> >> +index 6997921..5c19af5 100644
> >> +--- a/src/core/swap.c
> >> ++++ b/src/core/swap.c
> >> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
> >> +         return swap_verify(s);
> >> + }
> >> +
> >> +-static int swap_add_one(
> >> ++static int swap_setup_unit(
> >> +                 Manager *m,
> >> +                 const char *what,
> >> +                 const char *what_proc_swaps,
> >> +@@ -363,8 +363,10 @@ static int swap_add_one(
> >> +
> >> +         if (u &&
> >> +             SWAP(u)->from_proc_swaps &&
> >> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
> >> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
> >> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
> >> +                 return -EEXIST;
> >> ++        }
> >> +
> >> +         if (!u) {
> >> +                 delete = true;
> >> +@@ -379,7 +381,7 @@ static int swap_add_one(
> >> +
> >> +                 SWAP(u)->what = strdup(what);
> >> +                 if (!SWAP(u)->what) {
> >> +-                        r = log_oom();
> >> ++                        r = -ENOMEM;
> >> +                         goto fail;
> >> +                 }
> >> +
> >> +@@ -407,7 +409,6 @@ static int swap_add_one(
> >> +         p->priority = priority;
> >> +
> >> +         unit_add_to_dbus_queue(u);
> >> +-
> >> +         return 0;
> >> +
> >> + fail:
> >> +@@ -419,7 +420,7 @@ fail:
> >> +         return r;
> >> + }
> >> +
> >> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
> >> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
> >> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
> >> +         struct udev_list_entry *item = NULL, *first = NULL;
> >> +         const char *dn;
> >> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> >> +
> >> +         assert(m);
> >> +
> >> +-        r = swap_add_one(m, device, device, prio, set_flags);
> >> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
> >> +         if (r < 0)
> >> +                 return r;
> >> +
> >> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> >> +         /* Add the main device node */
> >> +         dn = udev_device_get_devnode(d);
> >> +         if (dn && !streq(dn, device))
> >> +-                swap_add_one(m, dn, device, prio, set_flags);
> >> ++                swap_setup_unit(m, dn, device, prio, set_flags);
> >> +
> >> +         /* Add additional units for all symlinks */
> >> +         first = udev_device_get_devlinks_list_entry(d);
> >> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> >> +                             st.st_rdev != udev_device_get_devnum(d))
> >> +                                 continue;
> >> +
> >> +-                swap_add_one(m, p, device, prio, set_flags);
> >> ++                swap_setup_unit(m, p, device, prio, set_flags);
> >> +         }
> >> +
> >> +         return r;
> >> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
> >> +                         if (k == EOF)
> >> +                                 break;
> >> +
> >> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
> >> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
> >> +                         continue;
> >> +                 }
> >> +
> >> +                 d = cunescape(dev);
> >> +                 if (!d)
> >> +-                        return -ENOMEM;
> >> ++                        return log_oom();
> >> ++
> >> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
> >> +
> >> +-                k = swap_process_new_swap(m, d, prio, set_flags);
> >> ++                k = swap_process_new(m, d, prio, set_flags);
> >> +                 if (k < 0)
> >> +                         r = k;
> >> +         }
> >> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
> >> +                                 break;
> >> +                         }
> >> +
> >> ++                        if (swap->what)
> >> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
> >> ++
> >> +                 } else if (swap->just_activated) {
> >> +
> >> +                         /* New swap entry */
> >> +@@ -1298,7 +1304,7 @@ fail:
> >> +         return r;
> >> + }
> >> +
> >> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
> >> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
> >> +         struct udev_list_entry *item = NULL, *first = NULL;
> >> +         _cleanup_free_ char *e = NULL;
> >> +         const char *dn;
> >> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
> >> +         return r;
> >> + }
> >> +
> >> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
> >> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
> >> +         const char *dn;
> >> +         int r = 0;
> >> +         Swap *s;
> >> +diff --git a/src/core/swap.h b/src/core/swap.h
> >> +index 73e64d8..914a2db 100644
> >> +--- a/src/core/swap.h
> >> ++++ b/src/core/swap.h
> >> +@@ -116,8 +116,8 @@ struct Swap {
> >> +
> >> + extern const UnitVTable swap_vtable;
> >> +
> >> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
> >> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
> >> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
> >> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
> >> +
> >> + const char* swap_state_to_string(SwapState i) _const_;
> >> + SwapState swap_state_from_string(const char *s) _pure_;
> >> +diff --git a/src/core/unit.c b/src/core/unit.c
> >> +index 563f6fe..a6558ee 100644
> >> +--- a/src/core/unit.c
> >> ++++ b/src/core/unit.c
> >> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> >> +                 return -ENOMEM;
> >> +
> >> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
> >> +-
> >> +         if (r < 0)
> >> +                 return r;
> >> +
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> >> new file mode 100644
> >> index 0000000..d614085
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> >> @@ -0,0 +1,26 @@
> >> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
> >> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> >> +Date: Sat, 28 Feb 2015 23:39:55 +0100
> >> +Subject: [PATCH 18/26] core: fix return value on OOM
> >> +
> >> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
> >> +---
> >> + src/core/device.c | 2 ++
> >> + 1 file changed, 2 insertions(+)
> >> +
> >> +diff --git a/src/core/device.c b/src/core/device.c
> >> +index 75b9a46..1cc103c 100644
> >> +--- a/src/core/device.c
> >> ++++ b/src/core/device.c
> >> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
> >> +                         j = strjoin(model, " ", label, NULL);
> >> +                         if (j)
> >> +                                 r = unit_set_description(u, j);
> >> ++                        else
> >> ++                                r = -ENOMEM;
> >> +                 } else
> >> +                         r = unit_set_description(u, model);
> >> +         } else
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> >> new file mode 100644
> >> index 0000000..d94da60
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> >> @@ -0,0 +1,33 @@
> >> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
> >> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
> >> +Date: Thu, 19 Feb 2015 20:47:28 +0100
> >> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
> >> + bus on dbus1
> >> +
> >> +This fixes "machinectl login" on systems configured with --disable-kdbus.
> >> +
> >> +The error was:
> >> +machinectl login foo
> >> +Failed to get machine PTY: Input/output error
> >> +
> >> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
> >> +---
> >> + src/machine/machine-dbus.c | 2 +-
> >> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
> >> +index b46f0a8..b0f0f66 100644
> >> +--- a/src/machine/machine-dbus.c
> >> ++++ b/src/machine/machine-dbus.c
> >> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
> >> + #ifdef ENABLE_KDBUS
> >> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
> >> + #else
> >> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
> >> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
> >> + #endif
> >> +         if (!container_bus->address)
> >> +                 return -ENOMEM;
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> >> new file mode 100644
> >> index 0000000..fcc2adf
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> >> @@ -0,0 +1,25 @@
> >> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
> >> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> >> +Date: Fri, 20 Feb 2015 15:35:11 -0300
> >> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
> >> +
> >> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
> >> +---
> >> + src/shared/util.c | 1 +
> >> + 1 file changed, 1 insertion(+)
> >> +
> >> +diff --git a/src/shared/util.c b/src/shared/util.c
> >> +index ba035ca..f24b5b4 100644
> >> +--- a/src/shared/util.c
> >> ++++ b/src/shared/util.c
> >> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
> >> +
> >> + bool fstype_is_network(const char *fstype) {
> >> +         static const char table[] =
> >> ++                "afs\0"
> >> +                 "cifs\0"
> >> +                 "smbfs\0"
> >> +                 "sshfs\0"
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> >> new file mode 100644
> >> index 0000000..02e279d
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> >> @@ -0,0 +1,31 @@
> >> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
> >> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
> >> +Date: Fri, 20 Feb 2015 10:53:28 +0100
> >> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
> >> +
> >> +Otherwise every daemon reload prints out warnings like:
> >> +
> >> +systemd[1]: Unit type .busname is not supported on this system.
> >> +systemd[1]: Unit type .swap is not supported on this system.
> >> +
> >> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
> >> +---
> >> + src/core/manager.c | 2 +-
> >> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/core/manager.c b/src/core/manager.c
> >> +index 4775219..bc9b7ec 100644
> >> +--- a/src/core/manager.c
> >> ++++ b/src/core/manager.c
> >> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
> >> +                 int q;
> >> +
> >> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
> >> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> >> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> >> +                         continue;
> >> +                 }
> >> +
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> >> new file mode 100644
> >> index 0000000..f5afd09
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> >> @@ -0,0 +1,97 @@
> >> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
> >> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >> +Date: Mon, 2 Mar 2015 10:34:51 -0500
> >> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
> >> +
> >> +Binary fields were not processed properly, and resulting journal files
> >> +were non-conforming, resulting in an error ("Invalid field.") when reading.
> >> +
> >> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
> >> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
> >> +---
> >> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
> >> + src/journal-remote/journal-remote-parse.h |  4 +++-
> >> + 2 files changed, 21 insertions(+), 14 deletions(-)
> >> +
> >> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
> >> +index d9dea8d..afded7e 100644
> >> +--- a/src/journal-remote/journal-remote-parse.c
> >> ++++ b/src/journal-remote/journal-remote-parse.c
> >> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
> >> +                    LLLLLLLL0011223344...\n
> >> +                 */
> >> +                 sep = memchr(line, '=', n);
> >> +-                if (sep)
> >> ++                if (sep) {
> >> +                         /* chomp newline */
> >> +                         n--;
> >> +-                else
> >> ++
> >> ++                        r = iovw_put(&source->iovw, line, n);
> >> ++                        if (r < 0)
> >> ++                                return r;
> >> ++                } else {
> >> +                         /* replace \n with = */
> >> +                         line[n-1] = '=';
> >> +-                log_trace("Received: %.*s", (int) n, line);
> >> +
> >> +-                r = iovw_put(&source->iovw, line, n);
> >> +-                if (r < 0) {
> >> +-                        log_error("Failed to put line in iovect");
> >> +-                        return r;
> >> ++                        source->field_len = n;
> >> ++                        source->state = STATE_DATA_START;
> >> ++
> >> ++                        /* we cannot put the field in iovec until we have all data */
> >> +                 }
> >> +
> >> +-                if (!sep)
> >> +-                        source->state = STATE_DATA_START;
> >> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
> >> ++
> >> +                 return 0; /* continue */
> >> +         }
> >> +
> >> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
> >> +
> >> +         case STATE_DATA: {
> >> +                 void *data;
> >> ++                char *field;
> >> +
> >> +                 assert(source->data_size > 0);
> >> +
> >> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
> >> +
> >> +                 assert(data);
> >> +
> >> +-                r = iovw_put(&source->iovw, data, source->data_size);
> >> +-                if (r < 0) {
> >> +-                        log_error("failed to put binary buffer in iovect");
> >> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
> >> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
> >> ++
> >> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
> >> ++                if (r < 0)
> >> +                         return r;
> >> +-                }
> >> +
> >> +                 source->state = STATE_DATA_FINISH;
> >> +
> >> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
> >> +index 8499f4e..22db550 100644
> >> +--- a/src/journal-remote/journal-remote-parse.h
> >> ++++ b/src/journal-remote/journal-remote-parse.h
> >> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
> >> +         size_t offset;     /* offset to the beginning of live data in the buffer */
> >> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
> >> +         size_t filled;     /* total number of bytes in the buffer */
> >> +-        size_t data_size;  /* size of the binary data chunk being processed */
> >> ++
> >> ++        size_t field_len;  /* used for binary fields: the field name length */
> >> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
> >> +
> >> +         struct iovec_wrapper iovw;
> >> +
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> >> new file mode 100644
> >> index 0000000..79e565b
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> >> @@ -0,0 +1,37 @@
> >> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
> >> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> >> +Date: Sun, 1 Mar 2015 21:13:10 -0300
> >> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
> >> +
> >> +Logs constantly show
> >> +
> >> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
> >> +
> >> +This is because ext4 does not support FS_NOCOW_FL.
> >> +
> >> +[zj: fold into one conditional as suggested on the ML and
> >> +     fix (preexisting) r/errno confusion in error message.]
> >> +
> >> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
> >> +---
> >> + src/journal/journal-file.c | 4 ++--
> >> + 1 file changed, 2 insertions(+), 2 deletions(-)
> >> +
> >> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
> >> +index 2845e05..0f28718 100644
> >> +--- a/src/journal/journal-file.c
> >> ++++ b/src/journal/journal-file.c
> >> +@@ -2611,8 +2611,8 @@ int journal_file_open(
> >> +                  * shouldn't be too bad, given that we do our own
> >> +                  * checksumming). */
> >> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
> >> +-                if (r < 0)
> >> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
> >> ++                if (r < 0 && r != -ENOTTY)
> >> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
> >> +
> >> +                 /* Let's attach the creation time to the journal file,
> >> +                  * so that the vacuuming code knows the age of this
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> >> new file mode 100644
> >> index 0000000..0cf9a0a
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> >> @@ -0,0 +1,53 @@
> >> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
> >> +From: Lennart Poettering <lennart@poettering.net>
> >> +Date: Mon, 2 Mar 2015 20:55:38 +0100
> >> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
> >> + happy
> >> +
> >> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
> >> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
> >> +---
> >> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
> >> + 1 file changed, 5 insertions(+), 7 deletions(-)
> >> +
> >> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
> >> +index 028c2a7..22a3a53 100644
> >> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
> >> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
> >> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> >> +                 .msg_iovlen = 1,
> >> +                 .msg_name = &sockaddr,
> >> +         };
> >> +-        union {
> >> +-                struct cmsghdr cmsghdr;
> >> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
> >> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
> >> +-        } control;
> >> ++        struct cmsghdr *control;
> >> +         _cleanup_close_ int fd = -1;
> >> +         struct cmsghdr *cmsg = NULL;
> >> +         const char *e;
> >> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> >> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
> >> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
> >> +
> >> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
> >> ++
> >> +         if (n_fds > 0) {
> >> +-                msghdr.msg_control = &control;
> >> ++                msghdr.msg_control = control;
> >> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
> >> +
> >> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
> >> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> >> +                 try_without_ucred = true;
> >> +                 controllen_without_ucred = msghdr.msg_controllen;
> >> +
> >> +-                msghdr.msg_control = &control;
> >> ++                msghdr.msg_control = control;
> >> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
> >> +
> >> +                 if (cmsg)
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> >> new file mode 100644
> >> index 0000000..6912489
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> >> @@ -0,0 +1,84 @@
> >> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
> >> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
> >> +Date: Tue, 3 Mar 2015 00:35:08 +0100
> >> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
> >> + filesystems
> >> +
> >> +A warning is printed if ACLs cannot be retrieved for any reason other
> >> +than -ENOSYS. For -ENOSYS, debug log is printed.
> >> +
> >> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
> >> +---
> >> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
> >> + 1 file changed, 20 insertions(+), 16 deletions(-)
> >> +
> >> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> >> +index 88ba7e4..187997e 100644
> >> +--- a/src/tmpfiles/tmpfiles.c
> >> ++++ b/src/tmpfiles/tmpfiles.c
> >> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> >> +         int r;
> >> +         _cleanup_(acl_free_charpp) char *t = NULL;
> >> +
> >> ++        /* Returns 0 for success, positive error if already warned,
> >> ++         * negative error otherwise. */
> >> ++
> >> +         if (modify) {
> >> +                 r = acls_for_file(path, type, acl, &dup);
> >> +                 if (r < 0)
> >> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> >> +
> >> +         r = acl_set_file(path, type, dup);
> >> +         if (r < 0)
> >> +-                return log_error_errno(-errno,
> >> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
> >> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
> >> +-                                       strna(t), path);
> >> ++                return -log_error_errno(errno,
> >> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
> >> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
> >> ++                                        strna(t), path);
> >> ++
> >> +         return 0;
> >> + }
> >> + #endif
> >> +
> >> + static int path_set_acls(Item *item, const char *path) {
> >> ++        int r = 0;
> >> + #ifdef HAVE_ACL
> >> +-        int r;
> >> +-
> >> +         assert(item);
> >> +         assert(path);
> >> +
> >> +-        if (item->acl_access) {
> >> ++        if (item->acl_access)
> >> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
> >> +-                if (r < 0)
> >> +-                        return r;
> >> +-        }
> >> +
> >> +-        if (item->acl_default) {
> >> ++        if (r == 0 && item->acl_default)
> >> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
> >> +-                if (r < 0)
> >> +-                        return r;
> >> +-        }
> >> +-#endif
> >> +
> >> +-        return 0;
> >> ++        if (r > 0)
> >> ++                return -r; /* already warned */
> >> ++        else if (r == -ENOTSUP) {
> >> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
> >> ++                return 0;
> >> ++        } else if (r < 0)
> >> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
> >> ++#endif
> >> ++        return r;
> >> + }
> >> +
> >> + static int write_one_file(Item *i, const char *path) {
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> >> new file mode 100644
> >> index 0000000..a49a369
> >> --- /dev/null
> >> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> >> @@ -0,0 +1,30 @@
> >> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
> >> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >> +Date: Tue, 3 Mar 2015 19:07:28 -0500
> >> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
> >> + missing
> >> +
> >> +On s390 (at least) /sys/class/power_supply is not present. We should
> >> +treat this like if this directory was empty, and not an error.
> >> +
> >> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
> >> +---
> >> + src/shared/util.c | 2 +-
> >> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >> +
> >> +diff --git a/src/shared/util.c b/src/shared/util.c
> >> +index f24b5b4..8548723 100644
> >> +--- a/src/shared/util.c
> >> ++++ b/src/shared/util.c
> >> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
> >> +
> >> +         d = opendir("/sys/class/power_supply");
> >> +         if (!d)
> >> +-                return -errno;
> >> ++                return errno == ENOENT ? true : -errno;
> >> +
> >> +         for (;;) {
> >> +                 struct dirent *de;
> >> +--
> >> +1.9.1
> >> +
> >> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
> >> index 73b930e..9c20b11 100644
> >> --- a/meta/recipes-core/systemd/systemd_219.bb
> >> +++ b/meta/recipes-core/systemd/systemd_219.bb
> >> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> >>             file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
> >>             file://0010-Make-root-s-home-directory-configurable.patch \
> >>             file://0011-systemd-user-avoid-using-system-auth.patch \
> >> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> >> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> >>             file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
> >> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> >>             file://0014-Revert-rules-remove-firmware-loading-rules.patch \
> >>             file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
> >>             file://tmpfiles-pam.patch \
> >> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> >>
> >>  S = "${WORKDIR}/git"
> >>
> >> +# Appending backport fixes released for version 219-stable
> >> +SRC_URI_append = "\
> >> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
> >> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
> >> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
> >> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
> >> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> >> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
> >> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
> >> +           file://0008-bootchart-fix-default-init-path.patch \
> >> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
> >> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
> >> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
> >> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
> >> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
> >> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
> >> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
> >> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
> >> +           file://0017-core-rework-device-state-logic.patch \
> >> +           file://0018-core-fix-return-value-on-OOM.patch \
> >> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
> >> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
> >> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
> >> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
> >> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> >> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
> >> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> >> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
> >> +           "
> >> +
> >>  SRC_URI_append_libc-uclibc = "\
> >>              file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
> >>             "
> >> --
> >> 1.9.1
> >>
> >
> >
> > --
> > _______________________________________________
> > Openembedded-core mailing list
> > Openembedded-core@lists.openembedded.org
> > http://lists.openembedded.org/mailman/listinfo/openembedded-core
> 
> 
> 




^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-04-01 21:08     ` Bottazzini, Bruno
@ 2015-04-01 21:14       ` Khem Raj
  2015-04-01 21:16         ` Bottazzini, Bruno
  0 siblings, 1 reply; 12+ messages in thread
From: Khem Raj @ 2015-04-01 21:14 UTC (permalink / raw)
  To: Bottazzini, Bruno; +Cc: Patches and discussions about the oe-core layer

I will try it out. give me a day

> On Apr 1, 2015, at 2:08 PM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
> 
> Khem,
> 
> Could you verify this patch and see if this satisfies what you have
> pointed previously ?
> 
> Do you think this patch is ready to go to master ?
> 
> Regards,
> 
> On Ter, 2015-03-31 at 17:25 -0300, Otavio Salvador wrote:
>> I am not a heavy user of systemd so I prefer other people (Khem?) to
>> comment on this ...
>> 
>> On Tue, Mar 31, 2015 at 5:21 PM, Bottazzini, Bruno
>> <bruno.bottazzini@intel.com> wrote:
>>> Ping
>>> 
>>> On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
>>>> Adding patches that fix bugs for 219 version.
>>>> This will get the same consistency of the stable systemd 219 version.
>>>> 
>>>> More details:
>>>> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
>>>> ---
>>>> ...remote-fix-certificate-status-memory-leak.patch |  31 +
>>>> ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
>>>> ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
>>>> ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
>>>> ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
>>>> .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
>>>> ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
>>>> .../0008-bootchart-fix-default-init-path.patch     |  44 +
>>>> ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
>>>> ...0-Make-root-s-home-directory-configurable.patch |  89 +-
>>>> ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
>>>> ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
>>>> ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
>>>> ...aker-dependencies-between-mount-and-devic.patch |  33 +
>>>> ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
>>>> ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
>>>> ...l-add-some-hints-how-to-override-settings.patch |  39 +
>>>> .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
>>>> .../0018-core-fix-return-value-on-OOM.patch        |  26 +
>>>> ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
>>>> ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
>>>> ...downgrade-unit-type-not-supported-message.patch |  31 +
>>>> ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
>>>> ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
>>>> ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
>>>> ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
>>>> ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
>>>> meta/recipes-core/systemd/systemd_219.bb           |  33 +-
>>>> 28 files changed, 2050 insertions(+), 55 deletions(-)
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>>>> create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
>>>> 
>>>> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>>>> new file mode 100644
>>>> index 0000000..172bea2
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>>>> @@ -0,0 +1,31 @@
>>>> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
>>>> +From: Michal Schmidt <mschmidt@redhat.com>
>>>> +Date: Tue, 17 Feb 2015 10:33:01 +0100
>>>> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
>>>> +
>>>> +The output of gnutls_certificate_verification_status_print() needs to be
>>>> +freed.
>>>> +
>>>> +Noticed this while staring at verify_cert_authorized() to see what could
>>>> +possibly confuse gcc5 on armv7hl to segfault during compilation.
>>>> +
>>>> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
>>>> +---
>>>> + src/journal-remote/microhttpd-util.c | 1 +
>>>> + 1 file changed, 1 insertion(+)
>>>> +
>>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
>>>> +index 34d9337..de9c6ab 100644
>>>> +--- a/src/journal-remote/microhttpd-util.c
>>>> ++++ b/src/journal-remote/microhttpd-util.c
>>>> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
>>>> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
>>>> +
>>>> +         log_info("Certificate status: %s", out.data);
>>>> ++        gnutls_free(out.data);
>>>> +
>>>> +         return status == 0 ? 0 : -EPERM;
>>>> + }
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>>>> new file mode 100644
>>>> index 0000000..f615876
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>>>> @@ -0,0 +1,35 @@
>>>> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
>>>> +From: Michal Schmidt <mschmidt@redhat.com>
>>>> +Date: Tue, 17 Feb 2015 10:36:57 +0100
>>>> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
>>>> +
>>>> +Found by Valgrind while testing the previous memory leak fix.
>>>> +
>>>> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
>>>> +---
>>>> + src/journal-remote/microhttpd-util.c | 6 +++++-
>>>> + 1 file changed, 5 insertions(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
>>>> +index de9c6ab..a95fff1 100644
>>>> +--- a/src/journal-remote/microhttpd-util.c
>>>> ++++ b/src/journal-remote/microhttpd-util.c
>>>> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
>>>> +         return 0;
>>>> + }
>>>> +
>>>> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
>>>> ++        gnutls_x509_crt_deinit(*p);
>>>> ++}
>>>> ++
>>>> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
>>>> +         const union MHD_ConnectionInfo *ci;
>>>> +         gnutls_session_t session;
>>>> +-        gnutls_x509_crt_t client_cert;
>>>> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
>>>> +         _cleanup_free_ char *buf = NULL;
>>>> +         int r;
>>>> +
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>>>> new file mode 100644
>>>> index 0000000..15fa98c
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>>>> @@ -0,0 +1,28 @@
>>>> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
>>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
>>>> +Date: Tue, 17 Feb 2015 12:47:51 +0100
>>>> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
>>>> +
>>>> +parse_acl() returns the error instead of setting errno.
>>>> +
>>>> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
>>>> +---
>>>> + src/tmpfiles/tmpfiles.c | 2 +-
>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
>>>> +index c948d4d..88ba7e4 100644
>>>> +--- a/src/tmpfiles/tmpfiles.c
>>>> ++++ b/src/tmpfiles/tmpfiles.c
>>>> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
>>>> +          * afterwards, so the mask can be added now if necessary. */
>>>> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
>>>> +         if (r < 0)
>>>> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
>>>> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
>>>> +                                   item->argument);
>>>> + #else
>>>> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>>>> new file mode 100644
>>>> index 0000000..f43068d
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>>>> @@ -0,0 +1,26 @@
>>>> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
>>>> +From: Tom Gundersen <teg@jklm.no>
>>>> +Date: Wed, 18 Feb 2015 14:33:50 +0100
>>>> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
>>>> +
>>>> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
>>>> +---
>>>> + src/test/test-utf8.c | 2 +-
>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
>>>> +index befa385..346f852 100644
>>>> +--- a/src/test/test-utf8.c
>>>> ++++ b/src/test/test-utf8.c
>>>> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
>>>> +
>>>> + static void test_utf16_to_utf8(void) {
>>>> +         char *a = NULL;
>>>> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
>>>> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
>>>> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
>>>> +
>>>> +         a = utf16_to_utf8(utf16, 14);
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>>>> new file mode 100644
>>>> index 0000000..35fe913
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>>>> @@ -0,0 +1,131 @@
>>>> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>> +Date: Mon, 23 Feb 2015 23:19:54 -0500
>>>> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
>>>> +
>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
>>>> +https://bugs.debian.org/778656
>>>> +
>>>> +Status quo ante can be restored with:
>>>> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
>>>> +
>>>> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
>>>> +---
>>>> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
>>>> + src/shared/acl-util.h |  4 +++
>>>> + 2 files changed, 81 insertions(+), 2 deletions(-)
>>>> +
>>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
>>>> +index a4ff1ab..cbe09d7 100644
>>>> +--- a/src/shared/acl-util.c
>>>> ++++ b/src/shared/acl-util.c
>>>> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
>>>> +         return 0;
>>>> + }
>>>> +
>>>> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
>>>> ++        acl_tag_t tag_a, tag_b;
>>>> ++
>>>> ++        if (acl_get_tag_type(a, &tag_a) < 0)
>>>> ++                return -errno;
>>>> ++
>>>> ++        if (acl_get_tag_type(b, &tag_b) < 0)
>>>> ++                return -errno;
>>>> ++
>>>> ++        if (tag_a != tag_b)
>>>> ++                return false;
>>>> ++
>>>> ++        switch (tag_a) {
>>>> ++        case ACL_USER_OBJ:
>>>> ++        case ACL_GROUP_OBJ:
>>>> ++        case ACL_MASK:
>>>> ++        case ACL_OTHER:
>>>> ++                /* can have only one of those */
>>>> ++                return true;
>>>> ++        case ACL_USER: {
>>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
>>>> ++
>>>> ++                uid_a = acl_get_qualifier(a);
>>>> ++                if (!uid_a)
>>>> ++                        return -errno;
>>>> ++
>>>> ++                uid_b = acl_get_qualifier(b);
>>>> ++                if (!uid_b)
>>>> ++                        return -errno;
>>>> ++
>>>> ++                return *uid_a == *uid_b;
>>>> ++        }
>>>> ++        case ACL_GROUP: {
>>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
>>>> ++
>>>> ++                gid_a = acl_get_qualifier(a);
>>>> ++                if (!gid_a)
>>>> ++                        return -errno;
>>>> ++
>>>> ++                gid_b = acl_get_qualifier(b);
>>>> ++                if (!gid_b)
>>>> ++                        return -errno;
>>>> ++
>>>> ++                return *gid_a == *gid_b;
>>>> ++        }
>>>> ++        default:
>>>> ++                assert_not_reached("Unknown acl tag type");
>>>> ++        }
>>>> ++}
>>>> ++
>>>> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
>>>> ++        acl_entry_t i;
>>>> ++        int r;
>>>> ++
>>>> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
>>>> ++             r > 0;
>>>> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
>>>> ++
>>>> ++                r = acl_entry_equal(i, entry);
>>>> ++                if (r < 0)
>>>> ++                        return r;
>>>> ++                if (r > 0) {
>>>> ++                        *out = i;
>>>> ++                        return 1;
>>>> ++                }
>>>> ++        }
>>>> ++        if (r < 0)
>>>> ++                return -errno;
>>>> ++        return 0;
>>>> ++}
>>>> ++
>>>> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
>>>> +         _cleanup_(acl_freep) acl_t old;
>>>> +         acl_entry_t i;
>>>> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
>>>> +
>>>> +                 acl_entry_t j;
>>>> +
>>>> +-                if (acl_create_entry(&old, &j) < 0)
>>>> +-                        return -errno;
>>>> ++                r = find_acl_entry(old, i, &j);
>>>> ++                if (r < 0)
>>>> ++                        return r;
>>>> ++                if (r == 0)
>>>> ++                        if (acl_create_entry(&old, &j) < 0)
>>>> ++                                return -errno;
>>>> +
>>>> +                 if (acl_copy_entry(j, i) < 0)
>>>> +                         return -errno;
>>>> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
>>>> +index 90e88ff..fdb9006 100644
>>>> +--- a/src/shared/acl-util.h
>>>> ++++ b/src/shared/acl-util.h
>>>> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
>>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
>>>> + #define acl_free_charp acl_free
>>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
>>>> ++#define acl_free_uid_tp acl_free
>>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
>>>> ++#define acl_free_gid_tp acl_free
>>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
>>>> +
>>>> + #endif
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>>>> new file mode 100644
>>>> index 0000000..fc707bb
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>>>> @@ -0,0 +1,32 @@
>>>> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
>>>> +From: Daniel Mack <daniel@zonque.org>
>>>> +Date: Tue, 24 Feb 2015 13:26:09 +0100
>>>> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
>>>> +
>>>> +  CC       src/shared/libsystemd_shared_la-time-util.lo
>>>> +src/shared/time-util.c: In function 'parse_nsec':
>>>> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
>>>> +                 if (!*s != 0)
>>>> +                         ^
>>>> +
>>>> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
>>>> +---
>>>> + src/shared/time-util.c | 2 +-
>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
>>>> +index 947ac1f..1c36c57 100644
>>>> +--- a/src/shared/time-util.c
>>>> ++++ b/src/shared/time-util.c
>>>> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
>>>> +         s = startswith(p, "infinity");
>>>> +         if (s) {
>>>> +                 s += strspn(s, WHITESPACE);
>>>> +-                if (!*s != 0)
>>>> ++                if (*s != 0)
>>>> +                         return -EINVAL;
>>>> +
>>>> +                 *nsec = NSEC_INFINITY;
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>>>> new file mode 100644
>>>> index 0000000..161b7b5
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>>>> @@ -0,0 +1,36 @@
>>>> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
>>>> +From: Daniel Mack <daniel@zonque.org>
>>>> +Date: Tue, 24 Feb 2015 13:27:10 +0100
>>>> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
>>>> +
>>>> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
>>>> +---
>>>> + src/test/test-time.c | 6 ++++++
>>>> + 1 file changed, 6 insertions(+)
>>>> +
>>>> +diff --git a/src/test/test-time.c b/src/test/test-time.c
>>>> +index 8cfc4cc..3840fff 100644
>>>> +--- a/src/test/test-time.c
>>>> ++++ b/src/test/test-time.c
>>>> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
>>>> +         assert_se(u == 2);
>>>> +         assert_se(parse_nsec(".7", &u) >= 0);
>>>> +         assert_se(u == 0);
>>>> ++        assert_se(parse_nsec("infinity", &u) >= 0);
>>>> ++        assert_se(u == NSEC_INFINITY);
>>>> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
>>>> ++        assert_se(u == NSEC_INFINITY);
>>>> +
>>>> +         assert_se(parse_nsec(" xyz ", &u) < 0);
>>>> +         assert_se(parse_nsec("", &u) < 0);
>>>> +         assert_se(parse_nsec(" . ", &u) < 0);
>>>> +         assert_se(parse_nsec(" 5. ", &u) < 0);
>>>> +         assert_se(parse_nsec(".s ", &u) < 0);
>>>> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
>>>> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
>>>> + }
>>>> +
>>>> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>>>> new file mode 100644
>>>> index 0000000..7eaad1e
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>>>> @@ -0,0 +1,44 @@
>>>> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
>>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
>>>> +Date: Tue, 24 Feb 2015 14:30:10 +0100
>>>> +Subject: [PATCH 08/26] bootchart: fix default init path
>>>> +
>>>> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
>>>> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
>>>> +multi-arch systems.
>>>> +
>>>> +https://launchpad.net/bugs/1423867
>>>> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
>>>> +---
>>>> + Makefile.am               | 1 +
>>>> + src/bootchart/bootchart.c | 2 +-
>>>> + 2 files changed, 2 insertions(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/Makefile.am b/Makefile.am
>>>> +index bf04d31..cc577ce 100644
>>>> +--- a/Makefile.am
>>>> ++++ b/Makefile.am
>>>> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
>>>> +     -DKEXEC=\"$(KEXEC)\" \
>>>> +     -DLIBDIR=\"$(libdir)\" \
>>>> +     -DROOTLIBDIR=\"$(rootlibdir)\" \
>>>> ++    -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
>>>> +     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
>>>> +     -I $(top_srcdir)/src \
>>>> +     -I $(top_builddir)/src/shared \
>>>> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
>>>> +index 64a384b..175be68 100644
>>>> +--- a/src/bootchart/bootchart.c
>>>> ++++ b/src/bootchart/bootchart.c
>>>> +@@ -76,7 +76,7 @@ int sysfd=-1;
>>>> + #define DEFAULT_HZ 25.0
>>>> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
>>>> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
>>>> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
>>>> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
>>>> + #define DEFAULT_OUTPUT "/run/log"
>>>> +
>>>> + /* graph defaults */
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>>>> new file mode 100644
>>>> index 0000000..dbffa5b
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>>>> @@ -0,0 +1,44 @@
>>>> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>> +Date: Tue, 24 Feb 2015 10:10:04 -0500
>>>> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
>>>> +
>>>> +It is not necessary when running as telinit, etc.
>>>> +
>>>> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
>>>> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
>>>> +---
>>>> + src/systemctl/systemctl.c | 10 +++++-----
>>>> + 1 file changed, 5 insertions(+), 5 deletions(-)
>>>> +
>>>> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
>>>> +index 21cb898..6b93ec8 100644
>>>> +--- a/src/systemctl/systemctl.c
>>>> ++++ b/src/systemctl/systemctl.c
>>>> +@@ -7204,6 +7204,11 @@ found:
>>>> +                 }
>>>> +         }
>>>> +
>>>> ++        /* Increase max number of open files to 16K if we can, we
>>>> ++         * might needs this when browsing journal files, which might
>>>> ++         * be split up into many files. */
>>>> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
>>>> ++
>>>> +         return verb->dispatch(bus, argv + optind);
>>>> + }
>>>> +
>>>> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
>>>> +                 goto finish;
>>>> +         }
>>>> +
>>>> +-        /* Increase max number of open files to 16K if we can, we
>>>> +-         * might needs this when browsing journal files, which might
>>>> +-         * be split up into many files. */
>>>> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
>>>> +-
>>>> +         if (!avoid_bus())
>>>> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
>>>> +
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
>>>> index 41b9039..ff2871b 100644
>>>> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
>>>> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
>>>> @@ -1,7 +1,7 @@
>>>> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
>>>> -From: Khem Raj <raj.khem@gmail.com>
>>>> -Date: Fri, 20 Feb 2015 05:24:49 +0000
>>>> -Subject: [PATCH 10/11] Make root's home directory configurable
>>>> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
>>>> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
>>>> +Date: Thu, 5 Mar 2015 17:38:12 -0300
>>>> +Subject: [PATCH] Make root's home directory configurable
>>>> 
>>>> OpenEmbedded has a configurable home directory for root. Allow
>>>> systemd to be built using its idea of what root's home directory
>>>> @@ -9,32 +9,31 @@ should be.
>>>> 
>>>> Upstream-Status: Pending
>>>> 
>>>> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
>>>> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
>>>> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
>>>> +compatbile with systemd 219-stable
>>>> ---
>>>> - Makefile.am                       | 2 ++
>>>> - configure.ac                      | 7 +++++++
>>>> - src/core/unit-printf.c            | 2 +-
>>>> - src/nspawn/nspawn.c               | 4 ++--
>>>> - src/shared/util.c                 | 4 ++--
>>>> - units/console-shell.service.m4.in | 4 ++--
>>>> - units/emergency.service.in        | 4 ++--
>>>> - units/rescue.service.in           | 4 ++--
>>>> - 8 files changed, 20 insertions(+), 11 deletions(-)
>>>> + Makefile.am                | 2 ++
>>>> + configure.ac               | 7 +++++++
>>>> + src/core/unit-printf.c     | 2 +-
>>>> + src/nspawn/nspawn.c        | 5 ++---
>>>> + src/shared/util.c          | 4 ++--
>>>> + units/emergency.service.in | 4 ++--
>>>> + units/rescue.service.in    | 4 ++--
>>>> + 7 files changed, 18 insertions(+), 10 deletions(-)
>>>> 
>>>> diff --git a/Makefile.am b/Makefile.am
>>>> -index 0fb3f9f..4623963 100644
>>>> +index 93c0509..31ea94d 100644
>>>> --- a/Makefile.am
>>>> +++ b/Makefile.am
>>>> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
>>>> -     -DKEXEC=\"$(KEXEC)\" \
>>>> -     -DLIBDIR=\"$(libdir)\" \
>>>> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
>>>>      -DROOTLIBDIR=\"$(rootlibdir)\" \
>>>> -+    -DROOTHOMEDIR=\"$(roothomedir)\" \
>>>> +     -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
>>>>      -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
>>>> ++    -DROOTHOMEDIR=\"$(roothomedir)\" \
>>>>      -I $(top_srcdir)/src \
>>>>      -I $(top_builddir)/src/shared \
>>>> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
>>>> +     -I $(top_srcdir)/src/shared \
>>>> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
>>>>  substitutions = \
>>>>         '|rootlibexecdir=$(rootlibexecdir)|' \
>>>>         '|rootbindir=$(rootbindir)|' \
>>>> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
>>>>         '|SYSTEMCTL=$(rootbindir)/systemctl|' \
>>>>         '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
>>>> diff --git a/configure.ac b/configure.ac
>>>> -index a5b2e6e..55bb7d8 100644
>>>> +index 01ee8dc..800a587 100644
>>>> --- a/configure.ac
>>>> +++ b/configure.ac
>>>> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
>>>> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
>>>>          [],
>>>>          [with_rootlibdir=${libdir}])
>>>> 
>>>> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
>>>>  AC_ARG_WITH([pamlibdir],
>>>>          AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
>>>>          [],
>>>> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
>>>> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
>>>>  AC_SUBST([pamconfdir], [$with_pamconfdir])
>>>>  AC_SUBST([rootprefix], [$with_rootprefix])
>>>>  AC_SUBST([rootlibdir], [$with_rootlibdir])
>>>> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
>>>> 
>>>>  AC_CONFIG_FILES([
>>>>          Makefile po/Makefile.in
>>>> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
>>>> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
>>>>          include_prefix:          ${INCLUDE_PREFIX}
>>>>          lib dir:                 ${libdir}
>>>>          rootlib dir:             ${with_rootlibdir}
>>>> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
>>>>          SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
>>>>          Build Python:            ${PYTHON}
>>>> diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
>>>> -index 97135db..14d12f1 100644
>>>> +index 7736899..ac5f008 100644
>>>> --- a/src/core/unit-printf.c
>>>> +++ b/src/core/unit-printf.c
>>>> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
>>>> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
>>>>                   * best of it if we can, but fail if we can't */
>>>> 
>>>>                  if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
>>>> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
>>>>                          return -ENOTSUP;
>>>> 
>>>> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
>>>> -index b597edb..0b32673 100644
>>>> +index 08bfdcf..b44b4cd 100644
>>>> --- a/src/nspawn/nspawn.c
>>>> +++ b/src/nspawn/nspawn.c
>>>> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
>>>> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
>>>> +                         r = change_uid_gid(&home);
>>>>                          if (r < 0)
>>>>                                  _exit(EXIT_FAILURE);
>>>> -
>>>> +-
>>>> -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
>>>> +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
>>>>                              (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
>>>>                              (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
>>>>                                  log_oom();
>>>> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
>>>> -                                 execvp(argv[optind], argv + optind);
>>>> - #endif /* HAVE_EXECVPE */
>>>> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
>>>> +                         } else if (argc > optind)
>>>> +                                 execvpe(argv[optind], argv + optind, env_use);
>>>>                          else {
>>>> -                                chdir(home ? home : "/root");
>>>> +                                chdir(home ? home : ROOTHOMEDIR);
>>>> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
>>>>                                  execle("/bin/sh", "-sh", NULL, env_use);
>>>>                          }
>>>> diff --git a/src/shared/util.c b/src/shared/util.c
>>>> -index cbbe3b1..a0e3cc5 100644
>>>> +index 241e752..00adab6 100644
>>>> --- a/src/shared/util.c
>>>> +++ b/src/shared/util.c
>>>> -@@ -4609,7 +4609,7 @@ int get_user_creds(
>>>> +@@ -4604,7 +4604,7 @@ int get_user_creds(
>>>>                          *gid = 0;
>>>> 
>>>>                  if (home)
>>>> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
>>>> 
>>>>                  if (shell)
>>>>                          *shell = "/bin/sh";
>>>> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
>>>> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
>>>>          /* Hardcode home directory for root to avoid NSS */
>>>>          u = getuid();
>>>>          if (u == 0) {
>>>> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
>>>>                  if (!h)
>>>>                          return -ENOMEM;
>>>> 
>>>> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
>>>> -index 5c80722..efde5f0 100644
>>>> ---- a/units/console-shell.service.m4.in
>>>> -+++ b/units/console-shell.service.m4.in
>>>> -@@ -15,8 +15,8 @@ After=rc-local.service
>>>> - Before=getty.target
>>>> -
>>>> - [Service]
>>>> --Environment=HOME=/root
>>>> --WorkingDirectory=/root
>>>> -+Environment=HOME=@roothomedir@
>>>> -+WorkingDirectory=@roothomedir@
>>>> - ExecStart=-@SULOGIN@
>>>> - ExecStopPost=-@SYSTEMCTL@ poweroff
>>>> - Type=idle
>>>> diff --git a/units/emergency.service.in b/units/emergency.service.in
>>>> index 2695d7b..7f47b73 100644
>>>> --- a/units/emergency.service.in
>>>> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
>>>>  ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
>>>>  ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
>>>> --
>>>> -2.1.4
>>>> +1.9.1
>>>> 
>>>> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>>>> new file mode 100644
>>>> index 0000000..1e4a69d
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>>>> @@ -0,0 +1,37 @@
>>>> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
>>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
>>>> +Date: Tue, 24 Feb 2015 20:40:07 +0100
>>>> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
>>>> +
>>>> +CID#1271344/1271345
>>>> +
>>>> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
>>>> +---
>>>> + src/shared/acl-util.c | 4 ++--
>>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
>>>> +
>>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
>>>> +index cbe09d7..e67e9ac 100644
>>>> +--- a/src/shared/acl-util.c
>>>> ++++ b/src/shared/acl-util.c
>>>> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
>>>> +                 /* can have only one of those */
>>>> +                 return true;
>>>> +         case ACL_USER: {
>>>> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
>>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
>>>> +
>>>> +                 uid_a = acl_get_qualifier(a);
>>>> +                 if (!uid_a)
>>>> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
>>>> +                 return *uid_a == *uid_b;
>>>> +         }
>>>> +         case ACL_GROUP: {
>>>> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
>>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
>>>> +
>>>> +                 gid_a = acl_get_qualifier(a);
>>>> +                 if (!gid_a)
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>>>> new file mode 100644
>>>> index 0000000..dca5e20
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>>>> @@ -0,0 +1,28 @@
>>>> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
>>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
>>>> +Date: Tue, 24 Feb 2015 18:32:31 +0200
>>>> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
>>>> +
>>>> +If we have less samples than expected, systemd-bootchart will crash.
>>>> +
>>>> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
>>>> +---
>>>> + src/bootchart/svg.c | 2 +-
>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
>>>> +index e111fa9..144177c 100644
>>>> +--- a/src/bootchart/svg.c
>>>> ++++ b/src/bootchart/svg.c
>>>> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
>>>> +
>>>> +                 ps->sample = ps->sample->next;
>>>> +                 sample_hz = ps->sample;
>>>> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
>>>> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
>>>> +                         sample_hz = sample_hz->next;
>>>> +
>>>> +                 /* subtract bootchart cpu utilization from total */
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>>>> new file mode 100644
>>>> index 0000000..e0cb193
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>>>> @@ -0,0 +1,38 @@
>>>> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
>>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
>>>> +Date: Mon, 23 Feb 2015 16:01:31 +0200
>>>> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
>>>> +
>>>> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
>>>> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
>>>> +syscalls getrandom and memfd_create").
>>>> +
>>>> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
>>>> +---
>>>> + src/shared/missing.h | 10 ++++++++++
>>>> + 1 file changed, 10 insertions(+)
>>>> +
>>>> +diff --git a/src/shared/missing.h b/src/shared/missing.h
>>>> +index b33a70c..e72631e 100644
>>>> +--- a/src/shared/missing.h
>>>> ++++ b/src/shared/missing.h
>>>> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
>>>> + #    define __NR_getrandom 349
>>>> + #  elif defined(__powerpc__)
>>>> + #    define __NR_getrandom 359
>>>> ++#  elif defined _MIPS_SIM
>>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
>>>> ++#      define __NR_getrandom 4353
>>>> ++#    endif
>>>> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
>>>> ++#      define __NR_getrandom 6317
>>>> ++#    endif
>>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
>>>> ++#      define __NR_getrandom 5313
>>>> ++#    endif
>>>> + #  else
>>>> + #    warning "__NR_getrandom unknown for your architecture"
>>>> + #    define __NR_getrandom 0xffffffff
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>>>> new file mode 100644
>>>> index 0000000..1b842a2
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>>>> @@ -0,0 +1,33 @@
>>>> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
>>>> +From: Lennart Poettering <lennart@poettering.net>
>>>> +Date: Wed, 25 Feb 2015 22:05:14 +0100
>>>> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
>>>> + units in --user mode
>>>> +
>>>> +When running in user mode unmounting of mount units when a device
>>>> +vanishes is unlikely to work, and even if it would work is already done
>>>> +by PID 1 anyway. HEnce, when creating implicit dependencies between
>>>> +mount units and their backing devices, created a Wants= type dependency
>>>> +in --user mode, but leave a BindsTo= dependency in --system mode.
>>>> +
>>>> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
>>>> +---
>>>> + src/core/unit.c | 2 +-
>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
>>>> +index ee8e607..9f1e55e 100644
>>>> +--- a/src/core/unit.c
>>>> ++++ b/src/core/unit.c
>>>> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
>>>> +         if (r < 0)
>>>> +                 return r;
>>>> +
>>>> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
>>>> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
>>>> +         if (r < 0)
>>>> +                 return r;
>>>> +
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>>>> new file mode 100644
>>>> index 0000000..92c4b8f
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>>>> @@ -0,0 +1,43 @@
>>>> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
>>>> +From: Colin Walters <walters@verbum.org>
>>>> +Date: Tue, 17 Feb 2015 13:47:34 -0500
>>>> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
>>>> + caused it
>>>> +
>>>> +I'm trying to track down a relatively recent change in systemd
>>>> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
>>>> +
>>>> +Systemd started to stop sysroot.mount, and this patch should help
>>>> +me debug why at least.
>>>> +
>>>> +While we're here, "break" on the first unit we find that will
>>>> +deactivate, as there's no point in further iteration.
>>>> +
>>>> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
>>>> +---
>>>> + src/core/unit.c | 4 +++-
>>>> + 1 file changed, 3 insertions(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
>>>> +index 9f1e55e..563f6fe 100644
>>>> +--- a/src/core/unit.c
>>>> ++++ b/src/core/unit.c
>>>> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
>>>> +                         continue;
>>>> +
>>>> +                 stop = true;
>>>> ++                break;
>>>> +         }
>>>> +
>>>> +         if (!stop)
>>>> +                 return;
>>>> +
>>>> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
>>>> ++        assert(other);
>>>> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
>>>> +
>>>> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
>>>> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>>>> new file mode 100644
>>>> index 0000000..46c25bd
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>>>> @@ -0,0 +1,30 @@
>>>> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>> +Date: Thu, 26 Feb 2015 19:00:11 -0500
>>>> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
>>>> + debug
>>>> +
>>>> +Printing it at info level was tedious. We don't do that for any other
>>>> +overrides.
>>>> +
>>>> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
>>>> +---
>>>> + src/sysctl/sysctl.c | 2 +-
>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
>>>> +index 275a5b7..2415d84 100644
>>>> +--- a/src/sysctl/sysctl.c
>>>> ++++ b/src/sysctl/sysctl.c
>>>> +@@ -176,7 +176,7 @@ found:
>>>> +                         if (streq(value, existing))
>>>> +                                 continue;
>>>> +
>>>> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
>>>> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
>>>> +                         free(hashmap_remove(sysctl_options, p));
>>>> +                         free(v);
>>>> +                 }
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>>>> new file mode 100644
>>>> index 0000000..87dce1f
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>>>> @@ -0,0 +1,39 @@
>>>> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>> +Date: Thu, 26 Feb 2015 19:05:51 -0500
>>>> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
>>>> +
>>>> +Also a link to decent documentation for sysrq keys. It is surprising
>>>> +hard to find.
>>>> +
>>>> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
>>>> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
>>>> +---
>>>> + sysctl.d/50-default.conf | 9 ++++++++-
>>>> + 1 file changed, 8 insertions(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
>>>> +index f189233..def151b 100644
>>>> +--- a/sysctl.d/50-default.conf
>>>> ++++ b/sysctl.d/50-default.conf
>>>> +@@ -5,9 +5,16 @@
>>>> + #  the Free Software Foundation; either version 2.1 of the License, or
>>>> + #  (at your option) any later version.
>>>> +
>>>> +-# See sysctl.d(5) and core(5) for for details.
>>>> ++# See sysctl.d(5) and core(5) for for documentation.
>>>> ++
>>>> ++# To override settings in this file, create a local file in /etc
>>>> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
>>>> ++# there.
>>>> +
>>>> + # System Request functionality of the kernel (SYNC)
>>>> ++#
>>>> ++# Use kernel.sysrq = 1 to allow all keys.
>>>> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
>>>> + kernel.sysrq = 16
>>>> +
>>>> + # Append the PID to the core filename
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>>>> new file mode 100644
>>>> index 0000000..a3ab3e4
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>>>> @@ -0,0 +1,912 @@
>>>> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
>>>> +From: Lennart Poettering <lennart@poettering.net>
>>>> +Date: Fri, 27 Feb 2015 21:55:08 +0100
>>>> +Subject: [PATCH 17/26] core: rework device state logic
>>>> +
>>>> +This change introduces a new state "tentative" for device units. Device
>>>> +units are considered "plugged" when udev announced them, "dead" when
>>>> +they are not available in the kernel, and "tentative" when they are
>>>> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
>>>> +announced via udev.
>>>> +
>>>> +This should fix a race when device nodes (like loop devices) are created
>>>> +and immediately mounted. Previously, systemd might end up seeing the
>>>> +mount unit before the device, and would thus pull down the mount because
>>>> +its BindTo dependency on the device would not be fulfilled.
>>>> +
>>>> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
>>>> +---
>>>> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
>>>> + src/core/device.h |  14 ++-
>>>> + src/core/mount.c  |  46 ++++---
>>>> + src/core/swap.c   |  32 +++--
>>>> + src/core/swap.h   |   4 +-
>>>> + src/core/unit.c   |   1 -
>>>> + 6 files changed, 285 insertions(+), 180 deletions(-)
>>>> +
>>>> +diff --git a/src/core/device.c b/src/core/device.c
>>>> +index d3deac3..75b9a46 100644
>>>> +--- a/src/core/device.c
>>>> ++++ b/src/core/device.c
>>>> +@@ -36,7 +36,8 @@
>>>> +
>>>> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
>>>> +         [DEVICE_DEAD] = UNIT_INACTIVE,
>>>> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
>>>> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
>>>> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
>>>> + };
>>>> +
>>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
>>>> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
>>>> +         d->sysfs = NULL;
>>>> + }
>>>> +
>>>> ++static int device_set_sysfs(Device *d, const char *sysfs) {
>>>> ++        Device *first;
>>>> ++        char *copy;
>>>> ++        int r;
>>>> ++
>>>> ++        assert(d);
>>>> ++
>>>> ++        if (streq_ptr(d->sysfs, sysfs))
>>>> ++                return 0;
>>>> ++
>>>> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
>>>> ++        if (r < 0)
>>>> ++                return r;
>>>> ++
>>>> ++        copy = strdup(sysfs);
>>>> ++        if (!copy)
>>>> ++                return -ENOMEM;
>>>> ++
>>>> ++        device_unset_sysfs(d);
>>>> ++
>>>> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
>>>> ++        LIST_PREPEND(same_sysfs, first, d);
>>>> ++
>>>> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
>>>> ++        if (r < 0) {
>>>> ++                LIST_REMOVE(same_sysfs, first, d);
>>>> ++                free(copy);
>>>> ++                return r;
>>>> ++        }
>>>> ++
>>>> ++        d->sysfs = copy;
>>>> ++
>>>> ++        return 0;
>>>> ++}
>>>> ++
>>>> + static void device_init(Unit *u) {
>>>> +         Device *d = DEVICE(u);
>>>> +
>>>> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
>>>> +         assert(d);
>>>> +         assert(d->state == DEVICE_DEAD);
>>>> +
>>>> +-        if (d->sysfs)
>>>> ++        if (d->found & DEVICE_FOUND_UDEV)
>>>> ++                /* If udev says the device is around, it's around */
>>>> +                 device_set_state(d, DEVICE_PLUGGED);
>>>> ++        else if (d->found != DEVICE_NOT_FOUND)
>>>> ++                /* If a device is found in /proc/self/mountinfo or
>>>> ++                 * /proc/swaps, it's "tentatively" around. */
>>>> ++                device_set_state(d, DEVICE_TENTATIVE);
>>>> +
>>>> +         return 0;
>>>> + }
>>>> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
>>>> +         return device_state_to_string(DEVICE(u)->state);
>>>> + }
>>>> +
>>>> +-static int device_add_escaped_name(Unit *u, const char *dn) {
>>>> +-        _cleanup_free_ char *e = NULL;
>>>> +-        int r;
>>>> +-
>>>> +-        assert(u);
>>>> +-        assert(dn);
>>>> +-        assert(dn[0] == '/');
>>>> +-
>>>> +-        e = unit_name_from_path(dn, ".device");
>>>> +-        if (!e)
>>>> +-                return -ENOMEM;
>>>> +-
>>>> +-        r = unit_add_name(u, e);
>>>> +-        if (r < 0 && r != -EEXIST)
>>>> +-                return r;
>>>> +-
>>>> +-        return 0;
>>>> +-}
>>>> +-
>>>> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
>>>> +-        _cleanup_free_ char *e = NULL;
>>>> +-        Unit *u;
>>>> +-
>>>> +-        assert(m);
>>>> +-        assert(dn);
>>>> +-        assert(dn[0] == '/');
>>>> +-        assert(_u);
>>>> +-
>>>> +-        e = unit_name_from_path(dn, ".device");
>>>> +-        if (!e)
>>>> +-                return -ENOMEM;
>>>> +-
>>>> +-        u = manager_get_unit(m, e);
>>>> +-        if (u) {
>>>> +-                *_u = u;
>>>> +-                return 1;
>>>> +-        }
>>>> +-
>>>> +-        return 0;
>>>> +-}
>>>> +-
>>>> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
>>>> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
>>>> +         const char *model;
>>>> ++        int r;
>>>> +
>>>> +         assert(u);
>>>> +         assert(dev);
>>>> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
>>>> +
>>>> +                         j = strjoin(model, " ", label, NULL);
>>>> +                         if (j)
>>>> +-                                return unit_set_description(u, j);
>>>> +-                }
>>>> ++                                r = unit_set_description(u, j);
>>>> ++                } else
>>>> ++                        r = unit_set_description(u, model);
>>>> ++        } else
>>>> ++                r = unit_set_description(u, path);
>>>> +
>>>> +-                return unit_set_description(u, model);
>>>> +-        }
>>>> ++        if (r < 0)
>>>> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
>>>> +
>>>> +-        return unit_set_description(u, path);
>>>> ++        return r;
>>>> + }
>>>> +
>>>> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
>>>> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
>>>> +
>>>> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
>>>> +                 if (!n)
>>>> +-                        return -ENOMEM;
>>>> ++                        return log_oom();
>>>> +
>>>> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
>>>> +                 if (r < 0)
>>>> +-                        return r;
>>>> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
>>>> +         }
>>>> +         if (!isempty(state))
>>>> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
>>>> +-                                 property, strna(udev_device_get_syspath(dev)));
>>>> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
>>>> +
>>>> +         return 0;
>>>> + }
>>>> +
>>>> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
>>>> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
>>>> ++        _cleanup_free_ char *e = NULL;
>>>> +         const char *sysfs;
>>>> +         Unit *u = NULL;
>>>> +         bool delete;
>>>> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>>>> +         if (!sysfs)
>>>> +                 return 0;
>>>> +
>>>> +-        r = device_find_escape_name(m, path, &u);
>>>> +-        if (r < 0)
>>>> +-                return r;
>>>> ++        e = unit_name_from_path(path, ".device");
>>>> ++        if (!e)
>>>> ++                return log_oom();
>>>> ++
>>>> ++        u = manager_get_unit(m, e);
>>>> +
>>>> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
>>>> ++        if (u &&
>>>> ++            DEVICE(u)->sysfs &&
>>>> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
>>>> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
>>>> +                 return -EEXIST;
>>>> ++        }
>>>> +
>>>> +         if (!u) {
>>>> +                 delete = true;
>>>> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>>>> +                 if (!u)
>>>> +                         return log_oom();
>>>> +
>>>> +-                r = device_add_escaped_name(u, path);
>>>> ++                r = unit_add_name(u, e);
>>>> +                 if (r < 0)
>>>> +                         goto fail;
>>>> +
>>>> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>>>> +          * actually been seen yet ->sysfs will not be
>>>> +          * initialized. Hence initialize it if necessary. */
>>>> +
>>>> +-        if (!DEVICE(u)->sysfs) {
>>>> +-                Device *first;
>>>> +-
>>>> +-                DEVICE(u)->sysfs = strdup(sysfs);
>>>> +-                if (!DEVICE(u)->sysfs) {
>>>> +-                        r = -ENOMEM;
>>>> +-                        goto fail;
>>>> +-                }
>>>> +-
>>>> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
>>>> +-                if (r < 0)
>>>> +-                        goto fail;
>>>> +-
>>>> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
>>>> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
>>>> +-
>>>> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
>>>> +-                if (r < 0)
>>>> +-                        goto fail;
>>>> +-        }
>>>> +-
>>>> +-        device_make_description(u, dev, path);
>>>> ++        r = device_set_sysfs(DEVICE(u), sysfs);
>>>> ++        if (r < 0)
>>>> ++                goto fail;
>>>> +
>>>> +-        if (main) {
>>>> +-                /* The additional systemd udev properties we only
>>>> +-                 * interpret for the main object */
>>>> ++        (void) device_update_description(u, dev, path);
>>>> +
>>>> +-                r = device_add_udev_wants(u, dev);
>>>> +-                if (r < 0)
>>>> +-                        goto fail;
>>>> +-        }
>>>> ++        /* The additional systemd udev properties we only interpret
>>>> ++         * for the main object */
>>>> ++        if (main)
>>>> ++                (void) device_add_udev_wants(u, dev);
>>>> +
>>>> +         /* Note that this won't dispatch the load queue, the caller
>>>> +          * has to do that if needed and appropriate */
>>>> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>>>> +         return 0;
>>>> +
>>>> + fail:
>>>> +-        log_warning_errno(r, "Failed to load device unit: %m");
>>>> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
>>>> +
>>>> +         if (delete && u)
>>>> +                 unit_free(u);
>>>> +@@ -342,7 +331,7 @@ fail:
>>>> +         return r;
>>>> + }
>>>> +
>>>> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
>>>> ++static int device_process_new(Manager *m, struct udev_device *dev) {
>>>> +         const char *sysfs, *dn, *alias;
>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
>>>> +         int r;
>>>> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>>>> +                 return 0;
>>>> +
>>>> +         /* Add the main unit named after the sysfs path */
>>>> +-        r = device_update_unit(m, dev, sysfs, true);
>>>> ++        r = device_setup_unit(m, dev, sysfs, true);
>>>> +         if (r < 0)
>>>> +                 return r;
>>>> +
>>>> +         /* Add an additional unit for the device node */
>>>> +         dn = udev_device_get_devnode(dev);
>>>> +         if (dn)
>>>> +-                device_update_unit(m, dev, dn, false);
>>>> ++                (void) device_setup_unit(m, dev, dn, false);
>>>> +
>>>> +         /* Add additional units for all symlinks */
>>>> +         first = udev_device_get_devlinks_list_entry(dev);
>>>> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>>>> +                             st.st_rdev != udev_device_get_devnum(dev))
>>>> +                                 continue;
>>>> +
>>>> +-                device_update_unit(m, dev, p, false);
>>>> ++                (void) device_setup_unit(m, dev, p, false);
>>>> +         }
>>>> +
>>>> +         /* Add additional units for all explicitly configured
>>>> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>>>> +                         e[l] = 0;
>>>> +
>>>> +                         if (path_is_absolute(e))
>>>> +-                                device_update_unit(m, dev, e, false);
>>>> ++                                (void) device_setup_unit(m, dev, e, false);
>>>> +                         else
>>>> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
>>>> +                 }
>>>> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>>>> +         return 0;
>>>> + }
>>>> +
>>>> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
>>>> +-        const char *sysfs;
>>>> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
>>>> ++        DeviceFound n;
>>>> ++
>>>> ++        assert(d);
>>>> ++
>>>> ++        n = add ? (d->found | found) : (d->found & ~found);
>>>> ++        if (n == d->found)
>>>> ++                return;
>>>> ++
>>>> ++        d->found = n;
>>>> ++
>>>> ++        if (now) {
>>>> ++                if (d->found & DEVICE_FOUND_UDEV)
>>>> ++                        device_set_state(d, DEVICE_PLUGGED);
>>>> ++                else if (d->found != DEVICE_NOT_FOUND)
>>>> ++                        device_set_state(d, DEVICE_TENTATIVE);
>>>> ++                else
>>>> ++                        device_set_state(d, DEVICE_DEAD);
>>>> ++        }
>>>> ++}
>>>> ++
>>>> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
>>>> +         Device *d, *l;
>>>> +
>>>> +         assert(m);
>>>> +-        assert(dev);
>>>> ++        assert(sysfs);
>>>> +
>>>> +-        sysfs = udev_device_get_syspath(dev);
>>>> +-        if (!sysfs)
>>>> +-                return;
>>>> ++        if (found == DEVICE_NOT_FOUND)
>>>> ++                return 0;
>>>> +
>>>> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
>>>> +         LIST_FOREACH(same_sysfs, d, l)
>>>> +-                device_set_state(d, DEVICE_PLUGGED);
>>>> ++                device_update_found_one(d, add, found, now);
>>>> ++
>>>> ++        return 0;
>>>> + }
>>>> +
>>>> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
>>>> +-        const char *sysfs;
>>>> +-        Device *d;
>>>> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
>>>> ++        _cleanup_free_ char *e = NULL;
>>>> ++        Unit *u;
>>>> +
>>>> +         assert(m);
>>>> +-        assert(dev);
>>>> ++        assert(path);
>>>> +
>>>> +-        sysfs = udev_device_get_syspath(dev);
>>>> +-        if (!sysfs)
>>>> +-                return -ENOMEM;
>>>> ++        if (found == DEVICE_NOT_FOUND)
>>>> ++                return 0;
>>>> +
>>>> +-        /* Remove all units of this sysfs path */
>>>> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
>>>> +-                device_unset_sysfs(d);
>>>> +-                device_set_state(d, DEVICE_DEAD);
>>>> +-        }
>>>> ++        e = unit_name_from_path(path, ".device");
>>>> ++        if (!e)
>>>> ++                return log_oom();
>>>> +
>>>> ++        u = manager_get_unit(m, e);
>>>> ++        if (!u)
>>>> ++                return 0;
>>>> ++
>>>> ++        device_update_found_one(DEVICE(u), add, found, now);
>>>> +         return 0;
>>>> + }
>>>> +
>>>> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
>>>> +         return parse_boolean(ready) != 0;
>>>> + }
>>>> +
>>>> +-static int device_process_new_path(Manager *m, const char *path) {
>>>> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>>>> +-
>>>> +-        assert(m);
>>>> +-        assert(path);
>>>> +-
>>>> +-        dev = udev_device_new_from_syspath(m->udev, path);
>>>> +-        if (!dev)
>>>> +-                return log_oom();
>>>> +-
>>>> +-        if (!device_is_ready(dev))
>>>> +-                return 0;
>>>> +-
>>>> +-        return device_process_new_device(m, dev);
>>>> +-}
>>>> +-
>>>> + static Unit *device_following(Unit *u) {
>>>> +         Device *d = DEVICE(u);
>>>> +         Device *other, *first = NULL;
>>>> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
>>>> +                 goto fail;
>>>> +
>>>> +         first = udev_enumerate_get_list_entry(e);
>>>> +-        udev_list_entry_foreach(item, first)
>>>> +-                device_process_new_path(m, udev_list_entry_get_name(item));
>>>> ++        udev_list_entry_foreach(item, first) {
>>>> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>>>> ++                const char *sysfs;
>>>> ++
>>>> ++                sysfs = udev_list_entry_get_name(item);
>>>> ++
>>>> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
>>>> ++                if (!dev) {
>>>> ++                        log_oom();
>>>> ++                        continue;
>>>> ++                }
>>>> ++
>>>> ++                if (!device_is_ready(dev))
>>>> ++                        continue;
>>>> ++
>>>> ++                (void) device_process_new(m, dev);
>>>> ++
>>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
>>>> ++        }
>>>> +
>>>> +         return 0;
>>>> +
>>>> + fail:
>>>> ++        log_error_errno(r, "Failed to enumerate devices: %m");
>>>> ++
>>>> +         device_shutdown(m);
>>>> +         return r;
>>>> + }
>>>> +@@ -619,7 +634,7 @@ fail:
>>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
>>>> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>>>> +         Manager *m = userdata;
>>>> +-        const char *action;
>>>> ++        const char *action, *sysfs;
>>>> +         int r;
>>>> +
>>>> +         assert(m);
>>>> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
>>>> +         if (!dev)
>>>> +                 return 0;
>>>> +
>>>> ++        sysfs = udev_device_get_syspath(dev);
>>>> ++        if (!sysfs) {
>>>> ++                log_error("Failed to get udev sys path.");
>>>> ++                return 0;
>>>> ++        }
>>>> ++
>>>> +         action = udev_device_get_action(dev);
>>>> +         if (!action) {
>>>> +                 log_error("Failed to get udev action string.");
>>>> +                 return 0;
>>>> +         }
>>>> +
>>>> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
>>>> +-                r = device_process_removed_device(m, dev);
>>>> +-                if (r < 0)
>>>> +-                        log_error_errno(r, "Failed to process device remove event: %m");
>>>> +-
>>>> +-                r = swap_process_removed_device(m, dev);
>>>> ++        if (streq(action, "remove"))  {
>>>> ++                r = swap_process_device_remove(m, dev);
>>>> +                 if (r < 0)
>>>> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
>>>> +
>>>> +-        } else {
>>>> +-                r = device_process_new_device(m, dev);
>>>> +-                if (r < 0)
>>>> +-                        log_error_errno(r, "Failed to process device new event: %m");
>>>> ++                /* If we get notified that a device was removed by
>>>> ++                 * udev, then it's completely gone, hence unset all
>>>> ++                 * found bits */
>>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
>>>> +
>>>> +-                r = swap_process_new_device(m, dev);
>>>> ++        } else if (device_is_ready(dev)) {
>>>> ++
>>>> ++                (void) device_process_new(m, dev);
>>>> ++
>>>> ++                r = swap_process_device_new(m, dev);
>>>> +                 if (r < 0)
>>>> +                         log_error_errno(r, "Failed to process swap device new event: %m");
>>>> +
>>>> +                 manager_dispatch_load_queue(m);
>>>> +
>>>> +-                device_set_path_plugged(m, dev);
>>>> ++                /* The device is found now, set the udev found bit */
>>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
>>>> ++
>>>> ++        } else {
>>>> ++                /* The device is nominally around, but not ready for
>>>> ++                 * us. Hence unset the udev bit, but leave the rest
>>>> ++                 * around. */
>>>> ++
>>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
>>>> +         }
>>>> +
>>>> +         return 0;
>>>> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
>>>> +         return read_only <= 0;
>>>> + }
>>>> +
>>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
>>>> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>>>> ++        struct stat st;
>>>> ++
>>>> ++        assert(m);
>>>> ++        assert(node);
>>>> ++
>>>> ++        /* This is called whenever we find a device referenced in
>>>> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
>>>> ++         * mounted/enabled at a time where udev has not finished
>>>> ++         * probing it yet, and we thus haven't learned about it
>>>> ++         * yet. In this case we will set the device unit to
>>>> ++         * "tentative" state. */
>>>> ++
>>>> ++        if (add) {
>>>> ++                if (!path_startswith(node, "/dev"))
>>>> ++                        return 0;
>>>> ++
>>>> ++                if (stat(node, &st) < 0) {
>>>> ++                        if (errno == ENOENT)
>>>> ++                                return 0;
>>>> ++
>>>> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
>>>> ++                }
>>>> ++
>>>> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
>>>> ++                        return 0;
>>>> ++
>>>> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
>>>> ++                if (!dev) {
>>>> ++                        if (errno == ENOENT)
>>>> ++                                return 0;
>>>> ++
>>>> ++                        return log_oom();
>>>> ++                }
>>>> ++
>>>> ++                /* If the device is known in the kernel and newly
>>>> ++                 * appeared, then we'll create a device unit for it,
>>>> ++                 * under the name referenced in /proc/swaps or
>>>> ++                 * /proc/self/mountinfo. */
>>>> ++
>>>> ++                (void) device_setup_unit(m, dev, node, false);
>>>> ++        }
>>>> ++
>>>> ++        /* Update the device unit's state, should it exist */
>>>> ++        return device_update_found_by_name(m, node, add, found, now);
>>>> ++}
>>>> ++
>>>> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
>>>> +         [DEVICE_DEAD] = "dead",
>>>> +-        [DEVICE_PLUGGED] = "plugged"
>>>> ++        [DEVICE_TENTATIVE] = "tentative",
>>>> ++        [DEVICE_PLUGGED] = "plugged",
>>>> + };
>>>> +
>>>> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
>>>> +diff --git a/src/core/device.h b/src/core/device.h
>>>> +index bb7ae07..0609b20 100644
>>>> +--- a/src/core/device.h
>>>> ++++ b/src/core/device.h
>>>> +@@ -29,20 +29,28 @@ typedef struct Device Device;
>>>> +  * simplifies the state engine greatly */
>>>> + typedef enum DeviceState {
>>>> +         DEVICE_DEAD,
>>>> +-        DEVICE_PLUGGED,
>>>> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
>>>> ++        DEVICE_PLUGGED,   /* announced by udev */
>>>> +         _DEVICE_STATE_MAX,
>>>> +         _DEVICE_STATE_INVALID = -1
>>>> + } DeviceState;
>>>> +
>>>> ++typedef enum DeviceFound {
>>>> ++        DEVICE_NOT_FOUND = 0,
>>>> ++        DEVICE_FOUND_UDEV = 1,
>>>> ++        DEVICE_FOUND_MOUNT = 2,
>>>> ++        DEVICE_FOUND_SWAP = 4,
>>>> ++} DeviceFound;
>>>> ++
>>>> + struct Device {
>>>> +         Unit meta;
>>>> +
>>>> +         char *sysfs;
>>>> ++        DeviceFound found;
>>>> +
>>>> +         /* In order to be able to distinguish dependencies on
>>>> +         different device nodes we might end up creating multiple
>>>> +         devices for the same sysfs path. We chain them up here. */
>>>> +-
>>>> +         LIST_FIELDS(struct Device, same_sysfs);
>>>> +
>>>> +         DeviceState state;
>>>> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
>>>> +
>>>> + const char* device_state_to_string(DeviceState i) _const_;
>>>> + DeviceState device_state_from_string(const char *s) _pure_;
>>>> ++
>>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
>>>> +diff --git a/src/core/mount.c b/src/core/mount.c
>>>> +index f3977e6..c971330 100644
>>>> +--- a/src/core/mount.c
>>>> ++++ b/src/core/mount.c
>>>> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
>>>> +         return 0;
>>>> + }
>>>> +
>>>> +-static int mount_add_one(
>>>> ++static int mount_setup_unit(
>>>> +                 Manager *m,
>>>> +                 const char *what,
>>>> +                 const char *where,
>>>> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
>>>> +
>>>> +                 u = unit_new(m, sizeof(Mount));
>>>> +                 if (!u)
>>>> +-                        return -ENOMEM;
>>>> ++                        return log_oom();
>>>> +
>>>> +                 r = unit_add_name(u, e);
>>>> +                 if (r < 0)
>>>> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
>>>> +         return 0;
>>>> +
>>>> + fail:
>>>> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
>>>> ++
>>>> +         if (delete && u)
>>>> +                 unit_free(u);
>>>> +
>>>> +@@ -1554,33 +1556,36 @@ fail:
>>>> + }
>>>> +
>>>> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
>>>> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
>>>> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
>>>> +-        struct libmnt_fs *fs;
>>>> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
>>>> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
>>>> +         int r = 0;
>>>> +
>>>> +         assert(m);
>>>> +
>>>> +-        tb = mnt_new_table();
>>>> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
>>>> +-        if (!tb || !itr)
>>>> ++        t = mnt_new_table();
>>>> ++        if (!t)
>>>> +                 return log_oom();
>>>> +
>>>> +-        r = mnt_table_parse_mtab(tb, NULL);
>>>> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
>>>> ++        if (!i)
>>>> ++                return log_oom();
>>>> ++
>>>> ++        r = mnt_table_parse_mtab(t, NULL);
>>>> +         if (r < 0)
>>>> +-                return r;
>>>> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
>>>> +
>>>> +         r = 0;
>>>> +         for (;;) {
>>>> +                 const char *device, *path, *options, *fstype;
>>>> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
>>>> ++                struct libmnt_fs *fs;
>>>> +                 int k;
>>>> +
>>>> +-                k = mnt_table_next_fs(tb, itr, &fs);
>>>> ++                k = mnt_table_next_fs(t, i, &fs);
>>>> +                 if (k == 1)
>>>> +                         break;
>>>> +-                else if (k < 0)
>>>> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
>>>> ++                if (k < 0)
>>>> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
>>>> +
>>>> +                 device = mnt_fs_get_source(fs);
>>>> +                 path = mnt_fs_get_target(fs);
>>>> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
>>>> +                 fstype = mnt_fs_get_fstype(fs);
>>>> +
>>>> +                 d = cunescape(device);
>>>> ++                if (!d)
>>>> ++                        return log_oom();
>>>> ++
>>>> +                 p = cunescape(path);
>>>> +-                if (!d || !p)
>>>> ++                if (!p)
>>>> +                         return log_oom();
>>>> +
>>>> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
>>>> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
>>>> ++
>>>> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
>>>> +                 if (r == 0 && k < 0)
>>>> +                         r = k;
>>>> +         }
>>>> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
>>>> +
>>>> +         r = mount_load_proc_self_mountinfo(m, true);
>>>> +         if (r < 0) {
>>>> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
>>>> +-
>>>> +                 /* Reset flags, just in case, for later calls */
>>>> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
>>>> +                         Mount *mount = MOUNT(u);
>>>> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
>>>> +                                 break;
>>>> +                         }
>>>> +
>>>> ++                        if (mount->parameters_proc_self_mountinfo.what)
>>>> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
>>>> ++
>>>> ++
>>>> +                 } else if (mount->just_mounted || mount->just_changed) {
>>>> +
>>>> +                         /* New or changed mount entry */
>>>> +diff --git a/src/core/swap.c b/src/core/swap.c
>>>> +index 6997921..5c19af5 100644
>>>> +--- a/src/core/swap.c
>>>> ++++ b/src/core/swap.c
>>>> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
>>>> +         return swap_verify(s);
>>>> + }
>>>> +
>>>> +-static int swap_add_one(
>>>> ++static int swap_setup_unit(
>>>> +                 Manager *m,
>>>> +                 const char *what,
>>>> +                 const char *what_proc_swaps,
>>>> +@@ -363,8 +363,10 @@ static int swap_add_one(
>>>> +
>>>> +         if (u &&
>>>> +             SWAP(u)->from_proc_swaps &&
>>>> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
>>>> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
>>>> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
>>>> +                 return -EEXIST;
>>>> ++        }
>>>> +
>>>> +         if (!u) {
>>>> +                 delete = true;
>>>> +@@ -379,7 +381,7 @@ static int swap_add_one(
>>>> +
>>>> +                 SWAP(u)->what = strdup(what);
>>>> +                 if (!SWAP(u)->what) {
>>>> +-                        r = log_oom();
>>>> ++                        r = -ENOMEM;
>>>> +                         goto fail;
>>>> +                 }
>>>> +
>>>> +@@ -407,7 +409,6 @@ static int swap_add_one(
>>>> +         p->priority = priority;
>>>> +
>>>> +         unit_add_to_dbus_queue(u);
>>>> +-
>>>> +         return 0;
>>>> +
>>>> + fail:
>>>> +@@ -419,7 +420,7 @@ fail:
>>>> +         return r;
>>>> + }
>>>> +
>>>> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
>>>> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
>>>> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
>>>> +         const char *dn;
>>>> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
>>>> +
>>>> +         assert(m);
>>>> +
>>>> +-        r = swap_add_one(m, device, device, prio, set_flags);
>>>> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
>>>> +         if (r < 0)
>>>> +                 return r;
>>>> +
>>>> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
>>>> +         /* Add the main device node */
>>>> +         dn = udev_device_get_devnode(d);
>>>> +         if (dn && !streq(dn, device))
>>>> +-                swap_add_one(m, dn, device, prio, set_flags);
>>>> ++                swap_setup_unit(m, dn, device, prio, set_flags);
>>>> +
>>>> +         /* Add additional units for all symlinks */
>>>> +         first = udev_device_get_devlinks_list_entry(d);
>>>> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
>>>> +                             st.st_rdev != udev_device_get_devnum(d))
>>>> +                                 continue;
>>>> +
>>>> +-                swap_add_one(m, p, device, prio, set_flags);
>>>> ++                swap_setup_unit(m, p, device, prio, set_flags);
>>>> +         }
>>>> +
>>>> +         return r;
>>>> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
>>>> +                         if (k == EOF)
>>>> +                                 break;
>>>> +
>>>> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
>>>> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
>>>> +                         continue;
>>>> +                 }
>>>> +
>>>> +                 d = cunescape(dev);
>>>> +                 if (!d)
>>>> +-                        return -ENOMEM;
>>>> ++                        return log_oom();
>>>> ++
>>>> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
>>>> +
>>>> +-                k = swap_process_new_swap(m, d, prio, set_flags);
>>>> ++                k = swap_process_new(m, d, prio, set_flags);
>>>> +                 if (k < 0)
>>>> +                         r = k;
>>>> +         }
>>>> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
>>>> +                                 break;
>>>> +                         }
>>>> +
>>>> ++                        if (swap->what)
>>>> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
>>>> ++
>>>> +                 } else if (swap->just_activated) {
>>>> +
>>>> +                         /* New swap entry */
>>>> +@@ -1298,7 +1304,7 @@ fail:
>>>> +         return r;
>>>> + }
>>>> +
>>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
>>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
>>>> +         _cleanup_free_ char *e = NULL;
>>>> +         const char *dn;
>>>> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
>>>> +         return r;
>>>> + }
>>>> +
>>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
>>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
>>>> +         const char *dn;
>>>> +         int r = 0;
>>>> +         Swap *s;
>>>> +diff --git a/src/core/swap.h b/src/core/swap.h
>>>> +index 73e64d8..914a2db 100644
>>>> +--- a/src/core/swap.h
>>>> ++++ b/src/core/swap.h
>>>> +@@ -116,8 +116,8 @@ struct Swap {
>>>> +
>>>> + extern const UnitVTable swap_vtable;
>>>> +
>>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
>>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
>>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
>>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
>>>> +
>>>> + const char* swap_state_to_string(SwapState i) _const_;
>>>> + SwapState swap_state_from_string(const char *s) _pure_;
>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
>>>> +index 563f6fe..a6558ee 100644
>>>> +--- a/src/core/unit.c
>>>> ++++ b/src/core/unit.c
>>>> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
>>>> +                 return -ENOMEM;
>>>> +
>>>> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
>>>> +-
>>>> +         if (r < 0)
>>>> +                 return r;
>>>> +
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>>>> new file mode 100644
>>>> index 0000000..d614085
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>>>> @@ -0,0 +1,26 @@
>>>> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
>>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
>>>> +Date: Sat, 28 Feb 2015 23:39:55 +0100
>>>> +Subject: [PATCH 18/26] core: fix return value on OOM
>>>> +
>>>> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
>>>> +---
>>>> + src/core/device.c | 2 ++
>>>> + 1 file changed, 2 insertions(+)
>>>> +
>>>> +diff --git a/src/core/device.c b/src/core/device.c
>>>> +index 75b9a46..1cc103c 100644
>>>> +--- a/src/core/device.c
>>>> ++++ b/src/core/device.c
>>>> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
>>>> +                         j = strjoin(model, " ", label, NULL);
>>>> +                         if (j)
>>>> +                                 r = unit_set_description(u, j);
>>>> ++                        else
>>>> ++                                r = -ENOMEM;
>>>> +                 } else
>>>> +                         r = unit_set_description(u, model);
>>>> +         } else
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>>>> new file mode 100644
>>>> index 0000000..d94da60
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>>>> @@ -0,0 +1,33 @@
>>>> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
>>>> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
>>>> +Date: Thu, 19 Feb 2015 20:47:28 +0100
>>>> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
>>>> + bus on dbus1
>>>> +
>>>> +This fixes "machinectl login" on systems configured with --disable-kdbus.
>>>> +
>>>> +The error was:
>>>> +machinectl login foo
>>>> +Failed to get machine PTY: Input/output error
>>>> +
>>>> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
>>>> +---
>>>> + src/machine/machine-dbus.c | 2 +-
>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
>>>> +index b46f0a8..b0f0f66 100644
>>>> +--- a/src/machine/machine-dbus.c
>>>> ++++ b/src/machine/machine-dbus.c
>>>> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
>>>> + #ifdef ENABLE_KDBUS
>>>> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
>>>> + #else
>>>> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
>>>> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
>>>> + #endif
>>>> +         if (!container_bus->address)
>>>> +                 return -ENOMEM;
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>>>> new file mode 100644
>>>> index 0000000..fcc2adf
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>>>> @@ -0,0 +1,25 @@
>>>> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
>>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
>>>> +Date: Fri, 20 Feb 2015 15:35:11 -0300
>>>> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
>>>> +
>>>> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
>>>> +---
>>>> + src/shared/util.c | 1 +
>>>> + 1 file changed, 1 insertion(+)
>>>> +
>>>> +diff --git a/src/shared/util.c b/src/shared/util.c
>>>> +index ba035ca..f24b5b4 100644
>>>> +--- a/src/shared/util.c
>>>> ++++ b/src/shared/util.c
>>>> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
>>>> +
>>>> + bool fstype_is_network(const char *fstype) {
>>>> +         static const char table[] =
>>>> ++                "afs\0"
>>>> +                 "cifs\0"
>>>> +                 "smbfs\0"
>>>> +                 "sshfs\0"
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>>>> new file mode 100644
>>>> index 0000000..02e279d
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>>>> @@ -0,0 +1,31 @@
>>>> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
>>>> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
>>>> +Date: Fri, 20 Feb 2015 10:53:28 +0100
>>>> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
>>>> +
>>>> +Otherwise every daemon reload prints out warnings like:
>>>> +
>>>> +systemd[1]: Unit type .busname is not supported on this system.
>>>> +systemd[1]: Unit type .swap is not supported on this system.
>>>> +
>>>> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
>>>> +---
>>>> + src/core/manager.c | 2 +-
>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/core/manager.c b/src/core/manager.c
>>>> +index 4775219..bc9b7ec 100644
>>>> +--- a/src/core/manager.c
>>>> ++++ b/src/core/manager.c
>>>> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
>>>> +                 int q;
>>>> +
>>>> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
>>>> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
>>>> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
>>>> +                         continue;
>>>> +                 }
>>>> +
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>>>> new file mode 100644
>>>> index 0000000..f5afd09
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>>>> @@ -0,0 +1,97 @@
>>>> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>> +Date: Mon, 2 Mar 2015 10:34:51 -0500
>>>> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
>>>> +
>>>> +Binary fields were not processed properly, and resulting journal files
>>>> +were non-conforming, resulting in an error ("Invalid field.") when reading.
>>>> +
>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
>>>> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
>>>> +---
>>>> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
>>>> + src/journal-remote/journal-remote-parse.h |  4 +++-
>>>> + 2 files changed, 21 insertions(+), 14 deletions(-)
>>>> +
>>>> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
>>>> +index d9dea8d..afded7e 100644
>>>> +--- a/src/journal-remote/journal-remote-parse.c
>>>> ++++ b/src/journal-remote/journal-remote-parse.c
>>>> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
>>>> +                    LLLLLLLL0011223344...\n
>>>> +                 */
>>>> +                 sep = memchr(line, '=', n);
>>>> +-                if (sep)
>>>> ++                if (sep) {
>>>> +                         /* chomp newline */
>>>> +                         n--;
>>>> +-                else
>>>> ++
>>>> ++                        r = iovw_put(&source->iovw, line, n);
>>>> ++                        if (r < 0)
>>>> ++                                return r;
>>>> ++                } else {
>>>> +                         /* replace \n with = */
>>>> +                         line[n-1] = '=';
>>>> +-                log_trace("Received: %.*s", (int) n, line);
>>>> +
>>>> +-                r = iovw_put(&source->iovw, line, n);
>>>> +-                if (r < 0) {
>>>> +-                        log_error("Failed to put line in iovect");
>>>> +-                        return r;
>>>> ++                        source->field_len = n;
>>>> ++                        source->state = STATE_DATA_START;
>>>> ++
>>>> ++                        /* we cannot put the field in iovec until we have all data */
>>>> +                 }
>>>> +
>>>> +-                if (!sep)
>>>> +-                        source->state = STATE_DATA_START;
>>>> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
>>>> ++
>>>> +                 return 0; /* continue */
>>>> +         }
>>>> +
>>>> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
>>>> +
>>>> +         case STATE_DATA: {
>>>> +                 void *data;
>>>> ++                char *field;
>>>> +
>>>> +                 assert(source->data_size > 0);
>>>> +
>>>> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
>>>> +
>>>> +                 assert(data);
>>>> +
>>>> +-                r = iovw_put(&source->iovw, data, source->data_size);
>>>> +-                if (r < 0) {
>>>> +-                        log_error("failed to put binary buffer in iovect");
>>>> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
>>>> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
>>>> ++
>>>> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
>>>> ++                if (r < 0)
>>>> +                         return r;
>>>> +-                }
>>>> +
>>>> +                 source->state = STATE_DATA_FINISH;
>>>> +
>>>> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
>>>> +index 8499f4e..22db550 100644
>>>> +--- a/src/journal-remote/journal-remote-parse.h
>>>> ++++ b/src/journal-remote/journal-remote-parse.h
>>>> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
>>>> +         size_t offset;     /* offset to the beginning of live data in the buffer */
>>>> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
>>>> +         size_t filled;     /* total number of bytes in the buffer */
>>>> +-        size_t data_size;  /* size of the binary data chunk being processed */
>>>> ++
>>>> ++        size_t field_len;  /* used for binary fields: the field name length */
>>>> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
>>>> +
>>>> +         struct iovec_wrapper iovw;
>>>> +
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>>>> new file mode 100644
>>>> index 0000000..79e565b
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>>>> @@ -0,0 +1,37 @@
>>>> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
>>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
>>>> +Date: Sun, 1 Mar 2015 21:13:10 -0300
>>>> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
>>>> +
>>>> +Logs constantly show
>>>> +
>>>> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
>>>> +
>>>> +This is because ext4 does not support FS_NOCOW_FL.
>>>> +
>>>> +[zj: fold into one conditional as suggested on the ML and
>>>> +     fix (preexisting) r/errno confusion in error message.]
>>>> +
>>>> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
>>>> +---
>>>> + src/journal/journal-file.c | 4 ++--
>>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
>>>> +
>>>> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
>>>> +index 2845e05..0f28718 100644
>>>> +--- a/src/journal/journal-file.c
>>>> ++++ b/src/journal/journal-file.c
>>>> +@@ -2611,8 +2611,8 @@ int journal_file_open(
>>>> +                  * shouldn't be too bad, given that we do our own
>>>> +                  * checksumming). */
>>>> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
>>>> +-                if (r < 0)
>>>> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
>>>> ++                if (r < 0 && r != -ENOTTY)
>>>> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
>>>> +
>>>> +                 /* Let's attach the creation time to the journal file,
>>>> +                  * so that the vacuuming code knows the age of this
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>>>> new file mode 100644
>>>> index 0000000..0cf9a0a
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>>>> @@ -0,0 +1,53 @@
>>>> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
>>>> +From: Lennart Poettering <lennart@poettering.net>
>>>> +Date: Mon, 2 Mar 2015 20:55:38 +0100
>>>> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
>>>> + happy
>>>> +
>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
>>>> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
>>>> +---
>>>> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
>>>> + 1 file changed, 5 insertions(+), 7 deletions(-)
>>>> +
>>>> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
>>>> +index 028c2a7..22a3a53 100644
>>>> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
>>>> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
>>>> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
>>>> +                 .msg_iovlen = 1,
>>>> +                 .msg_name = &sockaddr,
>>>> +         };
>>>> +-        union {
>>>> +-                struct cmsghdr cmsghdr;
>>>> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
>>>> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
>>>> +-        } control;
>>>> ++        struct cmsghdr *control;
>>>> +         _cleanup_close_ int fd = -1;
>>>> +         struct cmsghdr *cmsg = NULL;
>>>> +         const char *e;
>>>> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
>>>> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
>>>> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
>>>> +
>>>> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
>>>> ++
>>>> +         if (n_fds > 0) {
>>>> +-                msghdr.msg_control = &control;
>>>> ++                msghdr.msg_control = control;
>>>> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
>>>> +
>>>> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
>>>> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
>>>> +                 try_without_ucred = true;
>>>> +                 controllen_without_ucred = msghdr.msg_controllen;
>>>> +
>>>> +-                msghdr.msg_control = &control;
>>>> ++                msghdr.msg_control = control;
>>>> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
>>>> +
>>>> +                 if (cmsg)
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>>>> new file mode 100644
>>>> index 0000000..6912489
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>>>> @@ -0,0 +1,84 @@
>>>> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
>>>> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
>>>> +Date: Tue, 3 Mar 2015 00:35:08 +0100
>>>> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
>>>> + filesystems
>>>> +
>>>> +A warning is printed if ACLs cannot be retrieved for any reason other
>>>> +than -ENOSYS. For -ENOSYS, debug log is printed.
>>>> +
>>>> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
>>>> +---
>>>> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
>>>> + 1 file changed, 20 insertions(+), 16 deletions(-)
>>>> +
>>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
>>>> +index 88ba7e4..187997e 100644
>>>> +--- a/src/tmpfiles/tmpfiles.c
>>>> ++++ b/src/tmpfiles/tmpfiles.c
>>>> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
>>>> +         int r;
>>>> +         _cleanup_(acl_free_charpp) char *t = NULL;
>>>> +
>>>> ++        /* Returns 0 for success, positive error if already warned,
>>>> ++         * negative error otherwise. */
>>>> ++
>>>> +         if (modify) {
>>>> +                 r = acls_for_file(path, type, acl, &dup);
>>>> +                 if (r < 0)
>>>> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
>>>> +
>>>> +         r = acl_set_file(path, type, dup);
>>>> +         if (r < 0)
>>>> +-                return log_error_errno(-errno,
>>>> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
>>>> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
>>>> +-                                       strna(t), path);
>>>> ++                return -log_error_errno(errno,
>>>> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
>>>> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
>>>> ++                                        strna(t), path);
>>>> ++
>>>> +         return 0;
>>>> + }
>>>> + #endif
>>>> +
>>>> + static int path_set_acls(Item *item, const char *path) {
>>>> ++        int r = 0;
>>>> + #ifdef HAVE_ACL
>>>> +-        int r;
>>>> +-
>>>> +         assert(item);
>>>> +         assert(path);
>>>> +
>>>> +-        if (item->acl_access) {
>>>> ++        if (item->acl_access)
>>>> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
>>>> +-                if (r < 0)
>>>> +-                        return r;
>>>> +-        }
>>>> +
>>>> +-        if (item->acl_default) {
>>>> ++        if (r == 0 && item->acl_default)
>>>> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
>>>> +-                if (r < 0)
>>>> +-                        return r;
>>>> +-        }
>>>> +-#endif
>>>> +
>>>> +-        return 0;
>>>> ++        if (r > 0)
>>>> ++                return -r; /* already warned */
>>>> ++        else if (r == -ENOTSUP) {
>>>> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
>>>> ++                return 0;
>>>> ++        } else if (r < 0)
>>>> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
>>>> ++#endif
>>>> ++        return r;
>>>> + }
>>>> +
>>>> + static int write_one_file(Item *i, const char *path) {
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
>>>> new file mode 100644
>>>> index 0000000..a49a369
>>>> --- /dev/null
>>>> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
>>>> @@ -0,0 +1,30 @@
>>>> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>> +Date: Tue, 3 Mar 2015 19:07:28 -0500
>>>> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
>>>> + missing
>>>> +
>>>> +On s390 (at least) /sys/class/power_supply is not present. We should
>>>> +treat this like if this directory was empty, and not an error.
>>>> +
>>>> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
>>>> +---
>>>> + src/shared/util.c | 2 +-
>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>> +
>>>> +diff --git a/src/shared/util.c b/src/shared/util.c
>>>> +index f24b5b4..8548723 100644
>>>> +--- a/src/shared/util.c
>>>> ++++ b/src/shared/util.c
>>>> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
>>>> +
>>>> +         d = opendir("/sys/class/power_supply");
>>>> +         if (!d)
>>>> +-                return -errno;
>>>> ++                return errno == ENOENT ? true : -errno;
>>>> +
>>>> +         for (;;) {
>>>> +                 struct dirent *de;
>>>> +--
>>>> +1.9.1
>>>> +
>>>> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
>>>> index 73b930e..9c20b11 100644
>>>> --- a/meta/recipes-core/systemd/systemd_219.bb
>>>> +++ b/meta/recipes-core/systemd/systemd_219.bb
>>>> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
>>>>            file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
>>>>            file://0010-Make-root-s-home-directory-configurable.patch \
>>>>            file://0011-systemd-user-avoid-using-system-auth.patch \
>>>> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
>>>> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
>>>>            file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
>>>> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
>>>>            file://0014-Revert-rules-remove-firmware-loading-rules.patch \
>>>>            file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
>>>>            file://tmpfiles-pam.patch \
>>>> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
>>>> 
>>>> S = "${WORKDIR}/git"
>>>> 
>>>> +# Appending backport fixes released for version 219-stable
>>>> +SRC_URI_append = "\
>>>> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
>>>> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
>>>> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
>>>> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
>>>> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
>>>> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
>>>> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
>>>> +           file://0008-bootchart-fix-default-init-path.patch \
>>>> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
>>>> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
>>>> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
>>>> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
>>>> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
>>>> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
>>>> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
>>>> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
>>>> +           file://0017-core-rework-device-state-logic.patch \
>>>> +           file://0018-core-fix-return-value-on-OOM.patch \
>>>> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
>>>> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
>>>> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
>>>> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
>>>> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
>>>> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
>>>> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
>>>> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
>>>> +           "
>>>> +
>>>> SRC_URI_append_libc-uclibc = "\
>>>>             file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
>>>>            "
>>>> --
>>>> 1.9.1
>>>> 
>>> 
>>> 
>>> --
>>> _______________________________________________
>>> Openembedded-core mailing list
>>> Openembedded-core@lists.openembedded.org
>>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>> 
>> 
>> 
> 
> 



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-04-01 21:14       ` Khem Raj
@ 2015-04-01 21:16         ` Bottazzini, Bruno
  2015-04-07 13:10           ` Bottazzini, Bruno
  0 siblings, 1 reply; 12+ messages in thread
From: Bottazzini, Bruno @ 2015-04-01 21:16 UTC (permalink / raw)
  To: Khem Raj; +Cc: Patches and discussions about the oe-core layer

Thanks!!! 

On Qua, 2015-04-01 at 14:14 -0700, Khem Raj wrote:
> I will try it out. give me a day
> 
> > On Apr 1, 2015, at 2:08 PM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
> > 
> > Khem,
> > 
> > Could you verify this patch and see if this satisfies what you have
> > pointed previously ?
> > 
> > Do you think this patch is ready to go to master ?
> > 
> > Regards,
> > 
> > On Ter, 2015-03-31 at 17:25 -0300, Otavio Salvador wrote:
> >> I am not a heavy user of systemd so I prefer other people (Khem?) to
> >> comment on this ...
> >> 
> >> On Tue, Mar 31, 2015 at 5:21 PM, Bottazzini, Bruno
> >> <bruno.bottazzini@intel.com> wrote:
> >>> Ping
> >>> 
> >>> On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
> >>>> Adding patches that fix bugs for 219 version.
> >>>> This will get the same consistency of the stable systemd 219 version.
> >>>> 
> >>>> More details:
> >>>> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
> >>>> ---
> >>>> ...remote-fix-certificate-status-memory-leak.patch |  31 +
> >>>> ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
> >>>> ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
> >>>> ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
> >>>> ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
> >>>> .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
> >>>> ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
> >>>> .../0008-bootchart-fix-default-init-path.patch     |  44 +
> >>>> ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
> >>>> ...0-Make-root-s-home-directory-configurable.patch |  89 +-
> >>>> ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
> >>>> ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
> >>>> ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
> >>>> ...aker-dependencies-between-mount-and-devic.patch |  33 +
> >>>> ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
> >>>> ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
> >>>> ...l-add-some-hints-how-to-override-settings.patch |  39 +
> >>>> .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
> >>>> .../0018-core-fix-return-value-on-OOM.patch        |  26 +
> >>>> ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
> >>>> ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
> >>>> ...downgrade-unit-type-not-supported-message.patch |  31 +
> >>>> ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
> >>>> ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
> >>>> ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
> >>>> ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
> >>>> ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
> >>>> meta/recipes-core/systemd/systemd_219.bb           |  33 +-
> >>>> 28 files changed, 2050 insertions(+), 55 deletions(-)
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> >>>> create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> >>>> 
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> >>>> new file mode 100644
> >>>> index 0000000..172bea2
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> >>>> @@ -0,0 +1,31 @@
> >>>> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
> >>>> +From: Michal Schmidt <mschmidt@redhat.com>
> >>>> +Date: Tue, 17 Feb 2015 10:33:01 +0100
> >>>> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
> >>>> +
> >>>> +The output of gnutls_certificate_verification_status_print() needs to be
> >>>> +freed.
> >>>> +
> >>>> +Noticed this while staring at verify_cert_authorized() to see what could
> >>>> +possibly confuse gcc5 on armv7hl to segfault during compilation.
> >>>> +
> >>>> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
> >>>> +---
> >>>> + src/journal-remote/microhttpd-util.c | 1 +
> >>>> + 1 file changed, 1 insertion(+)
> >>>> +
> >>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> >>>> +index 34d9337..de9c6ab 100644
> >>>> +--- a/src/journal-remote/microhttpd-util.c
> >>>> ++++ b/src/journal-remote/microhttpd-util.c
> >>>> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
> >>>> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
> >>>> +
> >>>> +         log_info("Certificate status: %s", out.data);
> >>>> ++        gnutls_free(out.data);
> >>>> +
> >>>> +         return status == 0 ? 0 : -EPERM;
> >>>> + }
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> >>>> new file mode 100644
> >>>> index 0000000..f615876
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> >>>> @@ -0,0 +1,35 @@
> >>>> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
> >>>> +From: Michal Schmidt <mschmidt@redhat.com>
> >>>> +Date: Tue, 17 Feb 2015 10:36:57 +0100
> >>>> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
> >>>> +
> >>>> +Found by Valgrind while testing the previous memory leak fix.
> >>>> +
> >>>> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
> >>>> +---
> >>>> + src/journal-remote/microhttpd-util.c | 6 +++++-
> >>>> + 1 file changed, 5 insertions(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> >>>> +index de9c6ab..a95fff1 100644
> >>>> +--- a/src/journal-remote/microhttpd-util.c
> >>>> ++++ b/src/journal-remote/microhttpd-util.c
> >>>> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
> >>>> +         return 0;
> >>>> + }
> >>>> +
> >>>> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
> >>>> ++        gnutls_x509_crt_deinit(*p);
> >>>> ++}
> >>>> ++
> >>>> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
> >>>> +         const union MHD_ConnectionInfo *ci;
> >>>> +         gnutls_session_t session;
> >>>> +-        gnutls_x509_crt_t client_cert;
> >>>> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
> >>>> +         _cleanup_free_ char *buf = NULL;
> >>>> +         int r;
> >>>> +
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> >>>> new file mode 100644
> >>>> index 0000000..15fa98c
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> >>>> @@ -0,0 +1,28 @@
> >>>> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
> >>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
> >>>> +Date: Tue, 17 Feb 2015 12:47:51 +0100
> >>>> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
> >>>> +
> >>>> +parse_acl() returns the error instead of setting errno.
> >>>> +
> >>>> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
> >>>> +---
> >>>> + src/tmpfiles/tmpfiles.c | 2 +-
> >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> >>>> +index c948d4d..88ba7e4 100644
> >>>> +--- a/src/tmpfiles/tmpfiles.c
> >>>> ++++ b/src/tmpfiles/tmpfiles.c
> >>>> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
> >>>> +          * afterwards, so the mask can be added now if necessary. */
> >>>> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
> >>>> +         if (r < 0)
> >>>> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
> >>>> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
> >>>> +                                   item->argument);
> >>>> + #else
> >>>> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> >>>> new file mode 100644
> >>>> index 0000000..f43068d
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> >>>> @@ -0,0 +1,26 @@
> >>>> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
> >>>> +From: Tom Gundersen <teg@jklm.no>
> >>>> +Date: Wed, 18 Feb 2015 14:33:50 +0100
> >>>> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
> >>>> +
> >>>> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
> >>>> +---
> >>>> + src/test/test-utf8.c | 2 +-
> >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
> >>>> +index befa385..346f852 100644
> >>>> +--- a/src/test/test-utf8.c
> >>>> ++++ b/src/test/test-utf8.c
> >>>> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
> >>>> +
> >>>> + static void test_utf16_to_utf8(void) {
> >>>> +         char *a = NULL;
> >>>> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
> >>>> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
> >>>> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
> >>>> +
> >>>> +         a = utf16_to_utf8(utf16, 14);
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> >>>> new file mode 100644
> >>>> index 0000000..35fe913
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> >>>> @@ -0,0 +1,131 @@
> >>>> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
> >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>> +Date: Mon, 23 Feb 2015 23:19:54 -0500
> >>>> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
> >>>> +
> >>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
> >>>> +https://bugs.debian.org/778656
> >>>> +
> >>>> +Status quo ante can be restored with:
> >>>> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
> >>>> +
> >>>> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
> >>>> +---
> >>>> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
> >>>> + src/shared/acl-util.h |  4 +++
> >>>> + 2 files changed, 81 insertions(+), 2 deletions(-)
> >>>> +
> >>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> >>>> +index a4ff1ab..cbe09d7 100644
> >>>> +--- a/src/shared/acl-util.c
> >>>> ++++ b/src/shared/acl-util.c
> >>>> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
> >>>> +         return 0;
> >>>> + }
> >>>> +
> >>>> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> >>>> ++        acl_tag_t tag_a, tag_b;
> >>>> ++
> >>>> ++        if (acl_get_tag_type(a, &tag_a) < 0)
> >>>> ++                return -errno;
> >>>> ++
> >>>> ++        if (acl_get_tag_type(b, &tag_b) < 0)
> >>>> ++                return -errno;
> >>>> ++
> >>>> ++        if (tag_a != tag_b)
> >>>> ++                return false;
> >>>> ++
> >>>> ++        switch (tag_a) {
> >>>> ++        case ACL_USER_OBJ:
> >>>> ++        case ACL_GROUP_OBJ:
> >>>> ++        case ACL_MASK:
> >>>> ++        case ACL_OTHER:
> >>>> ++                /* can have only one of those */
> >>>> ++                return true;
> >>>> ++        case ACL_USER: {
> >>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> >>>> ++
> >>>> ++                uid_a = acl_get_qualifier(a);
> >>>> ++                if (!uid_a)
> >>>> ++                        return -errno;
> >>>> ++
> >>>> ++                uid_b = acl_get_qualifier(b);
> >>>> ++                if (!uid_b)
> >>>> ++                        return -errno;
> >>>> ++
> >>>> ++                return *uid_a == *uid_b;
> >>>> ++        }
> >>>> ++        case ACL_GROUP: {
> >>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> >>>> ++
> >>>> ++                gid_a = acl_get_qualifier(a);
> >>>> ++                if (!gid_a)
> >>>> ++                        return -errno;
> >>>> ++
> >>>> ++                gid_b = acl_get_qualifier(b);
> >>>> ++                if (!gid_b)
> >>>> ++                        return -errno;
> >>>> ++
> >>>> ++                return *gid_a == *gid_b;
> >>>> ++        }
> >>>> ++        default:
> >>>> ++                assert_not_reached("Unknown acl tag type");
> >>>> ++        }
> >>>> ++}
> >>>> ++
> >>>> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
> >>>> ++        acl_entry_t i;
> >>>> ++        int r;
> >>>> ++
> >>>> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
> >>>> ++             r > 0;
> >>>> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
> >>>> ++
> >>>> ++                r = acl_entry_equal(i, entry);
> >>>> ++                if (r < 0)
> >>>> ++                        return r;
> >>>> ++                if (r > 0) {
> >>>> ++                        *out = i;
> >>>> ++                        return 1;
> >>>> ++                }
> >>>> ++        }
> >>>> ++        if (r < 0)
> >>>> ++                return -errno;
> >>>> ++        return 0;
> >>>> ++}
> >>>> ++
> >>>> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> >>>> +         _cleanup_(acl_freep) acl_t old;
> >>>> +         acl_entry_t i;
> >>>> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> >>>> +
> >>>> +                 acl_entry_t j;
> >>>> +
> >>>> +-                if (acl_create_entry(&old, &j) < 0)
> >>>> +-                        return -errno;
> >>>> ++                r = find_acl_entry(old, i, &j);
> >>>> ++                if (r < 0)
> >>>> ++                        return r;
> >>>> ++                if (r == 0)
> >>>> ++                        if (acl_create_entry(&old, &j) < 0)
> >>>> ++                                return -errno;
> >>>> +
> >>>> +                 if (acl_copy_entry(j, i) < 0)
> >>>> +                         return -errno;
> >>>> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
> >>>> +index 90e88ff..fdb9006 100644
> >>>> +--- a/src/shared/acl-util.h
> >>>> ++++ b/src/shared/acl-util.h
> >>>> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
> >>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
> >>>> + #define acl_free_charp acl_free
> >>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
> >>>> ++#define acl_free_uid_tp acl_free
> >>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
> >>>> ++#define acl_free_gid_tp acl_free
> >>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
> >>>> +
> >>>> + #endif
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> >>>> new file mode 100644
> >>>> index 0000000..fc707bb
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> >>>> @@ -0,0 +1,32 @@
> >>>> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
> >>>> +From: Daniel Mack <daniel@zonque.org>
> >>>> +Date: Tue, 24 Feb 2015 13:26:09 +0100
> >>>> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
> >>>> +
> >>>> +  CC       src/shared/libsystemd_shared_la-time-util.lo
> >>>> +src/shared/time-util.c: In function 'parse_nsec':
> >>>> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
> >>>> +                 if (!*s != 0)
> >>>> +                         ^
> >>>> +
> >>>> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
> >>>> +---
> >>>> + src/shared/time-util.c | 2 +-
> >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
> >>>> +index 947ac1f..1c36c57 100644
> >>>> +--- a/src/shared/time-util.c
> >>>> ++++ b/src/shared/time-util.c
> >>>> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
> >>>> +         s = startswith(p, "infinity");
> >>>> +         if (s) {
> >>>> +                 s += strspn(s, WHITESPACE);
> >>>> +-                if (!*s != 0)
> >>>> ++                if (*s != 0)
> >>>> +                         return -EINVAL;
> >>>> +
> >>>> +                 *nsec = NSEC_INFINITY;
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> >>>> new file mode 100644
> >>>> index 0000000..161b7b5
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> >>>> @@ -0,0 +1,36 @@
> >>>> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
> >>>> +From: Daniel Mack <daniel@zonque.org>
> >>>> +Date: Tue, 24 Feb 2015 13:27:10 +0100
> >>>> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
> >>>> +
> >>>> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
> >>>> +---
> >>>> + src/test/test-time.c | 6 ++++++
> >>>> + 1 file changed, 6 insertions(+)
> >>>> +
> >>>> +diff --git a/src/test/test-time.c b/src/test/test-time.c
> >>>> +index 8cfc4cc..3840fff 100644
> >>>> +--- a/src/test/test-time.c
> >>>> ++++ b/src/test/test-time.c
> >>>> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
> >>>> +         assert_se(u == 2);
> >>>> +         assert_se(parse_nsec(".7", &u) >= 0);
> >>>> +         assert_se(u == 0);
> >>>> ++        assert_se(parse_nsec("infinity", &u) >= 0);
> >>>> ++        assert_se(u == NSEC_INFINITY);
> >>>> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
> >>>> ++        assert_se(u == NSEC_INFINITY);
> >>>> +
> >>>> +         assert_se(parse_nsec(" xyz ", &u) < 0);
> >>>> +         assert_se(parse_nsec("", &u) < 0);
> >>>> +         assert_se(parse_nsec(" . ", &u) < 0);
> >>>> +         assert_se(parse_nsec(" 5. ", &u) < 0);
> >>>> +         assert_se(parse_nsec(".s ", &u) < 0);
> >>>> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
> >>>> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
> >>>> + }
> >>>> +
> >>>> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> >>>> new file mode 100644
> >>>> index 0000000..7eaad1e
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> >>>> @@ -0,0 +1,44 @@
> >>>> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
> >>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
> >>>> +Date: Tue, 24 Feb 2015 14:30:10 +0100
> >>>> +Subject: [PATCH 08/26] bootchart: fix default init path
> >>>> +
> >>>> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
> >>>> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
> >>>> +multi-arch systems.
> >>>> +
> >>>> +https://launchpad.net/bugs/1423867
> >>>> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
> >>>> +---
> >>>> + Makefile.am               | 1 +
> >>>> + src/bootchart/bootchart.c | 2 +-
> >>>> + 2 files changed, 2 insertions(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/Makefile.am b/Makefile.am
> >>>> +index bf04d31..cc577ce 100644
> >>>> +--- a/Makefile.am
> >>>> ++++ b/Makefile.am
> >>>> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
> >>>> +     -DKEXEC=\"$(KEXEC)\" \
> >>>> +     -DLIBDIR=\"$(libdir)\" \
> >>>> +     -DROOTLIBDIR=\"$(rootlibdir)\" \
> >>>> ++    -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> >>>> +     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> >>>> +     -I $(top_srcdir)/src \
> >>>> +     -I $(top_builddir)/src/shared \
> >>>> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
> >>>> +index 64a384b..175be68 100644
> >>>> +--- a/src/bootchart/bootchart.c
> >>>> ++++ b/src/bootchart/bootchart.c
> >>>> +@@ -76,7 +76,7 @@ int sysfd=-1;
> >>>> + #define DEFAULT_HZ 25.0
> >>>> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
> >>>> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
> >>>> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
> >>>> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
> >>>> + #define DEFAULT_OUTPUT "/run/log"
> >>>> +
> >>>> + /* graph defaults */
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> >>>> new file mode 100644
> >>>> index 0000000..dbffa5b
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> >>>> @@ -0,0 +1,44 @@
> >>>> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
> >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>> +Date: Tue, 24 Feb 2015 10:10:04 -0500
> >>>> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
> >>>> +
> >>>> +It is not necessary when running as telinit, etc.
> >>>> +
> >>>> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
> >>>> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
> >>>> +---
> >>>> + src/systemctl/systemctl.c | 10 +++++-----
> >>>> + 1 file changed, 5 insertions(+), 5 deletions(-)
> >>>> +
> >>>> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
> >>>> +index 21cb898..6b93ec8 100644
> >>>> +--- a/src/systemctl/systemctl.c
> >>>> ++++ b/src/systemctl/systemctl.c
> >>>> +@@ -7204,6 +7204,11 @@ found:
> >>>> +                 }
> >>>> +         }
> >>>> +
> >>>> ++        /* Increase max number of open files to 16K if we can, we
> >>>> ++         * might needs this when browsing journal files, which might
> >>>> ++         * be split up into many files. */
> >>>> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> >>>> ++
> >>>> +         return verb->dispatch(bus, argv + optind);
> >>>> + }
> >>>> +
> >>>> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
> >>>> +                 goto finish;
> >>>> +         }
> >>>> +
> >>>> +-        /* Increase max number of open files to 16K if we can, we
> >>>> +-         * might needs this when browsing journal files, which might
> >>>> +-         * be split up into many files. */
> >>>> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> >>>> +-
> >>>> +         if (!avoid_bus())
> >>>> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
> >>>> +
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> >>>> index 41b9039..ff2871b 100644
> >>>> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> >>>> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> >>>> @@ -1,7 +1,7 @@
> >>>> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
> >>>> -From: Khem Raj <raj.khem@gmail.com>
> >>>> -Date: Fri, 20 Feb 2015 05:24:49 +0000
> >>>> -Subject: [PATCH 10/11] Make root's home directory configurable
> >>>> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
> >>>> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
> >>>> +Date: Thu, 5 Mar 2015 17:38:12 -0300
> >>>> +Subject: [PATCH] Make root's home directory configurable
> >>>> 
> >>>> OpenEmbedded has a configurable home directory for root. Allow
> >>>> systemd to be built using its idea of what root's home directory
> >>>> @@ -9,32 +9,31 @@ should be.
> >>>> 
> >>>> Upstream-Status: Pending
> >>>> 
> >>>> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
> >>>> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
> >>>> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
> >>>> +compatbile with systemd 219-stable
> >>>> ---
> >>>> - Makefile.am                       | 2 ++
> >>>> - configure.ac                      | 7 +++++++
> >>>> - src/core/unit-printf.c            | 2 +-
> >>>> - src/nspawn/nspawn.c               | 4 ++--
> >>>> - src/shared/util.c                 | 4 ++--
> >>>> - units/console-shell.service.m4.in | 4 ++--
> >>>> - units/emergency.service.in        | 4 ++--
> >>>> - units/rescue.service.in           | 4 ++--
> >>>> - 8 files changed, 20 insertions(+), 11 deletions(-)
> >>>> + Makefile.am                | 2 ++
> >>>> + configure.ac               | 7 +++++++
> >>>> + src/core/unit-printf.c     | 2 +-
> >>>> + src/nspawn/nspawn.c        | 5 ++---
> >>>> + src/shared/util.c          | 4 ++--
> >>>> + units/emergency.service.in | 4 ++--
> >>>> + units/rescue.service.in    | 4 ++--
> >>>> + 7 files changed, 18 insertions(+), 10 deletions(-)
> >>>> 
> >>>> diff --git a/Makefile.am b/Makefile.am
> >>>> -index 0fb3f9f..4623963 100644
> >>>> +index 93c0509..31ea94d 100644
> >>>> --- a/Makefile.am
> >>>> +++ b/Makefile.am
> >>>> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
> >>>> -     -DKEXEC=\"$(KEXEC)\" \
> >>>> -     -DLIBDIR=\"$(libdir)\" \
> >>>> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
> >>>>      -DROOTLIBDIR=\"$(rootlibdir)\" \
> >>>> -+    -DROOTHOMEDIR=\"$(roothomedir)\" \
> >>>> +     -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> >>>>      -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> >>>> ++    -DROOTHOMEDIR=\"$(roothomedir)\" \
> >>>>      -I $(top_srcdir)/src \
> >>>>      -I $(top_builddir)/src/shared \
> >>>> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
> >>>> +     -I $(top_srcdir)/src/shared \
> >>>> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
> >>>>  substitutions = \
> >>>>         '|rootlibexecdir=$(rootlibexecdir)|' \
> >>>>         '|rootbindir=$(rootbindir)|' \
> >>>> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
> >>>>         '|SYSTEMCTL=$(rootbindir)/systemctl|' \
> >>>>         '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
> >>>> diff --git a/configure.ac b/configure.ac
> >>>> -index a5b2e6e..55bb7d8 100644
> >>>> +index 01ee8dc..800a587 100644
> >>>> --- a/configure.ac
> >>>> +++ b/configure.ac
> >>>> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
> >>>> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
> >>>>          [],
> >>>>          [with_rootlibdir=${libdir}])
> >>>> 
> >>>> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
> >>>>  AC_ARG_WITH([pamlibdir],
> >>>>          AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
> >>>>          [],
> >>>> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> >>>> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> >>>>  AC_SUBST([pamconfdir], [$with_pamconfdir])
> >>>>  AC_SUBST([rootprefix], [$with_rootprefix])
> >>>>  AC_SUBST([rootlibdir], [$with_rootlibdir])
> >>>> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
> >>>> 
> >>>>  AC_CONFIG_FILES([
> >>>>          Makefile po/Makefile.in
> >>>> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
> >>>> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
> >>>>          include_prefix:          ${INCLUDE_PREFIX}
> >>>>          lib dir:                 ${libdir}
> >>>>          rootlib dir:             ${with_rootlibdir}
> >>>> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
> >>>>          SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
> >>>>          Build Python:            ${PYTHON}
> >>>> diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
> >>>> -index 97135db..14d12f1 100644
> >>>> +index 7736899..ac5f008 100644
> >>>> --- a/src/core/unit-printf.c
> >>>> +++ b/src/core/unit-printf.c
> >>>> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> >>>> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> >>>>                   * best of it if we can, but fail if we can't */
> >>>> 
> >>>>                  if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
> >>>> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
> >>>>                          return -ENOTSUP;
> >>>> 
> >>>> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
> >>>> -index b597edb..0b32673 100644
> >>>> +index 08bfdcf..b44b4cd 100644
> >>>> --- a/src/nspawn/nspawn.c
> >>>> +++ b/src/nspawn/nspawn.c
> >>>> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
> >>>> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
> >>>> +                         r = change_uid_gid(&home);
> >>>>                          if (r < 0)
> >>>>                                  _exit(EXIT_FAILURE);
> >>>> -
> >>>> +-
> >>>> -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
> >>>> +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
> >>>>                              (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
> >>>>                              (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
> >>>>                                  log_oom();
> >>>> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
> >>>> -                                 execvp(argv[optind], argv + optind);
> >>>> - #endif /* HAVE_EXECVPE */
> >>>> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
> >>>> +                         } else if (argc > optind)
> >>>> +                                 execvpe(argv[optind], argv + optind, env_use);
> >>>>                          else {
> >>>> -                                chdir(home ? home : "/root");
> >>>> +                                chdir(home ? home : ROOTHOMEDIR);
> >>>> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
> >>>>                                  execle("/bin/sh", "-sh", NULL, env_use);
> >>>>                          }
> >>>> diff --git a/src/shared/util.c b/src/shared/util.c
> >>>> -index cbbe3b1..a0e3cc5 100644
> >>>> +index 241e752..00adab6 100644
> >>>> --- a/src/shared/util.c
> >>>> +++ b/src/shared/util.c
> >>>> -@@ -4609,7 +4609,7 @@ int get_user_creds(
> >>>> +@@ -4604,7 +4604,7 @@ int get_user_creds(
> >>>>                          *gid = 0;
> >>>> 
> >>>>                  if (home)
> >>>> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
> >>>> 
> >>>>                  if (shell)
> >>>>                          *shell = "/bin/sh";
> >>>> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
> >>>> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
> >>>>          /* Hardcode home directory for root to avoid NSS */
> >>>>          u = getuid();
> >>>>          if (u == 0) {
> >>>> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
> >>>>                  if (!h)
> >>>>                          return -ENOMEM;
> >>>> 
> >>>> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
> >>>> -index 5c80722..efde5f0 100644
> >>>> ---- a/units/console-shell.service.m4.in
> >>>> -+++ b/units/console-shell.service.m4.in
> >>>> -@@ -15,8 +15,8 @@ After=rc-local.service
> >>>> - Before=getty.target
> >>>> -
> >>>> - [Service]
> >>>> --Environment=HOME=/root
> >>>> --WorkingDirectory=/root
> >>>> -+Environment=HOME=@roothomedir@
> >>>> -+WorkingDirectory=@roothomedir@
> >>>> - ExecStart=-@SULOGIN@
> >>>> - ExecStopPost=-@SYSTEMCTL@ poweroff
> >>>> - Type=idle
> >>>> diff --git a/units/emergency.service.in b/units/emergency.service.in
> >>>> index 2695d7b..7f47b73 100644
> >>>> --- a/units/emergency.service.in
> >>>> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
> >>>>  ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
> >>>>  ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
> >>>> --
> >>>> -2.1.4
> >>>> +1.9.1
> >>>> 
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> >>>> new file mode 100644
> >>>> index 0000000..1e4a69d
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> >>>> @@ -0,0 +1,37 @@
> >>>> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
> >>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> >>>> +Date: Tue, 24 Feb 2015 20:40:07 +0100
> >>>> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
> >>>> +
> >>>> +CID#1271344/1271345
> >>>> +
> >>>> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
> >>>> +---
> >>>> + src/shared/acl-util.c | 4 ++--
> >>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
> >>>> +
> >>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> >>>> +index cbe09d7..e67e9ac 100644
> >>>> +--- a/src/shared/acl-util.c
> >>>> ++++ b/src/shared/acl-util.c
> >>>> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> >>>> +                 /* can have only one of those */
> >>>> +                 return true;
> >>>> +         case ACL_USER: {
> >>>> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> >>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
> >>>> +
> >>>> +                 uid_a = acl_get_qualifier(a);
> >>>> +                 if (!uid_a)
> >>>> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> >>>> +                 return *uid_a == *uid_b;
> >>>> +         }
> >>>> +         case ACL_GROUP: {
> >>>> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> >>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
> >>>> +
> >>>> +                 gid_a = acl_get_qualifier(a);
> >>>> +                 if (!gid_a)
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> >>>> new file mode 100644
> >>>> index 0000000..dca5e20
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> >>>> @@ -0,0 +1,28 @@
> >>>> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
> >>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> >>>> +Date: Tue, 24 Feb 2015 18:32:31 +0200
> >>>> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
> >>>> +
> >>>> +If we have less samples than expected, systemd-bootchart will crash.
> >>>> +
> >>>> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
> >>>> +---
> >>>> + src/bootchart/svg.c | 2 +-
> >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
> >>>> +index e111fa9..144177c 100644
> >>>> +--- a/src/bootchart/svg.c
> >>>> ++++ b/src/bootchart/svg.c
> >>>> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
> >>>> +
> >>>> +                 ps->sample = ps->sample->next;
> >>>> +                 sample_hz = ps->sample;
> >>>> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
> >>>> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
> >>>> +                         sample_hz = sample_hz->next;
> >>>> +
> >>>> +                 /* subtract bootchart cpu utilization from total */
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> >>>> new file mode 100644
> >>>> index 0000000..e0cb193
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> >>>> @@ -0,0 +1,38 @@
> >>>> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
> >>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> >>>> +Date: Mon, 23 Feb 2015 16:01:31 +0200
> >>>> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
> >>>> +
> >>>> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
> >>>> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
> >>>> +syscalls getrandom and memfd_create").
> >>>> +
> >>>> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
> >>>> +---
> >>>> + src/shared/missing.h | 10 ++++++++++
> >>>> + 1 file changed, 10 insertions(+)
> >>>> +
> >>>> +diff --git a/src/shared/missing.h b/src/shared/missing.h
> >>>> +index b33a70c..e72631e 100644
> >>>> +--- a/src/shared/missing.h
> >>>> ++++ b/src/shared/missing.h
> >>>> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
> >>>> + #    define __NR_getrandom 349
> >>>> + #  elif defined(__powerpc__)
> >>>> + #    define __NR_getrandom 359
> >>>> ++#  elif defined _MIPS_SIM
> >>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
> >>>> ++#      define __NR_getrandom 4353
> >>>> ++#    endif
> >>>> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
> >>>> ++#      define __NR_getrandom 6317
> >>>> ++#    endif
> >>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
> >>>> ++#      define __NR_getrandom 5313
> >>>> ++#    endif
> >>>> + #  else
> >>>> + #    warning "__NR_getrandom unknown for your architecture"
> >>>> + #    define __NR_getrandom 0xffffffff
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> >>>> new file mode 100644
> >>>> index 0000000..1b842a2
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> >>>> @@ -0,0 +1,33 @@
> >>>> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
> >>>> +From: Lennart Poettering <lennart@poettering.net>
> >>>> +Date: Wed, 25 Feb 2015 22:05:14 +0100
> >>>> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
> >>>> + units in --user mode
> >>>> +
> >>>> +When running in user mode unmounting of mount units when a device
> >>>> +vanishes is unlikely to work, and even if it would work is already done
> >>>> +by PID 1 anyway. HEnce, when creating implicit dependencies between
> >>>> +mount units and their backing devices, created a Wants= type dependency
> >>>> +in --user mode, but leave a BindsTo= dependency in --system mode.
> >>>> +
> >>>> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
> >>>> +---
> >>>> + src/core/unit.c | 2 +-
> >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> >>>> +index ee8e607..9f1e55e 100644
> >>>> +--- a/src/core/unit.c
> >>>> ++++ b/src/core/unit.c
> >>>> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> >>>> +         if (r < 0)
> >>>> +                 return r;
> >>>> +
> >>>> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
> >>>> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
> >>>> +         if (r < 0)
> >>>> +                 return r;
> >>>> +
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> >>>> new file mode 100644
> >>>> index 0000000..92c4b8f
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> >>>> @@ -0,0 +1,43 @@
> >>>> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
> >>>> +From: Colin Walters <walters@verbum.org>
> >>>> +Date: Tue, 17 Feb 2015 13:47:34 -0500
> >>>> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
> >>>> + caused it
> >>>> +
> >>>> +I'm trying to track down a relatively recent change in systemd
> >>>> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
> >>>> +
> >>>> +Systemd started to stop sysroot.mount, and this patch should help
> >>>> +me debug why at least.
> >>>> +
> >>>> +While we're here, "break" on the first unit we find that will
> >>>> +deactivate, as there's no point in further iteration.
> >>>> +
> >>>> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
> >>>> +---
> >>>> + src/core/unit.c | 4 +++-
> >>>> + 1 file changed, 3 insertions(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> >>>> +index 9f1e55e..563f6fe 100644
> >>>> +--- a/src/core/unit.c
> >>>> ++++ b/src/core/unit.c
> >>>> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
> >>>> +                         continue;
> >>>> +
> >>>> +                 stop = true;
> >>>> ++                break;
> >>>> +         }
> >>>> +
> >>>> +         if (!stop)
> >>>> +                 return;
> >>>> +
> >>>> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
> >>>> ++        assert(other);
> >>>> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
> >>>> +
> >>>> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
> >>>> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> >>>> new file mode 100644
> >>>> index 0000000..46c25bd
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> >>>> @@ -0,0 +1,30 @@
> >>>> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
> >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>> +Date: Thu, 26 Feb 2015 19:00:11 -0500
> >>>> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
> >>>> + debug
> >>>> +
> >>>> +Printing it at info level was tedious. We don't do that for any other
> >>>> +overrides.
> >>>> +
> >>>> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
> >>>> +---
> >>>> + src/sysctl/sysctl.c | 2 +-
> >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
> >>>> +index 275a5b7..2415d84 100644
> >>>> +--- a/src/sysctl/sysctl.c
> >>>> ++++ b/src/sysctl/sysctl.c
> >>>> +@@ -176,7 +176,7 @@ found:
> >>>> +                         if (streq(value, existing))
> >>>> +                                 continue;
> >>>> +
> >>>> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
> >>>> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
> >>>> +                         free(hashmap_remove(sysctl_options, p));
> >>>> +                         free(v);
> >>>> +                 }
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> >>>> new file mode 100644
> >>>> index 0000000..87dce1f
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> >>>> @@ -0,0 +1,39 @@
> >>>> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
> >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>> +Date: Thu, 26 Feb 2015 19:05:51 -0500
> >>>> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
> >>>> +
> >>>> +Also a link to decent documentation for sysrq keys. It is surprising
> >>>> +hard to find.
> >>>> +
> >>>> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
> >>>> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
> >>>> +---
> >>>> + sysctl.d/50-default.conf | 9 ++++++++-
> >>>> + 1 file changed, 8 insertions(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
> >>>> +index f189233..def151b 100644
> >>>> +--- a/sysctl.d/50-default.conf
> >>>> ++++ b/sysctl.d/50-default.conf
> >>>> +@@ -5,9 +5,16 @@
> >>>> + #  the Free Software Foundation; either version 2.1 of the License, or
> >>>> + #  (at your option) any later version.
> >>>> +
> >>>> +-# See sysctl.d(5) and core(5) for for details.
> >>>> ++# See sysctl.d(5) and core(5) for for documentation.
> >>>> ++
> >>>> ++# To override settings in this file, create a local file in /etc
> >>>> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
> >>>> ++# there.
> >>>> +
> >>>> + # System Request functionality of the kernel (SYNC)
> >>>> ++#
> >>>> ++# Use kernel.sysrq = 1 to allow all keys.
> >>>> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
> >>>> + kernel.sysrq = 16
> >>>> +
> >>>> + # Append the PID to the core filename
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> >>>> new file mode 100644
> >>>> index 0000000..a3ab3e4
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> >>>> @@ -0,0 +1,912 @@
> >>>> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
> >>>> +From: Lennart Poettering <lennart@poettering.net>
> >>>> +Date: Fri, 27 Feb 2015 21:55:08 +0100
> >>>> +Subject: [PATCH 17/26] core: rework device state logic
> >>>> +
> >>>> +This change introduces a new state "tentative" for device units. Device
> >>>> +units are considered "plugged" when udev announced them, "dead" when
> >>>> +they are not available in the kernel, and "tentative" when they are
> >>>> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
> >>>> +announced via udev.
> >>>> +
> >>>> +This should fix a race when device nodes (like loop devices) are created
> >>>> +and immediately mounted. Previously, systemd might end up seeing the
> >>>> +mount unit before the device, and would thus pull down the mount because
> >>>> +its BindTo dependency on the device would not be fulfilled.
> >>>> +
> >>>> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
> >>>> +---
> >>>> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
> >>>> + src/core/device.h |  14 ++-
> >>>> + src/core/mount.c  |  46 ++++---
> >>>> + src/core/swap.c   |  32 +++--
> >>>> + src/core/swap.h   |   4 +-
> >>>> + src/core/unit.c   |   1 -
> >>>> + 6 files changed, 285 insertions(+), 180 deletions(-)
> >>>> +
> >>>> +diff --git a/src/core/device.c b/src/core/device.c
> >>>> +index d3deac3..75b9a46 100644
> >>>> +--- a/src/core/device.c
> >>>> ++++ b/src/core/device.c
> >>>> +@@ -36,7 +36,8 @@
> >>>> +
> >>>> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
> >>>> +         [DEVICE_DEAD] = UNIT_INACTIVE,
> >>>> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
> >>>> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
> >>>> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
> >>>> + };
> >>>> +
> >>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
> >>>> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
> >>>> +         d->sysfs = NULL;
> >>>> + }
> >>>> +
> >>>> ++static int device_set_sysfs(Device *d, const char *sysfs) {
> >>>> ++        Device *first;
> >>>> ++        char *copy;
> >>>> ++        int r;
> >>>> ++
> >>>> ++        assert(d);
> >>>> ++
> >>>> ++        if (streq_ptr(d->sysfs, sysfs))
> >>>> ++                return 0;
> >>>> ++
> >>>> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
> >>>> ++        if (r < 0)
> >>>> ++                return r;
> >>>> ++
> >>>> ++        copy = strdup(sysfs);
> >>>> ++        if (!copy)
> >>>> ++                return -ENOMEM;
> >>>> ++
> >>>> ++        device_unset_sysfs(d);
> >>>> ++
> >>>> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
> >>>> ++        LIST_PREPEND(same_sysfs, first, d);
> >>>> ++
> >>>> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
> >>>> ++        if (r < 0) {
> >>>> ++                LIST_REMOVE(same_sysfs, first, d);
> >>>> ++                free(copy);
> >>>> ++                return r;
> >>>> ++        }
> >>>> ++
> >>>> ++        d->sysfs = copy;
> >>>> ++
> >>>> ++        return 0;
> >>>> ++}
> >>>> ++
> >>>> + static void device_init(Unit *u) {
> >>>> +         Device *d = DEVICE(u);
> >>>> +
> >>>> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
> >>>> +         assert(d);
> >>>> +         assert(d->state == DEVICE_DEAD);
> >>>> +
> >>>> +-        if (d->sysfs)
> >>>> ++        if (d->found & DEVICE_FOUND_UDEV)
> >>>> ++                /* If udev says the device is around, it's around */
> >>>> +                 device_set_state(d, DEVICE_PLUGGED);
> >>>> ++        else if (d->found != DEVICE_NOT_FOUND)
> >>>> ++                /* If a device is found in /proc/self/mountinfo or
> >>>> ++                 * /proc/swaps, it's "tentatively" around. */
> >>>> ++                device_set_state(d, DEVICE_TENTATIVE);
> >>>> +
> >>>> +         return 0;
> >>>> + }
> >>>> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
> >>>> +         return device_state_to_string(DEVICE(u)->state);
> >>>> + }
> >>>> +
> >>>> +-static int device_add_escaped_name(Unit *u, const char *dn) {
> >>>> +-        _cleanup_free_ char *e = NULL;
> >>>> +-        int r;
> >>>> +-
> >>>> +-        assert(u);
> >>>> +-        assert(dn);
> >>>> +-        assert(dn[0] == '/');
> >>>> +-
> >>>> +-        e = unit_name_from_path(dn, ".device");
> >>>> +-        if (!e)
> >>>> +-                return -ENOMEM;
> >>>> +-
> >>>> +-        r = unit_add_name(u, e);
> >>>> +-        if (r < 0 && r != -EEXIST)
> >>>> +-                return r;
> >>>> +-
> >>>> +-        return 0;
> >>>> +-}
> >>>> +-
> >>>> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
> >>>> +-        _cleanup_free_ char *e = NULL;
> >>>> +-        Unit *u;
> >>>> +-
> >>>> +-        assert(m);
> >>>> +-        assert(dn);
> >>>> +-        assert(dn[0] == '/');
> >>>> +-        assert(_u);
> >>>> +-
> >>>> +-        e = unit_name_from_path(dn, ".device");
> >>>> +-        if (!e)
> >>>> +-                return -ENOMEM;
> >>>> +-
> >>>> +-        u = manager_get_unit(m, e);
> >>>> +-        if (u) {
> >>>> +-                *_u = u;
> >>>> +-                return 1;
> >>>> +-        }
> >>>> +-
> >>>> +-        return 0;
> >>>> +-}
> >>>> +-
> >>>> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
> >>>> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
> >>>> +         const char *model;
> >>>> ++        int r;
> >>>> +
> >>>> +         assert(u);
> >>>> +         assert(dev);
> >>>> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
> >>>> +
> >>>> +                         j = strjoin(model, " ", label, NULL);
> >>>> +                         if (j)
> >>>> +-                                return unit_set_description(u, j);
> >>>> +-                }
> >>>> ++                                r = unit_set_description(u, j);
> >>>> ++                } else
> >>>> ++                        r = unit_set_description(u, model);
> >>>> ++        } else
> >>>> ++                r = unit_set_description(u, path);
> >>>> +
> >>>> +-                return unit_set_description(u, model);
> >>>> +-        }
> >>>> ++        if (r < 0)
> >>>> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
> >>>> +
> >>>> +-        return unit_set_description(u, path);
> >>>> ++        return r;
> >>>> + }
> >>>> +
> >>>> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> >>>> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> >>>> +
> >>>> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
> >>>> +                 if (!n)
> >>>> +-                        return -ENOMEM;
> >>>> ++                        return log_oom();
> >>>> +
> >>>> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
> >>>> +                 if (r < 0)
> >>>> +-                        return r;
> >>>> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
> >>>> +         }
> >>>> +         if (!isempty(state))
> >>>> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
> >>>> +-                                 property, strna(udev_device_get_syspath(dev)));
> >>>> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
> >>>> +
> >>>> +         return 0;
> >>>> + }
> >>>> +
> >>>> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> >>>> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> >>>> ++        _cleanup_free_ char *e = NULL;
> >>>> +         const char *sysfs;
> >>>> +         Unit *u = NULL;
> >>>> +         bool delete;
> >>>> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >>>> +         if (!sysfs)
> >>>> +                 return 0;
> >>>> +
> >>>> +-        r = device_find_escape_name(m, path, &u);
> >>>> +-        if (r < 0)
> >>>> +-                return r;
> >>>> ++        e = unit_name_from_path(path, ".device");
> >>>> ++        if (!e)
> >>>> ++                return log_oom();
> >>>> ++
> >>>> ++        u = manager_get_unit(m, e);
> >>>> +
> >>>> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
> >>>> ++        if (u &&
> >>>> ++            DEVICE(u)->sysfs &&
> >>>> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
> >>>> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
> >>>> +                 return -EEXIST;
> >>>> ++        }
> >>>> +
> >>>> +         if (!u) {
> >>>> +                 delete = true;
> >>>> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >>>> +                 if (!u)
> >>>> +                         return log_oom();
> >>>> +
> >>>> +-                r = device_add_escaped_name(u, path);
> >>>> ++                r = unit_add_name(u, e);
> >>>> +                 if (r < 0)
> >>>> +                         goto fail;
> >>>> +
> >>>> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >>>> +          * actually been seen yet ->sysfs will not be
> >>>> +          * initialized. Hence initialize it if necessary. */
> >>>> +
> >>>> +-        if (!DEVICE(u)->sysfs) {
> >>>> +-                Device *first;
> >>>> +-
> >>>> +-                DEVICE(u)->sysfs = strdup(sysfs);
> >>>> +-                if (!DEVICE(u)->sysfs) {
> >>>> +-                        r = -ENOMEM;
> >>>> +-                        goto fail;
> >>>> +-                }
> >>>> +-
> >>>> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
> >>>> +-                if (r < 0)
> >>>> +-                        goto fail;
> >>>> +-
> >>>> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
> >>>> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
> >>>> +-
> >>>> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
> >>>> +-                if (r < 0)
> >>>> +-                        goto fail;
> >>>> +-        }
> >>>> +-
> >>>> +-        device_make_description(u, dev, path);
> >>>> ++        r = device_set_sysfs(DEVICE(u), sysfs);
> >>>> ++        if (r < 0)
> >>>> ++                goto fail;
> >>>> +
> >>>> +-        if (main) {
> >>>> +-                /* The additional systemd udev properties we only
> >>>> +-                 * interpret for the main object */
> >>>> ++        (void) device_update_description(u, dev, path);
> >>>> +
> >>>> +-                r = device_add_udev_wants(u, dev);
> >>>> +-                if (r < 0)
> >>>> +-                        goto fail;
> >>>> +-        }
> >>>> ++        /* The additional systemd udev properties we only interpret
> >>>> ++         * for the main object */
> >>>> ++        if (main)
> >>>> ++                (void) device_add_udev_wants(u, dev);
> >>>> +
> >>>> +         /* Note that this won't dispatch the load queue, the caller
> >>>> +          * has to do that if needed and appropriate */
> >>>> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >>>> +         return 0;
> >>>> +
> >>>> + fail:
> >>>> +-        log_warning_errno(r, "Failed to load device unit: %m");
> >>>> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
> >>>> +
> >>>> +         if (delete && u)
> >>>> +                 unit_free(u);
> >>>> +@@ -342,7 +331,7 @@ fail:
> >>>> +         return r;
> >>>> + }
> >>>> +
> >>>> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >>>> ++static int device_process_new(Manager *m, struct udev_device *dev) {
> >>>> +         const char *sysfs, *dn, *alias;
> >>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> >>>> +         int r;
> >>>> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >>>> +                 return 0;
> >>>> +
> >>>> +         /* Add the main unit named after the sysfs path */
> >>>> +-        r = device_update_unit(m, dev, sysfs, true);
> >>>> ++        r = device_setup_unit(m, dev, sysfs, true);
> >>>> +         if (r < 0)
> >>>> +                 return r;
> >>>> +
> >>>> +         /* Add an additional unit for the device node */
> >>>> +         dn = udev_device_get_devnode(dev);
> >>>> +         if (dn)
> >>>> +-                device_update_unit(m, dev, dn, false);
> >>>> ++                (void) device_setup_unit(m, dev, dn, false);
> >>>> +
> >>>> +         /* Add additional units for all symlinks */
> >>>> +         first = udev_device_get_devlinks_list_entry(dev);
> >>>> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >>>> +                             st.st_rdev != udev_device_get_devnum(dev))
> >>>> +                                 continue;
> >>>> +
> >>>> +-                device_update_unit(m, dev, p, false);
> >>>> ++                (void) device_setup_unit(m, dev, p, false);
> >>>> +         }
> >>>> +
> >>>> +         /* Add additional units for all explicitly configured
> >>>> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >>>> +                         e[l] = 0;
> >>>> +
> >>>> +                         if (path_is_absolute(e))
> >>>> +-                                device_update_unit(m, dev, e, false);
> >>>> ++                                (void) device_setup_unit(m, dev, e, false);
> >>>> +                         else
> >>>> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
> >>>> +                 }
> >>>> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >>>> +         return 0;
> >>>> + }
> >>>> +
> >>>> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
> >>>> +-        const char *sysfs;
> >>>> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
> >>>> ++        DeviceFound n;
> >>>> ++
> >>>> ++        assert(d);
> >>>> ++
> >>>> ++        n = add ? (d->found | found) : (d->found & ~found);
> >>>> ++        if (n == d->found)
> >>>> ++                return;
> >>>> ++
> >>>> ++        d->found = n;
> >>>> ++
> >>>> ++        if (now) {
> >>>> ++                if (d->found & DEVICE_FOUND_UDEV)
> >>>> ++                        device_set_state(d, DEVICE_PLUGGED);
> >>>> ++                else if (d->found != DEVICE_NOT_FOUND)
> >>>> ++                        device_set_state(d, DEVICE_TENTATIVE);
> >>>> ++                else
> >>>> ++                        device_set_state(d, DEVICE_DEAD);
> >>>> ++        }
> >>>> ++}
> >>>> ++
> >>>> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
> >>>> +         Device *d, *l;
> >>>> +
> >>>> +         assert(m);
> >>>> +-        assert(dev);
> >>>> ++        assert(sysfs);
> >>>> +
> >>>> +-        sysfs = udev_device_get_syspath(dev);
> >>>> +-        if (!sysfs)
> >>>> +-                return;
> >>>> ++        if (found == DEVICE_NOT_FOUND)
> >>>> ++                return 0;
> >>>> +
> >>>> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
> >>>> +         LIST_FOREACH(same_sysfs, d, l)
> >>>> +-                device_set_state(d, DEVICE_PLUGGED);
> >>>> ++                device_update_found_one(d, add, found, now);
> >>>> ++
> >>>> ++        return 0;
> >>>> + }
> >>>> +
> >>>> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
> >>>> +-        const char *sysfs;
> >>>> +-        Device *d;
> >>>> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
> >>>> ++        _cleanup_free_ char *e = NULL;
> >>>> ++        Unit *u;
> >>>> +
> >>>> +         assert(m);
> >>>> +-        assert(dev);
> >>>> ++        assert(path);
> >>>> +
> >>>> +-        sysfs = udev_device_get_syspath(dev);
> >>>> +-        if (!sysfs)
> >>>> +-                return -ENOMEM;
> >>>> ++        if (found == DEVICE_NOT_FOUND)
> >>>> ++                return 0;
> >>>> +
> >>>> +-        /* Remove all units of this sysfs path */
> >>>> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
> >>>> +-                device_unset_sysfs(d);
> >>>> +-                device_set_state(d, DEVICE_DEAD);
> >>>> +-        }
> >>>> ++        e = unit_name_from_path(path, ".device");
> >>>> ++        if (!e)
> >>>> ++                return log_oom();
> >>>> +
> >>>> ++        u = manager_get_unit(m, e);
> >>>> ++        if (!u)
> >>>> ++                return 0;
> >>>> ++
> >>>> ++        device_update_found_one(DEVICE(u), add, found, now);
> >>>> +         return 0;
> >>>> + }
> >>>> +
> >>>> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
> >>>> +         return parse_boolean(ready) != 0;
> >>>> + }
> >>>> +
> >>>> +-static int device_process_new_path(Manager *m, const char *path) {
> >>>> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >>>> +-
> >>>> +-        assert(m);
> >>>> +-        assert(path);
> >>>> +-
> >>>> +-        dev = udev_device_new_from_syspath(m->udev, path);
> >>>> +-        if (!dev)
> >>>> +-                return log_oom();
> >>>> +-
> >>>> +-        if (!device_is_ready(dev))
> >>>> +-                return 0;
> >>>> +-
> >>>> +-        return device_process_new_device(m, dev);
> >>>> +-}
> >>>> +-
> >>>> + static Unit *device_following(Unit *u) {
> >>>> +         Device *d = DEVICE(u);
> >>>> +         Device *other, *first = NULL;
> >>>> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
> >>>> +                 goto fail;
> >>>> +
> >>>> +         first = udev_enumerate_get_list_entry(e);
> >>>> +-        udev_list_entry_foreach(item, first)
> >>>> +-                device_process_new_path(m, udev_list_entry_get_name(item));
> >>>> ++        udev_list_entry_foreach(item, first) {
> >>>> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >>>> ++                const char *sysfs;
> >>>> ++
> >>>> ++                sysfs = udev_list_entry_get_name(item);
> >>>> ++
> >>>> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
> >>>> ++                if (!dev) {
> >>>> ++                        log_oom();
> >>>> ++                        continue;
> >>>> ++                }
> >>>> ++
> >>>> ++                if (!device_is_ready(dev))
> >>>> ++                        continue;
> >>>> ++
> >>>> ++                (void) device_process_new(m, dev);
> >>>> ++
> >>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
> >>>> ++        }
> >>>> +
> >>>> +         return 0;
> >>>> +
> >>>> + fail:
> >>>> ++        log_error_errno(r, "Failed to enumerate devices: %m");
> >>>> ++
> >>>> +         device_shutdown(m);
> >>>> +         return r;
> >>>> + }
> >>>> +@@ -619,7 +634,7 @@ fail:
> >>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
> >>>> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >>>> +         Manager *m = userdata;
> >>>> +-        const char *action;
> >>>> ++        const char *action, *sysfs;
> >>>> +         int r;
> >>>> +
> >>>> +         assert(m);
> >>>> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> >>>> +         if (!dev)
> >>>> +                 return 0;
> >>>> +
> >>>> ++        sysfs = udev_device_get_syspath(dev);
> >>>> ++        if (!sysfs) {
> >>>> ++                log_error("Failed to get udev sys path.");
> >>>> ++                return 0;
> >>>> ++        }
> >>>> ++
> >>>> +         action = udev_device_get_action(dev);
> >>>> +         if (!action) {
> >>>> +                 log_error("Failed to get udev action string.");
> >>>> +                 return 0;
> >>>> +         }
> >>>> +
> >>>> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
> >>>> +-                r = device_process_removed_device(m, dev);
> >>>> +-                if (r < 0)
> >>>> +-                        log_error_errno(r, "Failed to process device remove event: %m");
> >>>> +-
> >>>> +-                r = swap_process_removed_device(m, dev);
> >>>> ++        if (streq(action, "remove"))  {
> >>>> ++                r = swap_process_device_remove(m, dev);
> >>>> +                 if (r < 0)
> >>>> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
> >>>> +
> >>>> +-        } else {
> >>>> +-                r = device_process_new_device(m, dev);
> >>>> +-                if (r < 0)
> >>>> +-                        log_error_errno(r, "Failed to process device new event: %m");
> >>>> ++                /* If we get notified that a device was removed by
> >>>> ++                 * udev, then it's completely gone, hence unset all
> >>>> ++                 * found bits */
> >>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
> >>>> +
> >>>> +-                r = swap_process_new_device(m, dev);
> >>>> ++        } else if (device_is_ready(dev)) {
> >>>> ++
> >>>> ++                (void) device_process_new(m, dev);
> >>>> ++
> >>>> ++                r = swap_process_device_new(m, dev);
> >>>> +                 if (r < 0)
> >>>> +                         log_error_errno(r, "Failed to process swap device new event: %m");
> >>>> +
> >>>> +                 manager_dispatch_load_queue(m);
> >>>> +
> >>>> +-                device_set_path_plugged(m, dev);
> >>>> ++                /* The device is found now, set the udev found bit */
> >>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
> >>>> ++
> >>>> ++        } else {
> >>>> ++                /* The device is nominally around, but not ready for
> >>>> ++                 * us. Hence unset the udev bit, but leave the rest
> >>>> ++                 * around. */
> >>>> ++
> >>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
> >>>> +         }
> >>>> +
> >>>> +         return 0;
> >>>> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
> >>>> +         return read_only <= 0;
> >>>> + }
> >>>> +
> >>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
> >>>> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >>>> ++        struct stat st;
> >>>> ++
> >>>> ++        assert(m);
> >>>> ++        assert(node);
> >>>> ++
> >>>> ++        /* This is called whenever we find a device referenced in
> >>>> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
> >>>> ++         * mounted/enabled at a time where udev has not finished
> >>>> ++         * probing it yet, and we thus haven't learned about it
> >>>> ++         * yet. In this case we will set the device unit to
> >>>> ++         * "tentative" state. */
> >>>> ++
> >>>> ++        if (add) {
> >>>> ++                if (!path_startswith(node, "/dev"))
> >>>> ++                        return 0;
> >>>> ++
> >>>> ++                if (stat(node, &st) < 0) {
> >>>> ++                        if (errno == ENOENT)
> >>>> ++                                return 0;
> >>>> ++
> >>>> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
> >>>> ++                }
> >>>> ++
> >>>> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
> >>>> ++                        return 0;
> >>>> ++
> >>>> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
> >>>> ++                if (!dev) {
> >>>> ++                        if (errno == ENOENT)
> >>>> ++                                return 0;
> >>>> ++
> >>>> ++                        return log_oom();
> >>>> ++                }
> >>>> ++
> >>>> ++                /* If the device is known in the kernel and newly
> >>>> ++                 * appeared, then we'll create a device unit for it,
> >>>> ++                 * under the name referenced in /proc/swaps or
> >>>> ++                 * /proc/self/mountinfo. */
> >>>> ++
> >>>> ++                (void) device_setup_unit(m, dev, node, false);
> >>>> ++        }
> >>>> ++
> >>>> ++        /* Update the device unit's state, should it exist */
> >>>> ++        return device_update_found_by_name(m, node, add, found, now);
> >>>> ++}
> >>>> ++
> >>>> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
> >>>> +         [DEVICE_DEAD] = "dead",
> >>>> +-        [DEVICE_PLUGGED] = "plugged"
> >>>> ++        [DEVICE_TENTATIVE] = "tentative",
> >>>> ++        [DEVICE_PLUGGED] = "plugged",
> >>>> + };
> >>>> +
> >>>> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
> >>>> +diff --git a/src/core/device.h b/src/core/device.h
> >>>> +index bb7ae07..0609b20 100644
> >>>> +--- a/src/core/device.h
> >>>> ++++ b/src/core/device.h
> >>>> +@@ -29,20 +29,28 @@ typedef struct Device Device;
> >>>> +  * simplifies the state engine greatly */
> >>>> + typedef enum DeviceState {
> >>>> +         DEVICE_DEAD,
> >>>> +-        DEVICE_PLUGGED,
> >>>> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
> >>>> ++        DEVICE_PLUGGED,   /* announced by udev */
> >>>> +         _DEVICE_STATE_MAX,
> >>>> +         _DEVICE_STATE_INVALID = -1
> >>>> + } DeviceState;
> >>>> +
> >>>> ++typedef enum DeviceFound {
> >>>> ++        DEVICE_NOT_FOUND = 0,
> >>>> ++        DEVICE_FOUND_UDEV = 1,
> >>>> ++        DEVICE_FOUND_MOUNT = 2,
> >>>> ++        DEVICE_FOUND_SWAP = 4,
> >>>> ++} DeviceFound;
> >>>> ++
> >>>> + struct Device {
> >>>> +         Unit meta;
> >>>> +
> >>>> +         char *sysfs;
> >>>> ++        DeviceFound found;
> >>>> +
> >>>> +         /* In order to be able to distinguish dependencies on
> >>>> +         different device nodes we might end up creating multiple
> >>>> +         devices for the same sysfs path. We chain them up here. */
> >>>> +-
> >>>> +         LIST_FIELDS(struct Device, same_sysfs);
> >>>> +
> >>>> +         DeviceState state;
> >>>> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
> >>>> +
> >>>> + const char* device_state_to_string(DeviceState i) _const_;
> >>>> + DeviceState device_state_from_string(const char *s) _pure_;
> >>>> ++
> >>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
> >>>> +diff --git a/src/core/mount.c b/src/core/mount.c
> >>>> +index f3977e6..c971330 100644
> >>>> +--- a/src/core/mount.c
> >>>> ++++ b/src/core/mount.c
> >>>> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
> >>>> +         return 0;
> >>>> + }
> >>>> +
> >>>> +-static int mount_add_one(
> >>>> ++static int mount_setup_unit(
> >>>> +                 Manager *m,
> >>>> +                 const char *what,
> >>>> +                 const char *where,
> >>>> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
> >>>> +
> >>>> +                 u = unit_new(m, sizeof(Mount));
> >>>> +                 if (!u)
> >>>> +-                        return -ENOMEM;
> >>>> ++                        return log_oom();
> >>>> +
> >>>> +                 r = unit_add_name(u, e);
> >>>> +                 if (r < 0)
> >>>> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
> >>>> +         return 0;
> >>>> +
> >>>> + fail:
> >>>> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
> >>>> ++
> >>>> +         if (delete && u)
> >>>> +                 unit_free(u);
> >>>> +
> >>>> +@@ -1554,33 +1556,36 @@ fail:
> >>>> + }
> >>>> +
> >>>> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> >>>> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
> >>>> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
> >>>> +-        struct libmnt_fs *fs;
> >>>> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
> >>>> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
> >>>> +         int r = 0;
> >>>> +
> >>>> +         assert(m);
> >>>> +
> >>>> +-        tb = mnt_new_table();
> >>>> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
> >>>> +-        if (!tb || !itr)
> >>>> ++        t = mnt_new_table();
> >>>> ++        if (!t)
> >>>> +                 return log_oom();
> >>>> +
> >>>> +-        r = mnt_table_parse_mtab(tb, NULL);
> >>>> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
> >>>> ++        if (!i)
> >>>> ++                return log_oom();
> >>>> ++
> >>>> ++        r = mnt_table_parse_mtab(t, NULL);
> >>>> +         if (r < 0)
> >>>> +-                return r;
> >>>> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
> >>>> +
> >>>> +         r = 0;
> >>>> +         for (;;) {
> >>>> +                 const char *device, *path, *options, *fstype;
> >>>> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
> >>>> ++                struct libmnt_fs *fs;
> >>>> +                 int k;
> >>>> +
> >>>> +-                k = mnt_table_next_fs(tb, itr, &fs);
> >>>> ++                k = mnt_table_next_fs(t, i, &fs);
> >>>> +                 if (k == 1)
> >>>> +                         break;
> >>>> +-                else if (k < 0)
> >>>> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
> >>>> ++                if (k < 0)
> >>>> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
> >>>> +
> >>>> +                 device = mnt_fs_get_source(fs);
> >>>> +                 path = mnt_fs_get_target(fs);
> >>>> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> >>>> +                 fstype = mnt_fs_get_fstype(fs);
> >>>> +
> >>>> +                 d = cunescape(device);
> >>>> ++                if (!d)
> >>>> ++                        return log_oom();
> >>>> ++
> >>>> +                 p = cunescape(path);
> >>>> +-                if (!d || !p)
> >>>> ++                if (!p)
> >>>> +                         return log_oom();
> >>>> +
> >>>> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
> >>>> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
> >>>> ++
> >>>> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
> >>>> +                 if (r == 0 && k < 0)
> >>>> +                         r = k;
> >>>> +         }
> >>>> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> >>>> +
> >>>> +         r = mount_load_proc_self_mountinfo(m, true);
> >>>> +         if (r < 0) {
> >>>> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
> >>>> +-
> >>>> +                 /* Reset flags, just in case, for later calls */
> >>>> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
> >>>> +                         Mount *mount = MOUNT(u);
> >>>> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> >>>> +                                 break;
> >>>> +                         }
> >>>> +
> >>>> ++                        if (mount->parameters_proc_self_mountinfo.what)
> >>>> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
> >>>> ++
> >>>> ++
> >>>> +                 } else if (mount->just_mounted || mount->just_changed) {
> >>>> +
> >>>> +                         /* New or changed mount entry */
> >>>> +diff --git a/src/core/swap.c b/src/core/swap.c
> >>>> +index 6997921..5c19af5 100644
> >>>> +--- a/src/core/swap.c
> >>>> ++++ b/src/core/swap.c
> >>>> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
> >>>> +         return swap_verify(s);
> >>>> + }
> >>>> +
> >>>> +-static int swap_add_one(
> >>>> ++static int swap_setup_unit(
> >>>> +                 Manager *m,
> >>>> +                 const char *what,
> >>>> +                 const char *what_proc_swaps,
> >>>> +@@ -363,8 +363,10 @@ static int swap_add_one(
> >>>> +
> >>>> +         if (u &&
> >>>> +             SWAP(u)->from_proc_swaps &&
> >>>> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
> >>>> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
> >>>> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
> >>>> +                 return -EEXIST;
> >>>> ++        }
> >>>> +
> >>>> +         if (!u) {
> >>>> +                 delete = true;
> >>>> +@@ -379,7 +381,7 @@ static int swap_add_one(
> >>>> +
> >>>> +                 SWAP(u)->what = strdup(what);
> >>>> +                 if (!SWAP(u)->what) {
> >>>> +-                        r = log_oom();
> >>>> ++                        r = -ENOMEM;
> >>>> +                         goto fail;
> >>>> +                 }
> >>>> +
> >>>> +@@ -407,7 +409,6 @@ static int swap_add_one(
> >>>> +         p->priority = priority;
> >>>> +
> >>>> +         unit_add_to_dbus_queue(u);
> >>>> +-
> >>>> +         return 0;
> >>>> +
> >>>> + fail:
> >>>> +@@ -419,7 +420,7 @@ fail:
> >>>> +         return r;
> >>>> + }
> >>>> +
> >>>> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
> >>>> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
> >>>> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
> >>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> >>>> +         const char *dn;
> >>>> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> >>>> +
> >>>> +         assert(m);
> >>>> +
> >>>> +-        r = swap_add_one(m, device, device, prio, set_flags);
> >>>> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
> >>>> +         if (r < 0)
> >>>> +                 return r;
> >>>> +
> >>>> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> >>>> +         /* Add the main device node */
> >>>> +         dn = udev_device_get_devnode(d);
> >>>> +         if (dn && !streq(dn, device))
> >>>> +-                swap_add_one(m, dn, device, prio, set_flags);
> >>>> ++                swap_setup_unit(m, dn, device, prio, set_flags);
> >>>> +
> >>>> +         /* Add additional units for all symlinks */
> >>>> +         first = udev_device_get_devlinks_list_entry(d);
> >>>> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> >>>> +                             st.st_rdev != udev_device_get_devnum(d))
> >>>> +                                 continue;
> >>>> +
> >>>> +-                swap_add_one(m, p, device, prio, set_flags);
> >>>> ++                swap_setup_unit(m, p, device, prio, set_flags);
> >>>> +         }
> >>>> +
> >>>> +         return r;
> >>>> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
> >>>> +                         if (k == EOF)
> >>>> +                                 break;
> >>>> +
> >>>> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
> >>>> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
> >>>> +                         continue;
> >>>> +                 }
> >>>> +
> >>>> +                 d = cunescape(dev);
> >>>> +                 if (!d)
> >>>> +-                        return -ENOMEM;
> >>>> ++                        return log_oom();
> >>>> ++
> >>>> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
> >>>> +
> >>>> +-                k = swap_process_new_swap(m, d, prio, set_flags);
> >>>> ++                k = swap_process_new(m, d, prio, set_flags);
> >>>> +                 if (k < 0)
> >>>> +                         r = k;
> >>>> +         }
> >>>> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
> >>>> +                                 break;
> >>>> +                         }
> >>>> +
> >>>> ++                        if (swap->what)
> >>>> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
> >>>> ++
> >>>> +                 } else if (swap->just_activated) {
> >>>> +
> >>>> +                         /* New swap entry */
> >>>> +@@ -1298,7 +1304,7 @@ fail:
> >>>> +         return r;
> >>>> + }
> >>>> +
> >>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
> >>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
> >>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> >>>> +         _cleanup_free_ char *e = NULL;
> >>>> +         const char *dn;
> >>>> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
> >>>> +         return r;
> >>>> + }
> >>>> +
> >>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
> >>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
> >>>> +         const char *dn;
> >>>> +         int r = 0;
> >>>> +         Swap *s;
> >>>> +diff --git a/src/core/swap.h b/src/core/swap.h
> >>>> +index 73e64d8..914a2db 100644
> >>>> +--- a/src/core/swap.h
> >>>> ++++ b/src/core/swap.h
> >>>> +@@ -116,8 +116,8 @@ struct Swap {
> >>>> +
> >>>> + extern const UnitVTable swap_vtable;
> >>>> +
> >>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
> >>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
> >>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
> >>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
> >>>> +
> >>>> + const char* swap_state_to_string(SwapState i) _const_;
> >>>> + SwapState swap_state_from_string(const char *s) _pure_;
> >>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> >>>> +index 563f6fe..a6558ee 100644
> >>>> +--- a/src/core/unit.c
> >>>> ++++ b/src/core/unit.c
> >>>> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> >>>> +                 return -ENOMEM;
> >>>> +
> >>>> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
> >>>> +-
> >>>> +         if (r < 0)
> >>>> +                 return r;
> >>>> +
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> >>>> new file mode 100644
> >>>> index 0000000..d614085
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> >>>> @@ -0,0 +1,26 @@
> >>>> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
> >>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> >>>> +Date: Sat, 28 Feb 2015 23:39:55 +0100
> >>>> +Subject: [PATCH 18/26] core: fix return value on OOM
> >>>> +
> >>>> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
> >>>> +---
> >>>> + src/core/device.c | 2 ++
> >>>> + 1 file changed, 2 insertions(+)
> >>>> +
> >>>> +diff --git a/src/core/device.c b/src/core/device.c
> >>>> +index 75b9a46..1cc103c 100644
> >>>> +--- a/src/core/device.c
> >>>> ++++ b/src/core/device.c
> >>>> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
> >>>> +                         j = strjoin(model, " ", label, NULL);
> >>>> +                         if (j)
> >>>> +                                 r = unit_set_description(u, j);
> >>>> ++                        else
> >>>> ++                                r = -ENOMEM;
> >>>> +                 } else
> >>>> +                         r = unit_set_description(u, model);
> >>>> +         } else
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> >>>> new file mode 100644
> >>>> index 0000000..d94da60
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> >>>> @@ -0,0 +1,33 @@
> >>>> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
> >>>> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
> >>>> +Date: Thu, 19 Feb 2015 20:47:28 +0100
> >>>> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
> >>>> + bus on dbus1
> >>>> +
> >>>> +This fixes "machinectl login" on systems configured with --disable-kdbus.
> >>>> +
> >>>> +The error was:
> >>>> +machinectl login foo
> >>>> +Failed to get machine PTY: Input/output error
> >>>> +
> >>>> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
> >>>> +---
> >>>> + src/machine/machine-dbus.c | 2 +-
> >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
> >>>> +index b46f0a8..b0f0f66 100644
> >>>> +--- a/src/machine/machine-dbus.c
> >>>> ++++ b/src/machine/machine-dbus.c
> >>>> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
> >>>> + #ifdef ENABLE_KDBUS
> >>>> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
> >>>> + #else
> >>>> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
> >>>> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
> >>>> + #endif
> >>>> +         if (!container_bus->address)
> >>>> +                 return -ENOMEM;
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> >>>> new file mode 100644
> >>>> index 0000000..fcc2adf
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> >>>> @@ -0,0 +1,25 @@
> >>>> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
> >>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> >>>> +Date: Fri, 20 Feb 2015 15:35:11 -0300
> >>>> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
> >>>> +
> >>>> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
> >>>> +---
> >>>> + src/shared/util.c | 1 +
> >>>> + 1 file changed, 1 insertion(+)
> >>>> +
> >>>> +diff --git a/src/shared/util.c b/src/shared/util.c
> >>>> +index ba035ca..f24b5b4 100644
> >>>> +--- a/src/shared/util.c
> >>>> ++++ b/src/shared/util.c
> >>>> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
> >>>> +
> >>>> + bool fstype_is_network(const char *fstype) {
> >>>> +         static const char table[] =
> >>>> ++                "afs\0"
> >>>> +                 "cifs\0"
> >>>> +                 "smbfs\0"
> >>>> +                 "sshfs\0"
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> >>>> new file mode 100644
> >>>> index 0000000..02e279d
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> >>>> @@ -0,0 +1,31 @@
> >>>> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
> >>>> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
> >>>> +Date: Fri, 20 Feb 2015 10:53:28 +0100
> >>>> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
> >>>> +
> >>>> +Otherwise every daemon reload prints out warnings like:
> >>>> +
> >>>> +systemd[1]: Unit type .busname is not supported on this system.
> >>>> +systemd[1]: Unit type .swap is not supported on this system.
> >>>> +
> >>>> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
> >>>> +---
> >>>> + src/core/manager.c | 2 +-
> >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/core/manager.c b/src/core/manager.c
> >>>> +index 4775219..bc9b7ec 100644
> >>>> +--- a/src/core/manager.c
> >>>> ++++ b/src/core/manager.c
> >>>> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
> >>>> +                 int q;
> >>>> +
> >>>> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
> >>>> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> >>>> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> >>>> +                         continue;
> >>>> +                 }
> >>>> +
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> >>>> new file mode 100644
> >>>> index 0000000..f5afd09
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> >>>> @@ -0,0 +1,97 @@
> >>>> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
> >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>> +Date: Mon, 2 Mar 2015 10:34:51 -0500
> >>>> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
> >>>> +
> >>>> +Binary fields were not processed properly, and resulting journal files
> >>>> +were non-conforming, resulting in an error ("Invalid field.") when reading.
> >>>> +
> >>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
> >>>> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
> >>>> +---
> >>>> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
> >>>> + src/journal-remote/journal-remote-parse.h |  4 +++-
> >>>> + 2 files changed, 21 insertions(+), 14 deletions(-)
> >>>> +
> >>>> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
> >>>> +index d9dea8d..afded7e 100644
> >>>> +--- a/src/journal-remote/journal-remote-parse.c
> >>>> ++++ b/src/journal-remote/journal-remote-parse.c
> >>>> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
> >>>> +                    LLLLLLLL0011223344...\n
> >>>> +                 */
> >>>> +                 sep = memchr(line, '=', n);
> >>>> +-                if (sep)
> >>>> ++                if (sep) {
> >>>> +                         /* chomp newline */
> >>>> +                         n--;
> >>>> +-                else
> >>>> ++
> >>>> ++                        r = iovw_put(&source->iovw, line, n);
> >>>> ++                        if (r < 0)
> >>>> ++                                return r;
> >>>> ++                } else {
> >>>> +                         /* replace \n with = */
> >>>> +                         line[n-1] = '=';
> >>>> +-                log_trace("Received: %.*s", (int) n, line);
> >>>> +
> >>>> +-                r = iovw_put(&source->iovw, line, n);
> >>>> +-                if (r < 0) {
> >>>> +-                        log_error("Failed to put line in iovect");
> >>>> +-                        return r;
> >>>> ++                        source->field_len = n;
> >>>> ++                        source->state = STATE_DATA_START;
> >>>> ++
> >>>> ++                        /* we cannot put the field in iovec until we have all data */
> >>>> +                 }
> >>>> +
> >>>> +-                if (!sep)
> >>>> +-                        source->state = STATE_DATA_START;
> >>>> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
> >>>> ++
> >>>> +                 return 0; /* continue */
> >>>> +         }
> >>>> +
> >>>> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
> >>>> +
> >>>> +         case STATE_DATA: {
> >>>> +                 void *data;
> >>>> ++                char *field;
> >>>> +
> >>>> +                 assert(source->data_size > 0);
> >>>> +
> >>>> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
> >>>> +
> >>>> +                 assert(data);
> >>>> +
> >>>> +-                r = iovw_put(&source->iovw, data, source->data_size);
> >>>> +-                if (r < 0) {
> >>>> +-                        log_error("failed to put binary buffer in iovect");
> >>>> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
> >>>> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
> >>>> ++
> >>>> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
> >>>> ++                if (r < 0)
> >>>> +                         return r;
> >>>> +-                }
> >>>> +
> >>>> +                 source->state = STATE_DATA_FINISH;
> >>>> +
> >>>> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
> >>>> +index 8499f4e..22db550 100644
> >>>> +--- a/src/journal-remote/journal-remote-parse.h
> >>>> ++++ b/src/journal-remote/journal-remote-parse.h
> >>>> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
> >>>> +         size_t offset;     /* offset to the beginning of live data in the buffer */
> >>>> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
> >>>> +         size_t filled;     /* total number of bytes in the buffer */
> >>>> +-        size_t data_size;  /* size of the binary data chunk being processed */
> >>>> ++
> >>>> ++        size_t field_len;  /* used for binary fields: the field name length */
> >>>> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
> >>>> +
> >>>> +         struct iovec_wrapper iovw;
> >>>> +
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> >>>> new file mode 100644
> >>>> index 0000000..79e565b
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> >>>> @@ -0,0 +1,37 @@
> >>>> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
> >>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> >>>> +Date: Sun, 1 Mar 2015 21:13:10 -0300
> >>>> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
> >>>> +
> >>>> +Logs constantly show
> >>>> +
> >>>> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
> >>>> +
> >>>> +This is because ext4 does not support FS_NOCOW_FL.
> >>>> +
> >>>> +[zj: fold into one conditional as suggested on the ML and
> >>>> +     fix (preexisting) r/errno confusion in error message.]
> >>>> +
> >>>> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
> >>>> +---
> >>>> + src/journal/journal-file.c | 4 ++--
> >>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
> >>>> +
> >>>> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
> >>>> +index 2845e05..0f28718 100644
> >>>> +--- a/src/journal/journal-file.c
> >>>> ++++ b/src/journal/journal-file.c
> >>>> +@@ -2611,8 +2611,8 @@ int journal_file_open(
> >>>> +                  * shouldn't be too bad, given that we do our own
> >>>> +                  * checksumming). */
> >>>> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
> >>>> +-                if (r < 0)
> >>>> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
> >>>> ++                if (r < 0 && r != -ENOTTY)
> >>>> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
> >>>> +
> >>>> +                 /* Let's attach the creation time to the journal file,
> >>>> +                  * so that the vacuuming code knows the age of this
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> >>>> new file mode 100644
> >>>> index 0000000..0cf9a0a
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> >>>> @@ -0,0 +1,53 @@
> >>>> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
> >>>> +From: Lennart Poettering <lennart@poettering.net>
> >>>> +Date: Mon, 2 Mar 2015 20:55:38 +0100
> >>>> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
> >>>> + happy
> >>>> +
> >>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
> >>>> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
> >>>> +---
> >>>> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
> >>>> + 1 file changed, 5 insertions(+), 7 deletions(-)
> >>>> +
> >>>> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
> >>>> +index 028c2a7..22a3a53 100644
> >>>> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
> >>>> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
> >>>> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> >>>> +                 .msg_iovlen = 1,
> >>>> +                 .msg_name = &sockaddr,
> >>>> +         };
> >>>> +-        union {
> >>>> +-                struct cmsghdr cmsghdr;
> >>>> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
> >>>> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
> >>>> +-        } control;
> >>>> ++        struct cmsghdr *control;
> >>>> +         _cleanup_close_ int fd = -1;
> >>>> +         struct cmsghdr *cmsg = NULL;
> >>>> +         const char *e;
> >>>> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> >>>> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
> >>>> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
> >>>> +
> >>>> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
> >>>> ++
> >>>> +         if (n_fds > 0) {
> >>>> +-                msghdr.msg_control = &control;
> >>>> ++                msghdr.msg_control = control;
> >>>> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
> >>>> +
> >>>> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
> >>>> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> >>>> +                 try_without_ucred = true;
> >>>> +                 controllen_without_ucred = msghdr.msg_controllen;
> >>>> +
> >>>> +-                msghdr.msg_control = &control;
> >>>> ++                msghdr.msg_control = control;
> >>>> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
> >>>> +
> >>>> +                 if (cmsg)
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> >>>> new file mode 100644
> >>>> index 0000000..6912489
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> >>>> @@ -0,0 +1,84 @@
> >>>> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
> >>>> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
> >>>> +Date: Tue, 3 Mar 2015 00:35:08 +0100
> >>>> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
> >>>> + filesystems
> >>>> +
> >>>> +A warning is printed if ACLs cannot be retrieved for any reason other
> >>>> +than -ENOSYS. For -ENOSYS, debug log is printed.
> >>>> +
> >>>> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
> >>>> +---
> >>>> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
> >>>> + 1 file changed, 20 insertions(+), 16 deletions(-)
> >>>> +
> >>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> >>>> +index 88ba7e4..187997e 100644
> >>>> +--- a/src/tmpfiles/tmpfiles.c
> >>>> ++++ b/src/tmpfiles/tmpfiles.c
> >>>> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> >>>> +         int r;
> >>>> +         _cleanup_(acl_free_charpp) char *t = NULL;
> >>>> +
> >>>> ++        /* Returns 0 for success, positive error if already warned,
> >>>> ++         * negative error otherwise. */
> >>>> ++
> >>>> +         if (modify) {
> >>>> +                 r = acls_for_file(path, type, acl, &dup);
> >>>> +                 if (r < 0)
> >>>> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> >>>> +
> >>>> +         r = acl_set_file(path, type, dup);
> >>>> +         if (r < 0)
> >>>> +-                return log_error_errno(-errno,
> >>>> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
> >>>> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
> >>>> +-                                       strna(t), path);
> >>>> ++                return -log_error_errno(errno,
> >>>> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
> >>>> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
> >>>> ++                                        strna(t), path);
> >>>> ++
> >>>> +         return 0;
> >>>> + }
> >>>> + #endif
> >>>> +
> >>>> + static int path_set_acls(Item *item, const char *path) {
> >>>> ++        int r = 0;
> >>>> + #ifdef HAVE_ACL
> >>>> +-        int r;
> >>>> +-
> >>>> +         assert(item);
> >>>> +         assert(path);
> >>>> +
> >>>> +-        if (item->acl_access) {
> >>>> ++        if (item->acl_access)
> >>>> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
> >>>> +-                if (r < 0)
> >>>> +-                        return r;
> >>>> +-        }
> >>>> +
> >>>> +-        if (item->acl_default) {
> >>>> ++        if (r == 0 && item->acl_default)
> >>>> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
> >>>> +-                if (r < 0)
> >>>> +-                        return r;
> >>>> +-        }
> >>>> +-#endif
> >>>> +
> >>>> +-        return 0;
> >>>> ++        if (r > 0)
> >>>> ++                return -r; /* already warned */
> >>>> ++        else if (r == -ENOTSUP) {
> >>>> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
> >>>> ++                return 0;
> >>>> ++        } else if (r < 0)
> >>>> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
> >>>> ++#endif
> >>>> ++        return r;
> >>>> + }
> >>>> +
> >>>> + static int write_one_file(Item *i, const char *path) {
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> >>>> new file mode 100644
> >>>> index 0000000..a49a369
> >>>> --- /dev/null
> >>>> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> >>>> @@ -0,0 +1,30 @@
> >>>> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
> >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>> +Date: Tue, 3 Mar 2015 19:07:28 -0500
> >>>> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
> >>>> + missing
> >>>> +
> >>>> +On s390 (at least) /sys/class/power_supply is not present. We should
> >>>> +treat this like if this directory was empty, and not an error.
> >>>> +
> >>>> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
> >>>> +---
> >>>> + src/shared/util.c | 2 +-
> >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>> +
> >>>> +diff --git a/src/shared/util.c b/src/shared/util.c
> >>>> +index f24b5b4..8548723 100644
> >>>> +--- a/src/shared/util.c
> >>>> ++++ b/src/shared/util.c
> >>>> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
> >>>> +
> >>>> +         d = opendir("/sys/class/power_supply");
> >>>> +         if (!d)
> >>>> +-                return -errno;
> >>>> ++                return errno == ENOENT ? true : -errno;
> >>>> +
> >>>> +         for (;;) {
> >>>> +                 struct dirent *de;
> >>>> +--
> >>>> +1.9.1
> >>>> +
> >>>> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
> >>>> index 73b930e..9c20b11 100644
> >>>> --- a/meta/recipes-core/systemd/systemd_219.bb
> >>>> +++ b/meta/recipes-core/systemd/systemd_219.bb
> >>>> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> >>>>            file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
> >>>>            file://0010-Make-root-s-home-directory-configurable.patch \
> >>>>            file://0011-systemd-user-avoid-using-system-auth.patch \
> >>>> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> >>>> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> >>>>            file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
> >>>> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> >>>>            file://0014-Revert-rules-remove-firmware-loading-rules.patch \
> >>>>            file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
> >>>>            file://tmpfiles-pam.patch \
> >>>> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> >>>> 
> >>>> S = "${WORKDIR}/git"
> >>>> 
> >>>> +# Appending backport fixes released for version 219-stable
> >>>> +SRC_URI_append = "\
> >>>> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
> >>>> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
> >>>> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
> >>>> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
> >>>> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> >>>> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
> >>>> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
> >>>> +           file://0008-bootchart-fix-default-init-path.patch \
> >>>> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
> >>>> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
> >>>> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
> >>>> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
> >>>> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
> >>>> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
> >>>> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
> >>>> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
> >>>> +           file://0017-core-rework-device-state-logic.patch \
> >>>> +           file://0018-core-fix-return-value-on-OOM.patch \
> >>>> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
> >>>> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
> >>>> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
> >>>> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
> >>>> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> >>>> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
> >>>> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> >>>> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
> >>>> +           "
> >>>> +
> >>>> SRC_URI_append_libc-uclibc = "\
> >>>>             file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
> >>>>            "
> >>>> --
> >>>> 1.9.1
> >>>> 
> >>> 
> >>> 
> >>> --
> >>> _______________________________________________
> >>> Openembedded-core mailing list
> >>> Openembedded-core@lists.openembedded.org
> >>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
> >> 
> >> 
> >> 
> > 
> > 
> 




^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-04-01 21:16         ` Bottazzini, Bruno
@ 2015-04-07 13:10           ` Bottazzini, Bruno
  2015-04-07 19:33             ` Khem Raj
  0 siblings, 1 reply; 12+ messages in thread
From: Bottazzini, Bruno @ 2015-04-07 13:10 UTC (permalink / raw)
  To: Khem Raj; +Cc: Patches and discussions about the oe-core layer

Ping

> On Qua, 2015-04-01 at 14:14 -0700, Khem Raj wrote:
> > I will try it out. give me a day
> > 
> > > On Apr 1, 2015, at 2:08 PM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
> > > 
> > > Khem,
> > > 
> > > Could you verify this patch and see if this satisfies what you have
> > > pointed previously ?
> > > 
> > > Do you think this patch is ready to go to master ?
> > > 
> > > Regards,
> > > 
> > > On Ter, 2015-03-31 at 17:25 -0300, Otavio Salvador wrote:
> > >> I am not a heavy user of systemd so I prefer other people (Khem?) to
> > >> comment on this ...
> > >> 
> > >> On Tue, Mar 31, 2015 at 5:21 PM, Bottazzini, Bruno
> > >> <bruno.bottazzini@intel.com> wrote:
> > >>> Ping
> > >>> 
> > >>> On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
> > >>>> Adding patches that fix bugs for 219 version.
> > >>>> This will get the same consistency of the stable systemd 219 version.
> > >>>> 
> > >>>> More details:
> > >>>> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
> > >>>> ---
> > >>>> ...remote-fix-certificate-status-memory-leak.patch |  31 +
> > >>>> ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
> > >>>> ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
> > >>>> ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
> > >>>> ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
> > >>>> .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
> > >>>> ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
> > >>>> .../0008-bootchart-fix-default-init-path.patch     |  44 +
> > >>>> ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
> > >>>> ...0-Make-root-s-home-directory-configurable.patch |  89 +-
> > >>>> ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
> > >>>> ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
> > >>>> ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
> > >>>> ...aker-dependencies-between-mount-and-devic.patch |  33 +
> > >>>> ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
> > >>>> ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
> > >>>> ...l-add-some-hints-how-to-override-settings.patch |  39 +
> > >>>> .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
> > >>>> .../0018-core-fix-return-value-on-OOM.patch        |  26 +
> > >>>> ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
> > >>>> ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
> > >>>> ...downgrade-unit-type-not-supported-message.patch |  31 +
> > >>>> ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
> > >>>> ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
> > >>>> ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
> > >>>> ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
> > >>>> ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
> > >>>> meta/recipes-core/systemd/systemd_219.bb           |  33 +-
> > >>>> 28 files changed, 2050 insertions(+), 55 deletions(-)
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> > >>>> create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> > >>>> 
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..172bea2
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> > >>>> @@ -0,0 +1,31 @@
> > >>>> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
> > >>>> +From: Michal Schmidt <mschmidt@redhat.com>
> > >>>> +Date: Tue, 17 Feb 2015 10:33:01 +0100
> > >>>> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
> > >>>> +
> > >>>> +The output of gnutls_certificate_verification_status_print() needs to be
> > >>>> +freed.
> > >>>> +
> > >>>> +Noticed this while staring at verify_cert_authorized() to see what could
> > >>>> +possibly confuse gcc5 on armv7hl to segfault during compilation.
> > >>>> +
> > >>>> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
> > >>>> +---
> > >>>> + src/journal-remote/microhttpd-util.c | 1 +
> > >>>> + 1 file changed, 1 insertion(+)
> > >>>> +
> > >>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> > >>>> +index 34d9337..de9c6ab 100644
> > >>>> +--- a/src/journal-remote/microhttpd-util.c
> > >>>> ++++ b/src/journal-remote/microhttpd-util.c
> > >>>> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
> > >>>> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
> > >>>> +
> > >>>> +         log_info("Certificate status: %s", out.data);
> > >>>> ++        gnutls_free(out.data);
> > >>>> +
> > >>>> +         return status == 0 ? 0 : -EPERM;
> > >>>> + }
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..f615876
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> > >>>> @@ -0,0 +1,35 @@
> > >>>> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
> > >>>> +From: Michal Schmidt <mschmidt@redhat.com>
> > >>>> +Date: Tue, 17 Feb 2015 10:36:57 +0100
> > >>>> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
> > >>>> +
> > >>>> +Found by Valgrind while testing the previous memory leak fix.
> > >>>> +
> > >>>> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
> > >>>> +---
> > >>>> + src/journal-remote/microhttpd-util.c | 6 +++++-
> > >>>> + 1 file changed, 5 insertions(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> > >>>> +index de9c6ab..a95fff1 100644
> > >>>> +--- a/src/journal-remote/microhttpd-util.c
> > >>>> ++++ b/src/journal-remote/microhttpd-util.c
> > >>>> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
> > >>>> +         return 0;
> > >>>> + }
> > >>>> +
> > >>>> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
> > >>>> ++        gnutls_x509_crt_deinit(*p);
> > >>>> ++}
> > >>>> ++
> > >>>> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
> > >>>> +         const union MHD_ConnectionInfo *ci;
> > >>>> +         gnutls_session_t session;
> > >>>> +-        gnutls_x509_crt_t client_cert;
> > >>>> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
> > >>>> +         _cleanup_free_ char *buf = NULL;
> > >>>> +         int r;
> > >>>> +
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..15fa98c
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> > >>>> @@ -0,0 +1,28 @@
> > >>>> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
> > >>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
> > >>>> +Date: Tue, 17 Feb 2015 12:47:51 +0100
> > >>>> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
> > >>>> +
> > >>>> +parse_acl() returns the error instead of setting errno.
> > >>>> +
> > >>>> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
> > >>>> +---
> > >>>> + src/tmpfiles/tmpfiles.c | 2 +-
> > >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> > >>>> +index c948d4d..88ba7e4 100644
> > >>>> +--- a/src/tmpfiles/tmpfiles.c
> > >>>> ++++ b/src/tmpfiles/tmpfiles.c
> > >>>> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
> > >>>> +          * afterwards, so the mask can be added now if necessary. */
> > >>>> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
> > >>>> +         if (r < 0)
> > >>>> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
> > >>>> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
> > >>>> +                                   item->argument);
> > >>>> + #else
> > >>>> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..f43068d
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> > >>>> @@ -0,0 +1,26 @@
> > >>>> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
> > >>>> +From: Tom Gundersen <teg@jklm.no>
> > >>>> +Date: Wed, 18 Feb 2015 14:33:50 +0100
> > >>>> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
> > >>>> +
> > >>>> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
> > >>>> +---
> > >>>> + src/test/test-utf8.c | 2 +-
> > >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
> > >>>> +index befa385..346f852 100644
> > >>>> +--- a/src/test/test-utf8.c
> > >>>> ++++ b/src/test/test-utf8.c
> > >>>> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
> > >>>> +
> > >>>> + static void test_utf16_to_utf8(void) {
> > >>>> +         char *a = NULL;
> > >>>> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
> > >>>> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
> > >>>> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
> > >>>> +
> > >>>> +         a = utf16_to_utf8(utf16, 14);
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..35fe913
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> > >>>> @@ -0,0 +1,131 @@
> > >>>> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
> > >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>> +Date: Mon, 23 Feb 2015 23:19:54 -0500
> > >>>> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
> > >>>> +
> > >>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
> > >>>> +https://bugs.debian.org/778656
> > >>>> +
> > >>>> +Status quo ante can be restored with:
> > >>>> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
> > >>>> +
> > >>>> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
> > >>>> +---
> > >>>> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
> > >>>> + src/shared/acl-util.h |  4 +++
> > >>>> + 2 files changed, 81 insertions(+), 2 deletions(-)
> > >>>> +
> > >>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> > >>>> +index a4ff1ab..cbe09d7 100644
> > >>>> +--- a/src/shared/acl-util.c
> > >>>> ++++ b/src/shared/acl-util.c
> > >>>> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
> > >>>> +         return 0;
> > >>>> + }
> > >>>> +
> > >>>> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> > >>>> ++        acl_tag_t tag_a, tag_b;
> > >>>> ++
> > >>>> ++        if (acl_get_tag_type(a, &tag_a) < 0)
> > >>>> ++                return -errno;
> > >>>> ++
> > >>>> ++        if (acl_get_tag_type(b, &tag_b) < 0)
> > >>>> ++                return -errno;
> > >>>> ++
> > >>>> ++        if (tag_a != tag_b)
> > >>>> ++                return false;
> > >>>> ++
> > >>>> ++        switch (tag_a) {
> > >>>> ++        case ACL_USER_OBJ:
> > >>>> ++        case ACL_GROUP_OBJ:
> > >>>> ++        case ACL_MASK:
> > >>>> ++        case ACL_OTHER:
> > >>>> ++                /* can have only one of those */
> > >>>> ++                return true;
> > >>>> ++        case ACL_USER: {
> > >>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> > >>>> ++
> > >>>> ++                uid_a = acl_get_qualifier(a);
> > >>>> ++                if (!uid_a)
> > >>>> ++                        return -errno;
> > >>>> ++
> > >>>> ++                uid_b = acl_get_qualifier(b);
> > >>>> ++                if (!uid_b)
> > >>>> ++                        return -errno;
> > >>>> ++
> > >>>> ++                return *uid_a == *uid_b;
> > >>>> ++        }
> > >>>> ++        case ACL_GROUP: {
> > >>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> > >>>> ++
> > >>>> ++                gid_a = acl_get_qualifier(a);
> > >>>> ++                if (!gid_a)
> > >>>> ++                        return -errno;
> > >>>> ++
> > >>>> ++                gid_b = acl_get_qualifier(b);
> > >>>> ++                if (!gid_b)
> > >>>> ++                        return -errno;
> > >>>> ++
> > >>>> ++                return *gid_a == *gid_b;
> > >>>> ++        }
> > >>>> ++        default:
> > >>>> ++                assert_not_reached("Unknown acl tag type");
> > >>>> ++        }
> > >>>> ++}
> > >>>> ++
> > >>>> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
> > >>>> ++        acl_entry_t i;
> > >>>> ++        int r;
> > >>>> ++
> > >>>> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
> > >>>> ++             r > 0;
> > >>>> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
> > >>>> ++
> > >>>> ++                r = acl_entry_equal(i, entry);
> > >>>> ++                if (r < 0)
> > >>>> ++                        return r;
> > >>>> ++                if (r > 0) {
> > >>>> ++                        *out = i;
> > >>>> ++                        return 1;
> > >>>> ++                }
> > >>>> ++        }
> > >>>> ++        if (r < 0)
> > >>>> ++                return -errno;
> > >>>> ++        return 0;
> > >>>> ++}
> > >>>> ++
> > >>>> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> > >>>> +         _cleanup_(acl_freep) acl_t old;
> > >>>> +         acl_entry_t i;
> > >>>> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> > >>>> +
> > >>>> +                 acl_entry_t j;
> > >>>> +
> > >>>> +-                if (acl_create_entry(&old, &j) < 0)
> > >>>> +-                        return -errno;
> > >>>> ++                r = find_acl_entry(old, i, &j);
> > >>>> ++                if (r < 0)
> > >>>> ++                        return r;
> > >>>> ++                if (r == 0)
> > >>>> ++                        if (acl_create_entry(&old, &j) < 0)
> > >>>> ++                                return -errno;
> > >>>> +
> > >>>> +                 if (acl_copy_entry(j, i) < 0)
> > >>>> +                         return -errno;
> > >>>> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
> > >>>> +index 90e88ff..fdb9006 100644
> > >>>> +--- a/src/shared/acl-util.h
> > >>>> ++++ b/src/shared/acl-util.h
> > >>>> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
> > >>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
> > >>>> + #define acl_free_charp acl_free
> > >>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
> > >>>> ++#define acl_free_uid_tp acl_free
> > >>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
> > >>>> ++#define acl_free_gid_tp acl_free
> > >>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
> > >>>> +
> > >>>> + #endif
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..fc707bb
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> > >>>> @@ -0,0 +1,32 @@
> > >>>> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
> > >>>> +From: Daniel Mack <daniel@zonque.org>
> > >>>> +Date: Tue, 24 Feb 2015 13:26:09 +0100
> > >>>> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
> > >>>> +
> > >>>> +  CC       src/shared/libsystemd_shared_la-time-util.lo
> > >>>> +src/shared/time-util.c: In function 'parse_nsec':
> > >>>> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
> > >>>> +                 if (!*s != 0)
> > >>>> +                         ^
> > >>>> +
> > >>>> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
> > >>>> +---
> > >>>> + src/shared/time-util.c | 2 +-
> > >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
> > >>>> +index 947ac1f..1c36c57 100644
> > >>>> +--- a/src/shared/time-util.c
> > >>>> ++++ b/src/shared/time-util.c
> > >>>> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
> > >>>> +         s = startswith(p, "infinity");
> > >>>> +         if (s) {
> > >>>> +                 s += strspn(s, WHITESPACE);
> > >>>> +-                if (!*s != 0)
> > >>>> ++                if (*s != 0)
> > >>>> +                         return -EINVAL;
> > >>>> +
> > >>>> +                 *nsec = NSEC_INFINITY;
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..161b7b5
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> > >>>> @@ -0,0 +1,36 @@
> > >>>> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
> > >>>> +From: Daniel Mack <daniel@zonque.org>
> > >>>> +Date: Tue, 24 Feb 2015 13:27:10 +0100
> > >>>> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
> > >>>> +
> > >>>> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
> > >>>> +---
> > >>>> + src/test/test-time.c | 6 ++++++
> > >>>> + 1 file changed, 6 insertions(+)
> > >>>> +
> > >>>> +diff --git a/src/test/test-time.c b/src/test/test-time.c
> > >>>> +index 8cfc4cc..3840fff 100644
> > >>>> +--- a/src/test/test-time.c
> > >>>> ++++ b/src/test/test-time.c
> > >>>> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
> > >>>> +         assert_se(u == 2);
> > >>>> +         assert_se(parse_nsec(".7", &u) >= 0);
> > >>>> +         assert_se(u == 0);
> > >>>> ++        assert_se(parse_nsec("infinity", &u) >= 0);
> > >>>> ++        assert_se(u == NSEC_INFINITY);
> > >>>> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
> > >>>> ++        assert_se(u == NSEC_INFINITY);
> > >>>> +
> > >>>> +         assert_se(parse_nsec(" xyz ", &u) < 0);
> > >>>> +         assert_se(parse_nsec("", &u) < 0);
> > >>>> +         assert_se(parse_nsec(" . ", &u) < 0);
> > >>>> +         assert_se(parse_nsec(" 5. ", &u) < 0);
> > >>>> +         assert_se(parse_nsec(".s ", &u) < 0);
> > >>>> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
> > >>>> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
> > >>>> + }
> > >>>> +
> > >>>> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..7eaad1e
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> > >>>> @@ -0,0 +1,44 @@
> > >>>> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
> > >>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
> > >>>> +Date: Tue, 24 Feb 2015 14:30:10 +0100
> > >>>> +Subject: [PATCH 08/26] bootchart: fix default init path
> > >>>> +
> > >>>> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
> > >>>> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
> > >>>> +multi-arch systems.
> > >>>> +
> > >>>> +https://launchpad.net/bugs/1423867
> > >>>> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
> > >>>> +---
> > >>>> + Makefile.am               | 1 +
> > >>>> + src/bootchart/bootchart.c | 2 +-
> > >>>> + 2 files changed, 2 insertions(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/Makefile.am b/Makefile.am
> > >>>> +index bf04d31..cc577ce 100644
> > >>>> +--- a/Makefile.am
> > >>>> ++++ b/Makefile.am
> > >>>> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
> > >>>> +     -DKEXEC=\"$(KEXEC)\" \
> > >>>> +     -DLIBDIR=\"$(libdir)\" \
> > >>>> +     -DROOTLIBDIR=\"$(rootlibdir)\" \
> > >>>> ++    -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> > >>>> +     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> > >>>> +     -I $(top_srcdir)/src \
> > >>>> +     -I $(top_builddir)/src/shared \
> > >>>> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
> > >>>> +index 64a384b..175be68 100644
> > >>>> +--- a/src/bootchart/bootchart.c
> > >>>> ++++ b/src/bootchart/bootchart.c
> > >>>> +@@ -76,7 +76,7 @@ int sysfd=-1;
> > >>>> + #define DEFAULT_HZ 25.0
> > >>>> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
> > >>>> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
> > >>>> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
> > >>>> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
> > >>>> + #define DEFAULT_OUTPUT "/run/log"
> > >>>> +
> > >>>> + /* graph defaults */
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..dbffa5b
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> > >>>> @@ -0,0 +1,44 @@
> > >>>> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
> > >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>> +Date: Tue, 24 Feb 2015 10:10:04 -0500
> > >>>> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
> > >>>> +
> > >>>> +It is not necessary when running as telinit, etc.
> > >>>> +
> > >>>> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
> > >>>> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
> > >>>> +---
> > >>>> + src/systemctl/systemctl.c | 10 +++++-----
> > >>>> + 1 file changed, 5 insertions(+), 5 deletions(-)
> > >>>> +
> > >>>> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
> > >>>> +index 21cb898..6b93ec8 100644
> > >>>> +--- a/src/systemctl/systemctl.c
> > >>>> ++++ b/src/systemctl/systemctl.c
> > >>>> +@@ -7204,6 +7204,11 @@ found:
> > >>>> +                 }
> > >>>> +         }
> > >>>> +
> > >>>> ++        /* Increase max number of open files to 16K if we can, we
> > >>>> ++         * might needs this when browsing journal files, which might
> > >>>> ++         * be split up into many files. */
> > >>>> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> > >>>> ++
> > >>>> +         return verb->dispatch(bus, argv + optind);
> > >>>> + }
> > >>>> +
> > >>>> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
> > >>>> +                 goto finish;
> > >>>> +         }
> > >>>> +
> > >>>> +-        /* Increase max number of open files to 16K if we can, we
> > >>>> +-         * might needs this when browsing journal files, which might
> > >>>> +-         * be split up into many files. */
> > >>>> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> > >>>> +-
> > >>>> +         if (!avoid_bus())
> > >>>> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
> > >>>> +
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> > >>>> index 41b9039..ff2871b 100644
> > >>>> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> > >>>> @@ -1,7 +1,7 @@
> > >>>> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
> > >>>> -From: Khem Raj <raj.khem@gmail.com>
> > >>>> -Date: Fri, 20 Feb 2015 05:24:49 +0000
> > >>>> -Subject: [PATCH 10/11] Make root's home directory configurable
> > >>>> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
> > >>>> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
> > >>>> +Date: Thu, 5 Mar 2015 17:38:12 -0300
> > >>>> +Subject: [PATCH] Make root's home directory configurable
> > >>>> 
> > >>>> OpenEmbedded has a configurable home directory for root. Allow
> > >>>> systemd to be built using its idea of what root's home directory
> > >>>> @@ -9,32 +9,31 @@ should be.
> > >>>> 
> > >>>> Upstream-Status: Pending
> > >>>> 
> > >>>> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
> > >>>> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
> > >>>> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
> > >>>> +compatbile with systemd 219-stable
> > >>>> ---
> > >>>> - Makefile.am                       | 2 ++
> > >>>> - configure.ac                      | 7 +++++++
> > >>>> - src/core/unit-printf.c            | 2 +-
> > >>>> - src/nspawn/nspawn.c               | 4 ++--
> > >>>> - src/shared/util.c                 | 4 ++--
> > >>>> - units/console-shell.service.m4.in | 4 ++--
> > >>>> - units/emergency.service.in        | 4 ++--
> > >>>> - units/rescue.service.in           | 4 ++--
> > >>>> - 8 files changed, 20 insertions(+), 11 deletions(-)
> > >>>> + Makefile.am                | 2 ++
> > >>>> + configure.ac               | 7 +++++++
> > >>>> + src/core/unit-printf.c     | 2 +-
> > >>>> + src/nspawn/nspawn.c        | 5 ++---
> > >>>> + src/shared/util.c          | 4 ++--
> > >>>> + units/emergency.service.in | 4 ++--
> > >>>> + units/rescue.service.in    | 4 ++--
> > >>>> + 7 files changed, 18 insertions(+), 10 deletions(-)
> > >>>> 
> > >>>> diff --git a/Makefile.am b/Makefile.am
> > >>>> -index 0fb3f9f..4623963 100644
> > >>>> +index 93c0509..31ea94d 100644
> > >>>> --- a/Makefile.am
> > >>>> +++ b/Makefile.am
> > >>>> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
> > >>>> -     -DKEXEC=\"$(KEXEC)\" \
> > >>>> -     -DLIBDIR=\"$(libdir)\" \
> > >>>> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
> > >>>>      -DROOTLIBDIR=\"$(rootlibdir)\" \
> > >>>> -+    -DROOTHOMEDIR=\"$(roothomedir)\" \
> > >>>> +     -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> > >>>>      -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> > >>>> ++    -DROOTHOMEDIR=\"$(roothomedir)\" \
> > >>>>      -I $(top_srcdir)/src \
> > >>>>      -I $(top_builddir)/src/shared \
> > >>>> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
> > >>>> +     -I $(top_srcdir)/src/shared \
> > >>>> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
> > >>>>  substitutions = \
> > >>>>         '|rootlibexecdir=$(rootlibexecdir)|' \
> > >>>>         '|rootbindir=$(rootbindir)|' \
> > >>>> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
> > >>>>         '|SYSTEMCTL=$(rootbindir)/systemctl|' \
> > >>>>         '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
> > >>>> diff --git a/configure.ac b/configure.ac
> > >>>> -index a5b2e6e..55bb7d8 100644
> > >>>> +index 01ee8dc..800a587 100644
> > >>>> --- a/configure.ac
> > >>>> +++ b/configure.ac
> > >>>> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
> > >>>> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
> > >>>>          [],
> > >>>>          [with_rootlibdir=${libdir}])
> > >>>> 
> > >>>> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
> > >>>>  AC_ARG_WITH([pamlibdir],
> > >>>>          AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
> > >>>>          [],
> > >>>> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> > >>>> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> > >>>>  AC_SUBST([pamconfdir], [$with_pamconfdir])
> > >>>>  AC_SUBST([rootprefix], [$with_rootprefix])
> > >>>>  AC_SUBST([rootlibdir], [$with_rootlibdir])
> > >>>> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
> > >>>> 
> > >>>>  AC_CONFIG_FILES([
> > >>>>          Makefile po/Makefile.in
> > >>>> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
> > >>>> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
> > >>>>          include_prefix:          ${INCLUDE_PREFIX}
> > >>>>          lib dir:                 ${libdir}
> > >>>>          rootlib dir:             ${with_rootlibdir}
> > >>>> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
> > >>>>          SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
> > >>>>          Build Python:            ${PYTHON}
> > >>>> diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
> > >>>> -index 97135db..14d12f1 100644
> > >>>> +index 7736899..ac5f008 100644
> > >>>> --- a/src/core/unit-printf.c
> > >>>> +++ b/src/core/unit-printf.c
> > >>>> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> > >>>> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> > >>>>                   * best of it if we can, but fail if we can't */
> > >>>> 
> > >>>>                  if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
> > >>>> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
> > >>>>                          return -ENOTSUP;
> > >>>> 
> > >>>> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
> > >>>> -index b597edb..0b32673 100644
> > >>>> +index 08bfdcf..b44b4cd 100644
> > >>>> --- a/src/nspawn/nspawn.c
> > >>>> +++ b/src/nspawn/nspawn.c
> > >>>> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
> > >>>> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
> > >>>> +                         r = change_uid_gid(&home);
> > >>>>                          if (r < 0)
> > >>>>                                  _exit(EXIT_FAILURE);
> > >>>> -
> > >>>> +-
> > >>>> -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
> > >>>> +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
> > >>>>                              (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
> > >>>>                              (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
> > >>>>                                  log_oom();
> > >>>> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
> > >>>> -                                 execvp(argv[optind], argv + optind);
> > >>>> - #endif /* HAVE_EXECVPE */
> > >>>> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
> > >>>> +                         } else if (argc > optind)
> > >>>> +                                 execvpe(argv[optind], argv + optind, env_use);
> > >>>>                          else {
> > >>>> -                                chdir(home ? home : "/root");
> > >>>> +                                chdir(home ? home : ROOTHOMEDIR);
> > >>>> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
> > >>>>                                  execle("/bin/sh", "-sh", NULL, env_use);
> > >>>>                          }
> > >>>> diff --git a/src/shared/util.c b/src/shared/util.c
> > >>>> -index cbbe3b1..a0e3cc5 100644
> > >>>> +index 241e752..00adab6 100644
> > >>>> --- a/src/shared/util.c
> > >>>> +++ b/src/shared/util.c
> > >>>> -@@ -4609,7 +4609,7 @@ int get_user_creds(
> > >>>> +@@ -4604,7 +4604,7 @@ int get_user_creds(
> > >>>>                          *gid = 0;
> > >>>> 
> > >>>>                  if (home)
> > >>>> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
> > >>>> 
> > >>>>                  if (shell)
> > >>>>                          *shell = "/bin/sh";
> > >>>> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
> > >>>> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
> > >>>>          /* Hardcode home directory for root to avoid NSS */
> > >>>>          u = getuid();
> > >>>>          if (u == 0) {
> > >>>> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
> > >>>>                  if (!h)
> > >>>>                          return -ENOMEM;
> > >>>> 
> > >>>> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
> > >>>> -index 5c80722..efde5f0 100644
> > >>>> ---- a/units/console-shell.service.m4.in
> > >>>> -+++ b/units/console-shell.service.m4.in
> > >>>> -@@ -15,8 +15,8 @@ After=rc-local.service
> > >>>> - Before=getty.target
> > >>>> -
> > >>>> - [Service]
> > >>>> --Environment=HOME=/root
> > >>>> --WorkingDirectory=/root
> > >>>> -+Environment=HOME=@roothomedir@
> > >>>> -+WorkingDirectory=@roothomedir@
> > >>>> - ExecStart=-@SULOGIN@
> > >>>> - ExecStopPost=-@SYSTEMCTL@ poweroff
> > >>>> - Type=idle
> > >>>> diff --git a/units/emergency.service.in b/units/emergency.service.in
> > >>>> index 2695d7b..7f47b73 100644
> > >>>> --- a/units/emergency.service.in
> > >>>> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
> > >>>>  ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
> > >>>>  ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
> > >>>> --
> > >>>> -2.1.4
> > >>>> +1.9.1
> > >>>> 
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..1e4a69d
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> > >>>> @@ -0,0 +1,37 @@
> > >>>> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
> > >>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> > >>>> +Date: Tue, 24 Feb 2015 20:40:07 +0100
> > >>>> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
> > >>>> +
> > >>>> +CID#1271344/1271345
> > >>>> +
> > >>>> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
> > >>>> +---
> > >>>> + src/shared/acl-util.c | 4 ++--
> > >>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
> > >>>> +
> > >>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> > >>>> +index cbe09d7..e67e9ac 100644
> > >>>> +--- a/src/shared/acl-util.c
> > >>>> ++++ b/src/shared/acl-util.c
> > >>>> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> > >>>> +                 /* can have only one of those */
> > >>>> +                 return true;
> > >>>> +         case ACL_USER: {
> > >>>> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> > >>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
> > >>>> +
> > >>>> +                 uid_a = acl_get_qualifier(a);
> > >>>> +                 if (!uid_a)
> > >>>> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> > >>>> +                 return *uid_a == *uid_b;
> > >>>> +         }
> > >>>> +         case ACL_GROUP: {
> > >>>> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> > >>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
> > >>>> +
> > >>>> +                 gid_a = acl_get_qualifier(a);
> > >>>> +                 if (!gid_a)
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..dca5e20
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> > >>>> @@ -0,0 +1,28 @@
> > >>>> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
> > >>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> > >>>> +Date: Tue, 24 Feb 2015 18:32:31 +0200
> > >>>> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
> > >>>> +
> > >>>> +If we have less samples than expected, systemd-bootchart will crash.
> > >>>> +
> > >>>> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
> > >>>> +---
> > >>>> + src/bootchart/svg.c | 2 +-
> > >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
> > >>>> +index e111fa9..144177c 100644
> > >>>> +--- a/src/bootchart/svg.c
> > >>>> ++++ b/src/bootchart/svg.c
> > >>>> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
> > >>>> +
> > >>>> +                 ps->sample = ps->sample->next;
> > >>>> +                 sample_hz = ps->sample;
> > >>>> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
> > >>>> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
> > >>>> +                         sample_hz = sample_hz->next;
> > >>>> +
> > >>>> +                 /* subtract bootchart cpu utilization from total */
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..e0cb193
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> > >>>> @@ -0,0 +1,38 @@
> > >>>> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
> > >>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> > >>>> +Date: Mon, 23 Feb 2015 16:01:31 +0200
> > >>>> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
> > >>>> +
> > >>>> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
> > >>>> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
> > >>>> +syscalls getrandom and memfd_create").
> > >>>> +
> > >>>> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
> > >>>> +---
> > >>>> + src/shared/missing.h | 10 ++++++++++
> > >>>> + 1 file changed, 10 insertions(+)
> > >>>> +
> > >>>> +diff --git a/src/shared/missing.h b/src/shared/missing.h
> > >>>> +index b33a70c..e72631e 100644
> > >>>> +--- a/src/shared/missing.h
> > >>>> ++++ b/src/shared/missing.h
> > >>>> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
> > >>>> + #    define __NR_getrandom 349
> > >>>> + #  elif defined(__powerpc__)
> > >>>> + #    define __NR_getrandom 359
> > >>>> ++#  elif defined _MIPS_SIM
> > >>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
> > >>>> ++#      define __NR_getrandom 4353
> > >>>> ++#    endif
> > >>>> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
> > >>>> ++#      define __NR_getrandom 6317
> > >>>> ++#    endif
> > >>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
> > >>>> ++#      define __NR_getrandom 5313
> > >>>> ++#    endif
> > >>>> + #  else
> > >>>> + #    warning "__NR_getrandom unknown for your architecture"
> > >>>> + #    define __NR_getrandom 0xffffffff
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..1b842a2
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> > >>>> @@ -0,0 +1,33 @@
> > >>>> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
> > >>>> +From: Lennart Poettering <lennart@poettering.net>
> > >>>> +Date: Wed, 25 Feb 2015 22:05:14 +0100
> > >>>> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
> > >>>> + units in --user mode
> > >>>> +
> > >>>> +When running in user mode unmounting of mount units when a device
> > >>>> +vanishes is unlikely to work, and even if it would work is already done
> > >>>> +by PID 1 anyway. HEnce, when creating implicit dependencies between
> > >>>> +mount units and their backing devices, created a Wants= type dependency
> > >>>> +in --user mode, but leave a BindsTo= dependency in --system mode.
> > >>>> +
> > >>>> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
> > >>>> +---
> > >>>> + src/core/unit.c | 2 +-
> > >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> > >>>> +index ee8e607..9f1e55e 100644
> > >>>> +--- a/src/core/unit.c
> > >>>> ++++ b/src/core/unit.c
> > >>>> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> > >>>> +         if (r < 0)
> > >>>> +                 return r;
> > >>>> +
> > >>>> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
> > >>>> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
> > >>>> +         if (r < 0)
> > >>>> +                 return r;
> > >>>> +
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..92c4b8f
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> > >>>> @@ -0,0 +1,43 @@
> > >>>> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
> > >>>> +From: Colin Walters <walters@verbum.org>
> > >>>> +Date: Tue, 17 Feb 2015 13:47:34 -0500
> > >>>> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
> > >>>> + caused it
> > >>>> +
> > >>>> +I'm trying to track down a relatively recent change in systemd
> > >>>> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
> > >>>> +
> > >>>> +Systemd started to stop sysroot.mount, and this patch should help
> > >>>> +me debug why at least.
> > >>>> +
> > >>>> +While we're here, "break" on the first unit we find that will
> > >>>> +deactivate, as there's no point in further iteration.
> > >>>> +
> > >>>> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
> > >>>> +---
> > >>>> + src/core/unit.c | 4 +++-
> > >>>> + 1 file changed, 3 insertions(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> > >>>> +index 9f1e55e..563f6fe 100644
> > >>>> +--- a/src/core/unit.c
> > >>>> ++++ b/src/core/unit.c
> > >>>> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
> > >>>> +                         continue;
> > >>>> +
> > >>>> +                 stop = true;
> > >>>> ++                break;
> > >>>> +         }
> > >>>> +
> > >>>> +         if (!stop)
> > >>>> +                 return;
> > >>>> +
> > >>>> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
> > >>>> ++        assert(other);
> > >>>> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
> > >>>> +
> > >>>> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
> > >>>> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..46c25bd
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> > >>>> @@ -0,0 +1,30 @@
> > >>>> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
> > >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>> +Date: Thu, 26 Feb 2015 19:00:11 -0500
> > >>>> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
> > >>>> + debug
> > >>>> +
> > >>>> +Printing it at info level was tedious. We don't do that for any other
> > >>>> +overrides.
> > >>>> +
> > >>>> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
> > >>>> +---
> > >>>> + src/sysctl/sysctl.c | 2 +-
> > >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
> > >>>> +index 275a5b7..2415d84 100644
> > >>>> +--- a/src/sysctl/sysctl.c
> > >>>> ++++ b/src/sysctl/sysctl.c
> > >>>> +@@ -176,7 +176,7 @@ found:
> > >>>> +                         if (streq(value, existing))
> > >>>> +                                 continue;
> > >>>> +
> > >>>> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
> > >>>> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
> > >>>> +                         free(hashmap_remove(sysctl_options, p));
> > >>>> +                         free(v);
> > >>>> +                 }
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..87dce1f
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> > >>>> @@ -0,0 +1,39 @@
> > >>>> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
> > >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>> +Date: Thu, 26 Feb 2015 19:05:51 -0500
> > >>>> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
> > >>>> +
> > >>>> +Also a link to decent documentation for sysrq keys. It is surprising
> > >>>> +hard to find.
> > >>>> +
> > >>>> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
> > >>>> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
> > >>>> +---
> > >>>> + sysctl.d/50-default.conf | 9 ++++++++-
> > >>>> + 1 file changed, 8 insertions(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
> > >>>> +index f189233..def151b 100644
> > >>>> +--- a/sysctl.d/50-default.conf
> > >>>> ++++ b/sysctl.d/50-default.conf
> > >>>> +@@ -5,9 +5,16 @@
> > >>>> + #  the Free Software Foundation; either version 2.1 of the License, or
> > >>>> + #  (at your option) any later version.
> > >>>> +
> > >>>> +-# See sysctl.d(5) and core(5) for for details.
> > >>>> ++# See sysctl.d(5) and core(5) for for documentation.
> > >>>> ++
> > >>>> ++# To override settings in this file, create a local file in /etc
> > >>>> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
> > >>>> ++# there.
> > >>>> +
> > >>>> + # System Request functionality of the kernel (SYNC)
> > >>>> ++#
> > >>>> ++# Use kernel.sysrq = 1 to allow all keys.
> > >>>> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
> > >>>> + kernel.sysrq = 16
> > >>>> +
> > >>>> + # Append the PID to the core filename
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..a3ab3e4
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> > >>>> @@ -0,0 +1,912 @@
> > >>>> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
> > >>>> +From: Lennart Poettering <lennart@poettering.net>
> > >>>> +Date: Fri, 27 Feb 2015 21:55:08 +0100
> > >>>> +Subject: [PATCH 17/26] core: rework device state logic
> > >>>> +
> > >>>> +This change introduces a new state "tentative" for device units. Device
> > >>>> +units are considered "plugged" when udev announced them, "dead" when
> > >>>> +they are not available in the kernel, and "tentative" when they are
> > >>>> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
> > >>>> +announced via udev.
> > >>>> +
> > >>>> +This should fix a race when device nodes (like loop devices) are created
> > >>>> +and immediately mounted. Previously, systemd might end up seeing the
> > >>>> +mount unit before the device, and would thus pull down the mount because
> > >>>> +its BindTo dependency on the device would not be fulfilled.
> > >>>> +
> > >>>> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
> > >>>> +---
> > >>>> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
> > >>>> + src/core/device.h |  14 ++-
> > >>>> + src/core/mount.c  |  46 ++++---
> > >>>> + src/core/swap.c   |  32 +++--
> > >>>> + src/core/swap.h   |   4 +-
> > >>>> + src/core/unit.c   |   1 -
> > >>>> + 6 files changed, 285 insertions(+), 180 deletions(-)
> > >>>> +
> > >>>> +diff --git a/src/core/device.c b/src/core/device.c
> > >>>> +index d3deac3..75b9a46 100644
> > >>>> +--- a/src/core/device.c
> > >>>> ++++ b/src/core/device.c
> > >>>> +@@ -36,7 +36,8 @@
> > >>>> +
> > >>>> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
> > >>>> +         [DEVICE_DEAD] = UNIT_INACTIVE,
> > >>>> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
> > >>>> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
> > >>>> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
> > >>>> + };
> > >>>> +
> > >>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
> > >>>> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
> > >>>> +         d->sysfs = NULL;
> > >>>> + }
> > >>>> +
> > >>>> ++static int device_set_sysfs(Device *d, const char *sysfs) {
> > >>>> ++        Device *first;
> > >>>> ++        char *copy;
> > >>>> ++        int r;
> > >>>> ++
> > >>>> ++        assert(d);
> > >>>> ++
> > >>>> ++        if (streq_ptr(d->sysfs, sysfs))
> > >>>> ++                return 0;
> > >>>> ++
> > >>>> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
> > >>>> ++        if (r < 0)
> > >>>> ++                return r;
> > >>>> ++
> > >>>> ++        copy = strdup(sysfs);
> > >>>> ++        if (!copy)
> > >>>> ++                return -ENOMEM;
> > >>>> ++
> > >>>> ++        device_unset_sysfs(d);
> > >>>> ++
> > >>>> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
> > >>>> ++        LIST_PREPEND(same_sysfs, first, d);
> > >>>> ++
> > >>>> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
> > >>>> ++        if (r < 0) {
> > >>>> ++                LIST_REMOVE(same_sysfs, first, d);
> > >>>> ++                free(copy);
> > >>>> ++                return r;
> > >>>> ++        }
> > >>>> ++
> > >>>> ++        d->sysfs = copy;
> > >>>> ++
> > >>>> ++        return 0;
> > >>>> ++}
> > >>>> ++
> > >>>> + static void device_init(Unit *u) {
> > >>>> +         Device *d = DEVICE(u);
> > >>>> +
> > >>>> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
> > >>>> +         assert(d);
> > >>>> +         assert(d->state == DEVICE_DEAD);
> > >>>> +
> > >>>> +-        if (d->sysfs)
> > >>>> ++        if (d->found & DEVICE_FOUND_UDEV)
> > >>>> ++                /* If udev says the device is around, it's around */
> > >>>> +                 device_set_state(d, DEVICE_PLUGGED);
> > >>>> ++        else if (d->found != DEVICE_NOT_FOUND)
> > >>>> ++                /* If a device is found in /proc/self/mountinfo or
> > >>>> ++                 * /proc/swaps, it's "tentatively" around. */
> > >>>> ++                device_set_state(d, DEVICE_TENTATIVE);
> > >>>> +
> > >>>> +         return 0;
> > >>>> + }
> > >>>> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
> > >>>> +         return device_state_to_string(DEVICE(u)->state);
> > >>>> + }
> > >>>> +
> > >>>> +-static int device_add_escaped_name(Unit *u, const char *dn) {
> > >>>> +-        _cleanup_free_ char *e = NULL;
> > >>>> +-        int r;
> > >>>> +-
> > >>>> +-        assert(u);
> > >>>> +-        assert(dn);
> > >>>> +-        assert(dn[0] == '/');
> > >>>> +-
> > >>>> +-        e = unit_name_from_path(dn, ".device");
> > >>>> +-        if (!e)
> > >>>> +-                return -ENOMEM;
> > >>>> +-
> > >>>> +-        r = unit_add_name(u, e);
> > >>>> +-        if (r < 0 && r != -EEXIST)
> > >>>> +-                return r;
> > >>>> +-
> > >>>> +-        return 0;
> > >>>> +-}
> > >>>> +-
> > >>>> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
> > >>>> +-        _cleanup_free_ char *e = NULL;
> > >>>> +-        Unit *u;
> > >>>> +-
> > >>>> +-        assert(m);
> > >>>> +-        assert(dn);
> > >>>> +-        assert(dn[0] == '/');
> > >>>> +-        assert(_u);
> > >>>> +-
> > >>>> +-        e = unit_name_from_path(dn, ".device");
> > >>>> +-        if (!e)
> > >>>> +-                return -ENOMEM;
> > >>>> +-
> > >>>> +-        u = manager_get_unit(m, e);
> > >>>> +-        if (u) {
> > >>>> +-                *_u = u;
> > >>>> +-                return 1;
> > >>>> +-        }
> > >>>> +-
> > >>>> +-        return 0;
> > >>>> +-}
> > >>>> +-
> > >>>> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
> > >>>> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
> > >>>> +         const char *model;
> > >>>> ++        int r;
> > >>>> +
> > >>>> +         assert(u);
> > >>>> +         assert(dev);
> > >>>> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
> > >>>> +
> > >>>> +                         j = strjoin(model, " ", label, NULL);
> > >>>> +                         if (j)
> > >>>> +-                                return unit_set_description(u, j);
> > >>>> +-                }
> > >>>> ++                                r = unit_set_description(u, j);
> > >>>> ++                } else
> > >>>> ++                        r = unit_set_description(u, model);
> > >>>> ++        } else
> > >>>> ++                r = unit_set_description(u, path);
> > >>>> +
> > >>>> +-                return unit_set_description(u, model);
> > >>>> +-        }
> > >>>> ++        if (r < 0)
> > >>>> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
> > >>>> +
> > >>>> +-        return unit_set_description(u, path);
> > >>>> ++        return r;
> > >>>> + }
> > >>>> +
> > >>>> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> > >>>> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> > >>>> +
> > >>>> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
> > >>>> +                 if (!n)
> > >>>> +-                        return -ENOMEM;
> > >>>> ++                        return log_oom();
> > >>>> +
> > >>>> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
> > >>>> +                 if (r < 0)
> > >>>> +-                        return r;
> > >>>> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
> > >>>> +         }
> > >>>> +         if (!isempty(state))
> > >>>> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
> > >>>> +-                                 property, strna(udev_device_get_syspath(dev)));
> > >>>> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
> > >>>> +
> > >>>> +         return 0;
> > >>>> + }
> > >>>> +
> > >>>> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> > >>>> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> > >>>> ++        _cleanup_free_ char *e = NULL;
> > >>>> +         const char *sysfs;
> > >>>> +         Unit *u = NULL;
> > >>>> +         bool delete;
> > >>>> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > >>>> +         if (!sysfs)
> > >>>> +                 return 0;
> > >>>> +
> > >>>> +-        r = device_find_escape_name(m, path, &u);
> > >>>> +-        if (r < 0)
> > >>>> +-                return r;
> > >>>> ++        e = unit_name_from_path(path, ".device");
> > >>>> ++        if (!e)
> > >>>> ++                return log_oom();
> > >>>> ++
> > >>>> ++        u = manager_get_unit(m, e);
> > >>>> +
> > >>>> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
> > >>>> ++        if (u &&
> > >>>> ++            DEVICE(u)->sysfs &&
> > >>>> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
> > >>>> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
> > >>>> +                 return -EEXIST;
> > >>>> ++        }
> > >>>> +
> > >>>> +         if (!u) {
> > >>>> +                 delete = true;
> > >>>> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > >>>> +                 if (!u)
> > >>>> +                         return log_oom();
> > >>>> +
> > >>>> +-                r = device_add_escaped_name(u, path);
> > >>>> ++                r = unit_add_name(u, e);
> > >>>> +                 if (r < 0)
> > >>>> +                         goto fail;
> > >>>> +
> > >>>> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > >>>> +          * actually been seen yet ->sysfs will not be
> > >>>> +          * initialized. Hence initialize it if necessary. */
> > >>>> +
> > >>>> +-        if (!DEVICE(u)->sysfs) {
> > >>>> +-                Device *first;
> > >>>> +-
> > >>>> +-                DEVICE(u)->sysfs = strdup(sysfs);
> > >>>> +-                if (!DEVICE(u)->sysfs) {
> > >>>> +-                        r = -ENOMEM;
> > >>>> +-                        goto fail;
> > >>>> +-                }
> > >>>> +-
> > >>>> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
> > >>>> +-                if (r < 0)
> > >>>> +-                        goto fail;
> > >>>> +-
> > >>>> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
> > >>>> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
> > >>>> +-
> > >>>> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
> > >>>> +-                if (r < 0)
> > >>>> +-                        goto fail;
> > >>>> +-        }
> > >>>> +-
> > >>>> +-        device_make_description(u, dev, path);
> > >>>> ++        r = device_set_sysfs(DEVICE(u), sysfs);
> > >>>> ++        if (r < 0)
> > >>>> ++                goto fail;
> > >>>> +
> > >>>> +-        if (main) {
> > >>>> +-                /* The additional systemd udev properties we only
> > >>>> +-                 * interpret for the main object */
> > >>>> ++        (void) device_update_description(u, dev, path);
> > >>>> +
> > >>>> +-                r = device_add_udev_wants(u, dev);
> > >>>> +-                if (r < 0)
> > >>>> +-                        goto fail;
> > >>>> +-        }
> > >>>> ++        /* The additional systemd udev properties we only interpret
> > >>>> ++         * for the main object */
> > >>>> ++        if (main)
> > >>>> ++                (void) device_add_udev_wants(u, dev);
> > >>>> +
> > >>>> +         /* Note that this won't dispatch the load queue, the caller
> > >>>> +          * has to do that if needed and appropriate */
> > >>>> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > >>>> +         return 0;
> > >>>> +
> > >>>> + fail:
> > >>>> +-        log_warning_errno(r, "Failed to load device unit: %m");
> > >>>> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
> > >>>> +
> > >>>> +         if (delete && u)
> > >>>> +                 unit_free(u);
> > >>>> +@@ -342,7 +331,7 @@ fail:
> > >>>> +         return r;
> > >>>> + }
> > >>>> +
> > >>>> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>> ++static int device_process_new(Manager *m, struct udev_device *dev) {
> > >>>> +         const char *sysfs, *dn, *alias;
> > >>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> > >>>> +         int r;
> > >>>> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>> +                 return 0;
> > >>>> +
> > >>>> +         /* Add the main unit named after the sysfs path */
> > >>>> +-        r = device_update_unit(m, dev, sysfs, true);
> > >>>> ++        r = device_setup_unit(m, dev, sysfs, true);
> > >>>> +         if (r < 0)
> > >>>> +                 return r;
> > >>>> +
> > >>>> +         /* Add an additional unit for the device node */
> > >>>> +         dn = udev_device_get_devnode(dev);
> > >>>> +         if (dn)
> > >>>> +-                device_update_unit(m, dev, dn, false);
> > >>>> ++                (void) device_setup_unit(m, dev, dn, false);
> > >>>> +
> > >>>> +         /* Add additional units for all symlinks */
> > >>>> +         first = udev_device_get_devlinks_list_entry(dev);
> > >>>> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>> +                             st.st_rdev != udev_device_get_devnum(dev))
> > >>>> +                                 continue;
> > >>>> +
> > >>>> +-                device_update_unit(m, dev, p, false);
> > >>>> ++                (void) device_setup_unit(m, dev, p, false);
> > >>>> +         }
> > >>>> +
> > >>>> +         /* Add additional units for all explicitly configured
> > >>>> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>> +                         e[l] = 0;
> > >>>> +
> > >>>> +                         if (path_is_absolute(e))
> > >>>> +-                                device_update_unit(m, dev, e, false);
> > >>>> ++                                (void) device_setup_unit(m, dev, e, false);
> > >>>> +                         else
> > >>>> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
> > >>>> +                 }
> > >>>> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>> +         return 0;
> > >>>> + }
> > >>>> +
> > >>>> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
> > >>>> +-        const char *sysfs;
> > >>>> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
> > >>>> ++        DeviceFound n;
> > >>>> ++
> > >>>> ++        assert(d);
> > >>>> ++
> > >>>> ++        n = add ? (d->found | found) : (d->found & ~found);
> > >>>> ++        if (n == d->found)
> > >>>> ++                return;
> > >>>> ++
> > >>>> ++        d->found = n;
> > >>>> ++
> > >>>> ++        if (now) {
> > >>>> ++                if (d->found & DEVICE_FOUND_UDEV)
> > >>>> ++                        device_set_state(d, DEVICE_PLUGGED);
> > >>>> ++                else if (d->found != DEVICE_NOT_FOUND)
> > >>>> ++                        device_set_state(d, DEVICE_TENTATIVE);
> > >>>> ++                else
> > >>>> ++                        device_set_state(d, DEVICE_DEAD);
> > >>>> ++        }
> > >>>> ++}
> > >>>> ++
> > >>>> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
> > >>>> +         Device *d, *l;
> > >>>> +
> > >>>> +         assert(m);
> > >>>> +-        assert(dev);
> > >>>> ++        assert(sysfs);
> > >>>> +
> > >>>> +-        sysfs = udev_device_get_syspath(dev);
> > >>>> +-        if (!sysfs)
> > >>>> +-                return;
> > >>>> ++        if (found == DEVICE_NOT_FOUND)
> > >>>> ++                return 0;
> > >>>> +
> > >>>> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
> > >>>> +         LIST_FOREACH(same_sysfs, d, l)
> > >>>> +-                device_set_state(d, DEVICE_PLUGGED);
> > >>>> ++                device_update_found_one(d, add, found, now);
> > >>>> ++
> > >>>> ++        return 0;
> > >>>> + }
> > >>>> +
> > >>>> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
> > >>>> +-        const char *sysfs;
> > >>>> +-        Device *d;
> > >>>> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
> > >>>> ++        _cleanup_free_ char *e = NULL;
> > >>>> ++        Unit *u;
> > >>>> +
> > >>>> +         assert(m);
> > >>>> +-        assert(dev);
> > >>>> ++        assert(path);
> > >>>> +
> > >>>> +-        sysfs = udev_device_get_syspath(dev);
> > >>>> +-        if (!sysfs)
> > >>>> +-                return -ENOMEM;
> > >>>> ++        if (found == DEVICE_NOT_FOUND)
> > >>>> ++                return 0;
> > >>>> +
> > >>>> +-        /* Remove all units of this sysfs path */
> > >>>> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
> > >>>> +-                device_unset_sysfs(d);
> > >>>> +-                device_set_state(d, DEVICE_DEAD);
> > >>>> +-        }
> > >>>> ++        e = unit_name_from_path(path, ".device");
> > >>>> ++        if (!e)
> > >>>> ++                return log_oom();
> > >>>> +
> > >>>> ++        u = manager_get_unit(m, e);
> > >>>> ++        if (!u)
> > >>>> ++                return 0;
> > >>>> ++
> > >>>> ++        device_update_found_one(DEVICE(u), add, found, now);
> > >>>> +         return 0;
> > >>>> + }
> > >>>> +
> > >>>> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
> > >>>> +         return parse_boolean(ready) != 0;
> > >>>> + }
> > >>>> +
> > >>>> +-static int device_process_new_path(Manager *m, const char *path) {
> > >>>> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > >>>> +-
> > >>>> +-        assert(m);
> > >>>> +-        assert(path);
> > >>>> +-
> > >>>> +-        dev = udev_device_new_from_syspath(m->udev, path);
> > >>>> +-        if (!dev)
> > >>>> +-                return log_oom();
> > >>>> +-
> > >>>> +-        if (!device_is_ready(dev))
> > >>>> +-                return 0;
> > >>>> +-
> > >>>> +-        return device_process_new_device(m, dev);
> > >>>> +-}
> > >>>> +-
> > >>>> + static Unit *device_following(Unit *u) {
> > >>>> +         Device *d = DEVICE(u);
> > >>>> +         Device *other, *first = NULL;
> > >>>> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
> > >>>> +                 goto fail;
> > >>>> +
> > >>>> +         first = udev_enumerate_get_list_entry(e);
> > >>>> +-        udev_list_entry_foreach(item, first)
> > >>>> +-                device_process_new_path(m, udev_list_entry_get_name(item));
> > >>>> ++        udev_list_entry_foreach(item, first) {
> > >>>> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > >>>> ++                const char *sysfs;
> > >>>> ++
> > >>>> ++                sysfs = udev_list_entry_get_name(item);
> > >>>> ++
> > >>>> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
> > >>>> ++                if (!dev) {
> > >>>> ++                        log_oom();
> > >>>> ++                        continue;
> > >>>> ++                }
> > >>>> ++
> > >>>> ++                if (!device_is_ready(dev))
> > >>>> ++                        continue;
> > >>>> ++
> > >>>> ++                (void) device_process_new(m, dev);
> > >>>> ++
> > >>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
> > >>>> ++        }
> > >>>> +
> > >>>> +         return 0;
> > >>>> +
> > >>>> + fail:
> > >>>> ++        log_error_errno(r, "Failed to enumerate devices: %m");
> > >>>> ++
> > >>>> +         device_shutdown(m);
> > >>>> +         return r;
> > >>>> + }
> > >>>> +@@ -619,7 +634,7 @@ fail:
> > >>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
> > >>>> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > >>>> +         Manager *m = userdata;
> > >>>> +-        const char *action;
> > >>>> ++        const char *action, *sysfs;
> > >>>> +         int r;
> > >>>> +
> > >>>> +         assert(m);
> > >>>> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> > >>>> +         if (!dev)
> > >>>> +                 return 0;
> > >>>> +
> > >>>> ++        sysfs = udev_device_get_syspath(dev);
> > >>>> ++        if (!sysfs) {
> > >>>> ++                log_error("Failed to get udev sys path.");
> > >>>> ++                return 0;
> > >>>> ++        }
> > >>>> ++
> > >>>> +         action = udev_device_get_action(dev);
> > >>>> +         if (!action) {
> > >>>> +                 log_error("Failed to get udev action string.");
> > >>>> +                 return 0;
> > >>>> +         }
> > >>>> +
> > >>>> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
> > >>>> +-                r = device_process_removed_device(m, dev);
> > >>>> +-                if (r < 0)
> > >>>> +-                        log_error_errno(r, "Failed to process device remove event: %m");
> > >>>> +-
> > >>>> +-                r = swap_process_removed_device(m, dev);
> > >>>> ++        if (streq(action, "remove"))  {
> > >>>> ++                r = swap_process_device_remove(m, dev);
> > >>>> +                 if (r < 0)
> > >>>> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
> > >>>> +
> > >>>> +-        } else {
> > >>>> +-                r = device_process_new_device(m, dev);
> > >>>> +-                if (r < 0)
> > >>>> +-                        log_error_errno(r, "Failed to process device new event: %m");
> > >>>> ++                /* If we get notified that a device was removed by
> > >>>> ++                 * udev, then it's completely gone, hence unset all
> > >>>> ++                 * found bits */
> > >>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
> > >>>> +
> > >>>> +-                r = swap_process_new_device(m, dev);
> > >>>> ++        } else if (device_is_ready(dev)) {
> > >>>> ++
> > >>>> ++                (void) device_process_new(m, dev);
> > >>>> ++
> > >>>> ++                r = swap_process_device_new(m, dev);
> > >>>> +                 if (r < 0)
> > >>>> +                         log_error_errno(r, "Failed to process swap device new event: %m");
> > >>>> +
> > >>>> +                 manager_dispatch_load_queue(m);
> > >>>> +
> > >>>> +-                device_set_path_plugged(m, dev);
> > >>>> ++                /* The device is found now, set the udev found bit */
> > >>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
> > >>>> ++
> > >>>> ++        } else {
> > >>>> ++                /* The device is nominally around, but not ready for
> > >>>> ++                 * us. Hence unset the udev bit, but leave the rest
> > >>>> ++                 * around. */
> > >>>> ++
> > >>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
> > >>>> +         }
> > >>>> +
> > >>>> +         return 0;
> > >>>> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
> > >>>> +         return read_only <= 0;
> > >>>> + }
> > >>>> +
> > >>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
> > >>>> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > >>>> ++        struct stat st;
> > >>>> ++
> > >>>> ++        assert(m);
> > >>>> ++        assert(node);
> > >>>> ++
> > >>>> ++        /* This is called whenever we find a device referenced in
> > >>>> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
> > >>>> ++         * mounted/enabled at a time where udev has not finished
> > >>>> ++         * probing it yet, and we thus haven't learned about it
> > >>>> ++         * yet. In this case we will set the device unit to
> > >>>> ++         * "tentative" state. */
> > >>>> ++
> > >>>> ++        if (add) {
> > >>>> ++                if (!path_startswith(node, "/dev"))
> > >>>> ++                        return 0;
> > >>>> ++
> > >>>> ++                if (stat(node, &st) < 0) {
> > >>>> ++                        if (errno == ENOENT)
> > >>>> ++                                return 0;
> > >>>> ++
> > >>>> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
> > >>>> ++                }
> > >>>> ++
> > >>>> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
> > >>>> ++                        return 0;
> > >>>> ++
> > >>>> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
> > >>>> ++                if (!dev) {
> > >>>> ++                        if (errno == ENOENT)
> > >>>> ++                                return 0;
> > >>>> ++
> > >>>> ++                        return log_oom();
> > >>>> ++                }
> > >>>> ++
> > >>>> ++                /* If the device is known in the kernel and newly
> > >>>> ++                 * appeared, then we'll create a device unit for it,
> > >>>> ++                 * under the name referenced in /proc/swaps or
> > >>>> ++                 * /proc/self/mountinfo. */
> > >>>> ++
> > >>>> ++                (void) device_setup_unit(m, dev, node, false);
> > >>>> ++        }
> > >>>> ++
> > >>>> ++        /* Update the device unit's state, should it exist */
> > >>>> ++        return device_update_found_by_name(m, node, add, found, now);
> > >>>> ++}
> > >>>> ++
> > >>>> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
> > >>>> +         [DEVICE_DEAD] = "dead",
> > >>>> +-        [DEVICE_PLUGGED] = "plugged"
> > >>>> ++        [DEVICE_TENTATIVE] = "tentative",
> > >>>> ++        [DEVICE_PLUGGED] = "plugged",
> > >>>> + };
> > >>>> +
> > >>>> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
> > >>>> +diff --git a/src/core/device.h b/src/core/device.h
> > >>>> +index bb7ae07..0609b20 100644
> > >>>> +--- a/src/core/device.h
> > >>>> ++++ b/src/core/device.h
> > >>>> +@@ -29,20 +29,28 @@ typedef struct Device Device;
> > >>>> +  * simplifies the state engine greatly */
> > >>>> + typedef enum DeviceState {
> > >>>> +         DEVICE_DEAD,
> > >>>> +-        DEVICE_PLUGGED,
> > >>>> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
> > >>>> ++        DEVICE_PLUGGED,   /* announced by udev */
> > >>>> +         _DEVICE_STATE_MAX,
> > >>>> +         _DEVICE_STATE_INVALID = -1
> > >>>> + } DeviceState;
> > >>>> +
> > >>>> ++typedef enum DeviceFound {
> > >>>> ++        DEVICE_NOT_FOUND = 0,
> > >>>> ++        DEVICE_FOUND_UDEV = 1,
> > >>>> ++        DEVICE_FOUND_MOUNT = 2,
> > >>>> ++        DEVICE_FOUND_SWAP = 4,
> > >>>> ++} DeviceFound;
> > >>>> ++
> > >>>> + struct Device {
> > >>>> +         Unit meta;
> > >>>> +
> > >>>> +         char *sysfs;
> > >>>> ++        DeviceFound found;
> > >>>> +
> > >>>> +         /* In order to be able to distinguish dependencies on
> > >>>> +         different device nodes we might end up creating multiple
> > >>>> +         devices for the same sysfs path. We chain them up here. */
> > >>>> +-
> > >>>> +         LIST_FIELDS(struct Device, same_sysfs);
> > >>>> +
> > >>>> +         DeviceState state;
> > >>>> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
> > >>>> +
> > >>>> + const char* device_state_to_string(DeviceState i) _const_;
> > >>>> + DeviceState device_state_from_string(const char *s) _pure_;
> > >>>> ++
> > >>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
> > >>>> +diff --git a/src/core/mount.c b/src/core/mount.c
> > >>>> +index f3977e6..c971330 100644
> > >>>> +--- a/src/core/mount.c
> > >>>> ++++ b/src/core/mount.c
> > >>>> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
> > >>>> +         return 0;
> > >>>> + }
> > >>>> +
> > >>>> +-static int mount_add_one(
> > >>>> ++static int mount_setup_unit(
> > >>>> +                 Manager *m,
> > >>>> +                 const char *what,
> > >>>> +                 const char *where,
> > >>>> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
> > >>>> +
> > >>>> +                 u = unit_new(m, sizeof(Mount));
> > >>>> +                 if (!u)
> > >>>> +-                        return -ENOMEM;
> > >>>> ++                        return log_oom();
> > >>>> +
> > >>>> +                 r = unit_add_name(u, e);
> > >>>> +                 if (r < 0)
> > >>>> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
> > >>>> +         return 0;
> > >>>> +
> > >>>> + fail:
> > >>>> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
> > >>>> ++
> > >>>> +         if (delete && u)
> > >>>> +                 unit_free(u);
> > >>>> +
> > >>>> +@@ -1554,33 +1556,36 @@ fail:
> > >>>> + }
> > >>>> +
> > >>>> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> > >>>> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
> > >>>> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
> > >>>> +-        struct libmnt_fs *fs;
> > >>>> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
> > >>>> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
> > >>>> +         int r = 0;
> > >>>> +
> > >>>> +         assert(m);
> > >>>> +
> > >>>> +-        tb = mnt_new_table();
> > >>>> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
> > >>>> +-        if (!tb || !itr)
> > >>>> ++        t = mnt_new_table();
> > >>>> ++        if (!t)
> > >>>> +                 return log_oom();
> > >>>> +
> > >>>> +-        r = mnt_table_parse_mtab(tb, NULL);
> > >>>> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
> > >>>> ++        if (!i)
> > >>>> ++                return log_oom();
> > >>>> ++
> > >>>> ++        r = mnt_table_parse_mtab(t, NULL);
> > >>>> +         if (r < 0)
> > >>>> +-                return r;
> > >>>> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
> > >>>> +
> > >>>> +         r = 0;
> > >>>> +         for (;;) {
> > >>>> +                 const char *device, *path, *options, *fstype;
> > >>>> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
> > >>>> ++                struct libmnt_fs *fs;
> > >>>> +                 int k;
> > >>>> +
> > >>>> +-                k = mnt_table_next_fs(tb, itr, &fs);
> > >>>> ++                k = mnt_table_next_fs(t, i, &fs);
> > >>>> +                 if (k == 1)
> > >>>> +                         break;
> > >>>> +-                else if (k < 0)
> > >>>> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
> > >>>> ++                if (k < 0)
> > >>>> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
> > >>>> +
> > >>>> +                 device = mnt_fs_get_source(fs);
> > >>>> +                 path = mnt_fs_get_target(fs);
> > >>>> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> > >>>> +                 fstype = mnt_fs_get_fstype(fs);
> > >>>> +
> > >>>> +                 d = cunescape(device);
> > >>>> ++                if (!d)
> > >>>> ++                        return log_oom();
> > >>>> ++
> > >>>> +                 p = cunescape(path);
> > >>>> +-                if (!d || !p)
> > >>>> ++                if (!p)
> > >>>> +                         return log_oom();
> > >>>> +
> > >>>> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
> > >>>> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
> > >>>> ++
> > >>>> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
> > >>>> +                 if (r == 0 && k < 0)
> > >>>> +                         r = k;
> > >>>> +         }
> > >>>> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> > >>>> +
> > >>>> +         r = mount_load_proc_self_mountinfo(m, true);
> > >>>> +         if (r < 0) {
> > >>>> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
> > >>>> +-
> > >>>> +                 /* Reset flags, just in case, for later calls */
> > >>>> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
> > >>>> +                         Mount *mount = MOUNT(u);
> > >>>> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> > >>>> +                                 break;
> > >>>> +                         }
> > >>>> +
> > >>>> ++                        if (mount->parameters_proc_self_mountinfo.what)
> > >>>> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
> > >>>> ++
> > >>>> ++
> > >>>> +                 } else if (mount->just_mounted || mount->just_changed) {
> > >>>> +
> > >>>> +                         /* New or changed mount entry */
> > >>>> +diff --git a/src/core/swap.c b/src/core/swap.c
> > >>>> +index 6997921..5c19af5 100644
> > >>>> +--- a/src/core/swap.c
> > >>>> ++++ b/src/core/swap.c
> > >>>> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
> > >>>> +         return swap_verify(s);
> > >>>> + }
> > >>>> +
> > >>>> +-static int swap_add_one(
> > >>>> ++static int swap_setup_unit(
> > >>>> +                 Manager *m,
> > >>>> +                 const char *what,
> > >>>> +                 const char *what_proc_swaps,
> > >>>> +@@ -363,8 +363,10 @@ static int swap_add_one(
> > >>>> +
> > >>>> +         if (u &&
> > >>>> +             SWAP(u)->from_proc_swaps &&
> > >>>> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
> > >>>> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
> > >>>> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
> > >>>> +                 return -EEXIST;
> > >>>> ++        }
> > >>>> +
> > >>>> +         if (!u) {
> > >>>> +                 delete = true;
> > >>>> +@@ -379,7 +381,7 @@ static int swap_add_one(
> > >>>> +
> > >>>> +                 SWAP(u)->what = strdup(what);
> > >>>> +                 if (!SWAP(u)->what) {
> > >>>> +-                        r = log_oom();
> > >>>> ++                        r = -ENOMEM;
> > >>>> +                         goto fail;
> > >>>> +                 }
> > >>>> +
> > >>>> +@@ -407,7 +409,6 @@ static int swap_add_one(
> > >>>> +         p->priority = priority;
> > >>>> +
> > >>>> +         unit_add_to_dbus_queue(u);
> > >>>> +-
> > >>>> +         return 0;
> > >>>> +
> > >>>> + fail:
> > >>>> +@@ -419,7 +420,7 @@ fail:
> > >>>> +         return r;
> > >>>> + }
> > >>>> +
> > >>>> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
> > >>>> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
> > >>>> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
> > >>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> > >>>> +         const char *dn;
> > >>>> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> > >>>> +
> > >>>> +         assert(m);
> > >>>> +
> > >>>> +-        r = swap_add_one(m, device, device, prio, set_flags);
> > >>>> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
> > >>>> +         if (r < 0)
> > >>>> +                 return r;
> > >>>> +
> > >>>> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> > >>>> +         /* Add the main device node */
> > >>>> +         dn = udev_device_get_devnode(d);
> > >>>> +         if (dn && !streq(dn, device))
> > >>>> +-                swap_add_one(m, dn, device, prio, set_flags);
> > >>>> ++                swap_setup_unit(m, dn, device, prio, set_flags);
> > >>>> +
> > >>>> +         /* Add additional units for all symlinks */
> > >>>> +         first = udev_device_get_devlinks_list_entry(d);
> > >>>> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> > >>>> +                             st.st_rdev != udev_device_get_devnum(d))
> > >>>> +                                 continue;
> > >>>> +
> > >>>> +-                swap_add_one(m, p, device, prio, set_flags);
> > >>>> ++                swap_setup_unit(m, p, device, prio, set_flags);
> > >>>> +         }
> > >>>> +
> > >>>> +         return r;
> > >>>> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
> > >>>> +                         if (k == EOF)
> > >>>> +                                 break;
> > >>>> +
> > >>>> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
> > >>>> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
> > >>>> +                         continue;
> > >>>> +                 }
> > >>>> +
> > >>>> +                 d = cunescape(dev);
> > >>>> +                 if (!d)
> > >>>> +-                        return -ENOMEM;
> > >>>> ++                        return log_oom();
> > >>>> ++
> > >>>> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
> > >>>> +
> > >>>> +-                k = swap_process_new_swap(m, d, prio, set_flags);
> > >>>> ++                k = swap_process_new(m, d, prio, set_flags);
> > >>>> +                 if (k < 0)
> > >>>> +                         r = k;
> > >>>> +         }
> > >>>> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
> > >>>> +                                 break;
> > >>>> +                         }
> > >>>> +
> > >>>> ++                        if (swap->what)
> > >>>> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
> > >>>> ++
> > >>>> +                 } else if (swap->just_activated) {
> > >>>> +
> > >>>> +                         /* New swap entry */
> > >>>> +@@ -1298,7 +1304,7 @@ fail:
> > >>>> +         return r;
> > >>>> + }
> > >>>> +
> > >>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
> > >>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> > >>>> +         _cleanup_free_ char *e = NULL;
> > >>>> +         const char *dn;
> > >>>> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>> +         return r;
> > >>>> + }
> > >>>> +
> > >>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
> > >>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
> > >>>> +         const char *dn;
> > >>>> +         int r = 0;
> > >>>> +         Swap *s;
> > >>>> +diff --git a/src/core/swap.h b/src/core/swap.h
> > >>>> +index 73e64d8..914a2db 100644
> > >>>> +--- a/src/core/swap.h
> > >>>> ++++ b/src/core/swap.h
> > >>>> +@@ -116,8 +116,8 @@ struct Swap {
> > >>>> +
> > >>>> + extern const UnitVTable swap_vtable;
> > >>>> +
> > >>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
> > >>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
> > >>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
> > >>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
> > >>>> +
> > >>>> + const char* swap_state_to_string(SwapState i) _const_;
> > >>>> + SwapState swap_state_from_string(const char *s) _pure_;
> > >>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> > >>>> +index 563f6fe..a6558ee 100644
> > >>>> +--- a/src/core/unit.c
> > >>>> ++++ b/src/core/unit.c
> > >>>> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> > >>>> +                 return -ENOMEM;
> > >>>> +
> > >>>> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
> > >>>> +-
> > >>>> +         if (r < 0)
> > >>>> +                 return r;
> > >>>> +
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..d614085
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> > >>>> @@ -0,0 +1,26 @@
> > >>>> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
> > >>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> > >>>> +Date: Sat, 28 Feb 2015 23:39:55 +0100
> > >>>> +Subject: [PATCH 18/26] core: fix return value on OOM
> > >>>> +
> > >>>> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
> > >>>> +---
> > >>>> + src/core/device.c | 2 ++
> > >>>> + 1 file changed, 2 insertions(+)
> > >>>> +
> > >>>> +diff --git a/src/core/device.c b/src/core/device.c
> > >>>> +index 75b9a46..1cc103c 100644
> > >>>> +--- a/src/core/device.c
> > >>>> ++++ b/src/core/device.c
> > >>>> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
> > >>>> +                         j = strjoin(model, " ", label, NULL);
> > >>>> +                         if (j)
> > >>>> +                                 r = unit_set_description(u, j);
> > >>>> ++                        else
> > >>>> ++                                r = -ENOMEM;
> > >>>> +                 } else
> > >>>> +                         r = unit_set_description(u, model);
> > >>>> +         } else
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..d94da60
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> > >>>> @@ -0,0 +1,33 @@
> > >>>> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
> > >>>> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
> > >>>> +Date: Thu, 19 Feb 2015 20:47:28 +0100
> > >>>> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
> > >>>> + bus on dbus1
> > >>>> +
> > >>>> +This fixes "machinectl login" on systems configured with --disable-kdbus.
> > >>>> +
> > >>>> +The error was:
> > >>>> +machinectl login foo
> > >>>> +Failed to get machine PTY: Input/output error
> > >>>> +
> > >>>> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
> > >>>> +---
> > >>>> + src/machine/machine-dbus.c | 2 +-
> > >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
> > >>>> +index b46f0a8..b0f0f66 100644
> > >>>> +--- a/src/machine/machine-dbus.c
> > >>>> ++++ b/src/machine/machine-dbus.c
> > >>>> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
> > >>>> + #ifdef ENABLE_KDBUS
> > >>>> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
> > >>>> + #else
> > >>>> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
> > >>>> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
> > >>>> + #endif
> > >>>> +         if (!container_bus->address)
> > >>>> +                 return -ENOMEM;
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..fcc2adf
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> > >>>> @@ -0,0 +1,25 @@
> > >>>> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
> > >>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> > >>>> +Date: Fri, 20 Feb 2015 15:35:11 -0300
> > >>>> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
> > >>>> +
> > >>>> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
> > >>>> +---
> > >>>> + src/shared/util.c | 1 +
> > >>>> + 1 file changed, 1 insertion(+)
> > >>>> +
> > >>>> +diff --git a/src/shared/util.c b/src/shared/util.c
> > >>>> +index ba035ca..f24b5b4 100644
> > >>>> +--- a/src/shared/util.c
> > >>>> ++++ b/src/shared/util.c
> > >>>> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
> > >>>> +
> > >>>> + bool fstype_is_network(const char *fstype) {
> > >>>> +         static const char table[] =
> > >>>> ++                "afs\0"
> > >>>> +                 "cifs\0"
> > >>>> +                 "smbfs\0"
> > >>>> +                 "sshfs\0"
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..02e279d
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> > >>>> @@ -0,0 +1,31 @@
> > >>>> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
> > >>>> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
> > >>>> +Date: Fri, 20 Feb 2015 10:53:28 +0100
> > >>>> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
> > >>>> +
> > >>>> +Otherwise every daemon reload prints out warnings like:
> > >>>> +
> > >>>> +systemd[1]: Unit type .busname is not supported on this system.
> > >>>> +systemd[1]: Unit type .swap is not supported on this system.
> > >>>> +
> > >>>> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
> > >>>> +---
> > >>>> + src/core/manager.c | 2 +-
> > >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/core/manager.c b/src/core/manager.c
> > >>>> +index 4775219..bc9b7ec 100644
> > >>>> +--- a/src/core/manager.c
> > >>>> ++++ b/src/core/manager.c
> > >>>> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
> > >>>> +                 int q;
> > >>>> +
> > >>>> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
> > >>>> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> > >>>> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> > >>>> +                         continue;
> > >>>> +                 }
> > >>>> +
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..f5afd09
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> > >>>> @@ -0,0 +1,97 @@
> > >>>> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
> > >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>> +Date: Mon, 2 Mar 2015 10:34:51 -0500
> > >>>> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
> > >>>> +
> > >>>> +Binary fields were not processed properly, and resulting journal files
> > >>>> +were non-conforming, resulting in an error ("Invalid field.") when reading.
> > >>>> +
> > >>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
> > >>>> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
> > >>>> +---
> > >>>> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
> > >>>> + src/journal-remote/journal-remote-parse.h |  4 +++-
> > >>>> + 2 files changed, 21 insertions(+), 14 deletions(-)
> > >>>> +
> > >>>> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
> > >>>> +index d9dea8d..afded7e 100644
> > >>>> +--- a/src/journal-remote/journal-remote-parse.c
> > >>>> ++++ b/src/journal-remote/journal-remote-parse.c
> > >>>> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
> > >>>> +                    LLLLLLLL0011223344...\n
> > >>>> +                 */
> > >>>> +                 sep = memchr(line, '=', n);
> > >>>> +-                if (sep)
> > >>>> ++                if (sep) {
> > >>>> +                         /* chomp newline */
> > >>>> +                         n--;
> > >>>> +-                else
> > >>>> ++
> > >>>> ++                        r = iovw_put(&source->iovw, line, n);
> > >>>> ++                        if (r < 0)
> > >>>> ++                                return r;
> > >>>> ++                } else {
> > >>>> +                         /* replace \n with = */
> > >>>> +                         line[n-1] = '=';
> > >>>> +-                log_trace("Received: %.*s", (int) n, line);
> > >>>> +
> > >>>> +-                r = iovw_put(&source->iovw, line, n);
> > >>>> +-                if (r < 0) {
> > >>>> +-                        log_error("Failed to put line in iovect");
> > >>>> +-                        return r;
> > >>>> ++                        source->field_len = n;
> > >>>> ++                        source->state = STATE_DATA_START;
> > >>>> ++
> > >>>> ++                        /* we cannot put the field in iovec until we have all data */
> > >>>> +                 }
> > >>>> +
> > >>>> +-                if (!sep)
> > >>>> +-                        source->state = STATE_DATA_START;
> > >>>> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
> > >>>> ++
> > >>>> +                 return 0; /* continue */
> > >>>> +         }
> > >>>> +
> > >>>> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
> > >>>> +
> > >>>> +         case STATE_DATA: {
> > >>>> +                 void *data;
> > >>>> ++                char *field;
> > >>>> +
> > >>>> +                 assert(source->data_size > 0);
> > >>>> +
> > >>>> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
> > >>>> +
> > >>>> +                 assert(data);
> > >>>> +
> > >>>> +-                r = iovw_put(&source->iovw, data, source->data_size);
> > >>>> +-                if (r < 0) {
> > >>>> +-                        log_error("failed to put binary buffer in iovect");
> > >>>> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
> > >>>> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
> > >>>> ++
> > >>>> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
> > >>>> ++                if (r < 0)
> > >>>> +                         return r;
> > >>>> +-                }
> > >>>> +
> > >>>> +                 source->state = STATE_DATA_FINISH;
> > >>>> +
> > >>>> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
> > >>>> +index 8499f4e..22db550 100644
> > >>>> +--- a/src/journal-remote/journal-remote-parse.h
> > >>>> ++++ b/src/journal-remote/journal-remote-parse.h
> > >>>> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
> > >>>> +         size_t offset;     /* offset to the beginning of live data in the buffer */
> > >>>> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
> > >>>> +         size_t filled;     /* total number of bytes in the buffer */
> > >>>> +-        size_t data_size;  /* size of the binary data chunk being processed */
> > >>>> ++
> > >>>> ++        size_t field_len;  /* used for binary fields: the field name length */
> > >>>> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
> > >>>> +
> > >>>> +         struct iovec_wrapper iovw;
> > >>>> +
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..79e565b
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> > >>>> @@ -0,0 +1,37 @@
> > >>>> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
> > >>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> > >>>> +Date: Sun, 1 Mar 2015 21:13:10 -0300
> > >>>> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
> > >>>> +
> > >>>> +Logs constantly show
> > >>>> +
> > >>>> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
> > >>>> +
> > >>>> +This is because ext4 does not support FS_NOCOW_FL.
> > >>>> +
> > >>>> +[zj: fold into one conditional as suggested on the ML and
> > >>>> +     fix (preexisting) r/errno confusion in error message.]
> > >>>> +
> > >>>> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
> > >>>> +---
> > >>>> + src/journal/journal-file.c | 4 ++--
> > >>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
> > >>>> +
> > >>>> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
> > >>>> +index 2845e05..0f28718 100644
> > >>>> +--- a/src/journal/journal-file.c
> > >>>> ++++ b/src/journal/journal-file.c
> > >>>> +@@ -2611,8 +2611,8 @@ int journal_file_open(
> > >>>> +                  * shouldn't be too bad, given that we do our own
> > >>>> +                  * checksumming). */
> > >>>> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
> > >>>> +-                if (r < 0)
> > >>>> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
> > >>>> ++                if (r < 0 && r != -ENOTTY)
> > >>>> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
> > >>>> +
> > >>>> +                 /* Let's attach the creation time to the journal file,
> > >>>> +                  * so that the vacuuming code knows the age of this
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..0cf9a0a
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> > >>>> @@ -0,0 +1,53 @@
> > >>>> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
> > >>>> +From: Lennart Poettering <lennart@poettering.net>
> > >>>> +Date: Mon, 2 Mar 2015 20:55:38 +0100
> > >>>> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
> > >>>> + happy
> > >>>> +
> > >>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
> > >>>> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
> > >>>> +---
> > >>>> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
> > >>>> + 1 file changed, 5 insertions(+), 7 deletions(-)
> > >>>> +
> > >>>> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
> > >>>> +index 028c2a7..22a3a53 100644
> > >>>> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
> > >>>> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
> > >>>> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> > >>>> +                 .msg_iovlen = 1,
> > >>>> +                 .msg_name = &sockaddr,
> > >>>> +         };
> > >>>> +-        union {
> > >>>> +-                struct cmsghdr cmsghdr;
> > >>>> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
> > >>>> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
> > >>>> +-        } control;
> > >>>> ++        struct cmsghdr *control;
> > >>>> +         _cleanup_close_ int fd = -1;
> > >>>> +         struct cmsghdr *cmsg = NULL;
> > >>>> +         const char *e;
> > >>>> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> > >>>> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
> > >>>> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
> > >>>> +
> > >>>> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
> > >>>> ++
> > >>>> +         if (n_fds > 0) {
> > >>>> +-                msghdr.msg_control = &control;
> > >>>> ++                msghdr.msg_control = control;
> > >>>> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
> > >>>> +
> > >>>> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
> > >>>> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> > >>>> +                 try_without_ucred = true;
> > >>>> +                 controllen_without_ucred = msghdr.msg_controllen;
> > >>>> +
> > >>>> +-                msghdr.msg_control = &control;
> > >>>> ++                msghdr.msg_control = control;
> > >>>> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
> > >>>> +
> > >>>> +                 if (cmsg)
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..6912489
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> > >>>> @@ -0,0 +1,84 @@
> > >>>> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
> > >>>> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
> > >>>> +Date: Tue, 3 Mar 2015 00:35:08 +0100
> > >>>> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
> > >>>> + filesystems
> > >>>> +
> > >>>> +A warning is printed if ACLs cannot be retrieved for any reason other
> > >>>> +than -ENOSYS. For -ENOSYS, debug log is printed.
> > >>>> +
> > >>>> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
> > >>>> +---
> > >>>> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
> > >>>> + 1 file changed, 20 insertions(+), 16 deletions(-)
> > >>>> +
> > >>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> > >>>> +index 88ba7e4..187997e 100644
> > >>>> +--- a/src/tmpfiles/tmpfiles.c
> > >>>> ++++ b/src/tmpfiles/tmpfiles.c
> > >>>> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> > >>>> +         int r;
> > >>>> +         _cleanup_(acl_free_charpp) char *t = NULL;
> > >>>> +
> > >>>> ++        /* Returns 0 for success, positive error if already warned,
> > >>>> ++         * negative error otherwise. */
> > >>>> ++
> > >>>> +         if (modify) {
> > >>>> +                 r = acls_for_file(path, type, acl, &dup);
> > >>>> +                 if (r < 0)
> > >>>> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> > >>>> +
> > >>>> +         r = acl_set_file(path, type, dup);
> > >>>> +         if (r < 0)
> > >>>> +-                return log_error_errno(-errno,
> > >>>> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
> > >>>> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
> > >>>> +-                                       strna(t), path);
> > >>>> ++                return -log_error_errno(errno,
> > >>>> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
> > >>>> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
> > >>>> ++                                        strna(t), path);
> > >>>> ++
> > >>>> +         return 0;
> > >>>> + }
> > >>>> + #endif
> > >>>> +
> > >>>> + static int path_set_acls(Item *item, const char *path) {
> > >>>> ++        int r = 0;
> > >>>> + #ifdef HAVE_ACL
> > >>>> +-        int r;
> > >>>> +-
> > >>>> +         assert(item);
> > >>>> +         assert(path);
> > >>>> +
> > >>>> +-        if (item->acl_access) {
> > >>>> ++        if (item->acl_access)
> > >>>> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
> > >>>> +-                if (r < 0)
> > >>>> +-                        return r;
> > >>>> +-        }
> > >>>> +
> > >>>> +-        if (item->acl_default) {
> > >>>> ++        if (r == 0 && item->acl_default)
> > >>>> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
> > >>>> +-                if (r < 0)
> > >>>> +-                        return r;
> > >>>> +-        }
> > >>>> +-#endif
> > >>>> +
> > >>>> +-        return 0;
> > >>>> ++        if (r > 0)
> > >>>> ++                return -r; /* already warned */
> > >>>> ++        else if (r == -ENOTSUP) {
> > >>>> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
> > >>>> ++                return 0;
> > >>>> ++        } else if (r < 0)
> > >>>> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
> > >>>> ++#endif
> > >>>> ++        return r;
> > >>>> + }
> > >>>> +
> > >>>> + static int write_one_file(Item *i, const char *path) {
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> > >>>> new file mode 100644
> > >>>> index 0000000..a49a369
> > >>>> --- /dev/null
> > >>>> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> > >>>> @@ -0,0 +1,30 @@
> > >>>> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
> > >>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>> +Date: Tue, 3 Mar 2015 19:07:28 -0500
> > >>>> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
> > >>>> + missing
> > >>>> +
> > >>>> +On s390 (at least) /sys/class/power_supply is not present. We should
> > >>>> +treat this like if this directory was empty, and not an error.
> > >>>> +
> > >>>> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
> > >>>> +---
> > >>>> + src/shared/util.c | 2 +-
> > >>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>> +
> > >>>> +diff --git a/src/shared/util.c b/src/shared/util.c
> > >>>> +index f24b5b4..8548723 100644
> > >>>> +--- a/src/shared/util.c
> > >>>> ++++ b/src/shared/util.c
> > >>>> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
> > >>>> +
> > >>>> +         d = opendir("/sys/class/power_supply");
> > >>>> +         if (!d)
> > >>>> +-                return -errno;
> > >>>> ++                return errno == ENOENT ? true : -errno;
> > >>>> +
> > >>>> +         for (;;) {
> > >>>> +                 struct dirent *de;
> > >>>> +--
> > >>>> +1.9.1
> > >>>> +
> > >>>> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
> > >>>> index 73b930e..9c20b11 100644
> > >>>> --- a/meta/recipes-core/systemd/systemd_219.bb
> > >>>> +++ b/meta/recipes-core/systemd/systemd_219.bb
> > >>>> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> > >>>>            file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
> > >>>>            file://0010-Make-root-s-home-directory-configurable.patch \
> > >>>>            file://0011-systemd-user-avoid-using-system-auth.patch \
> > >>>> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> > >>>> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> > >>>>            file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
> > >>>> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> > >>>>            file://0014-Revert-rules-remove-firmware-loading-rules.patch \
> > >>>>            file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
> > >>>>            file://tmpfiles-pam.patch \
> > >>>> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> > >>>> 
> > >>>> S = "${WORKDIR}/git"
> > >>>> 
> > >>>> +# Appending backport fixes released for version 219-stable
> > >>>> +SRC_URI_append = "\
> > >>>> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
> > >>>> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
> > >>>> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
> > >>>> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
> > >>>> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> > >>>> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
> > >>>> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
> > >>>> +           file://0008-bootchart-fix-default-init-path.patch \
> > >>>> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
> > >>>> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
> > >>>> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
> > >>>> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
> > >>>> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
> > >>>> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
> > >>>> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
> > >>>> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
> > >>>> +           file://0017-core-rework-device-state-logic.patch \
> > >>>> +           file://0018-core-fix-return-value-on-OOM.patch \
> > >>>> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
> > >>>> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
> > >>>> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
> > >>>> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
> > >>>> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> > >>>> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
> > >>>> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> > >>>> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
> > >>>> +           "
> > >>>> +
> > >>>> SRC_URI_append_libc-uclibc = "\
> > >>>>             file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
> > >>>>            "
> > >>>> --
> > >>>> 1.9.1
> > >>>> 
> > >>> 
> > >>> 
> > >>> --
> > >>> _______________________________________________
> > >>> Openembedded-core mailing list
> > >>> Openembedded-core@lists.openembedded.org
> > >>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
> > >> 
> > >> 
> > >> 
> > > 
> > > 
> > 
> 
> 




^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-04-07 13:10           ` Bottazzini, Bruno
@ 2015-04-07 19:33             ` Khem Raj
  2015-04-09 12:57               ` Bottazzini, Bruno
  0 siblings, 1 reply; 12+ messages in thread
From: Khem Raj @ 2015-04-07 19:33 UTC (permalink / raw)
  To: Bottazzini, Bruno; +Cc: Patches and discussions about the oe-core layer

this looks ok

> On Apr 7, 2015, at 6:10 AM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
> 
> Ping
> 
>> On Qua, 2015-04-01 at 14:14 -0700, Khem Raj wrote:
>>> I will try it out. give me a day
>>> 
>>>> On Apr 1, 2015, at 2:08 PM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
>>>> 
>>>> Khem,
>>>> 
>>>> Could you verify this patch and see if this satisfies what you have
>>>> pointed previously ?
>>>> 
>>>> Do you think this patch is ready to go to master ?
>>>> 
>>>> Regards,
>>>> 
>>>> On Ter, 2015-03-31 at 17:25 -0300, Otavio Salvador wrote:
>>>>> I am not a heavy user of systemd so I prefer other people (Khem?) to
>>>>> comment on this ...
>>>>> 
>>>>> On Tue, Mar 31, 2015 at 5:21 PM, Bottazzini, Bruno
>>>>> <bruno.bottazzini@intel.com> wrote:
>>>>>> Ping
>>>>>> 
>>>>>> On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
>>>>>>> Adding patches that fix bugs for 219 version.
>>>>>>> This will get the same consistency of the stable systemd 219 version.
>>>>>>> 
>>>>>>> More details:
>>>>>>> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
>>>>>>> ---
>>>>>>> ...remote-fix-certificate-status-memory-leak.patch |  31 +
>>>>>>> ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
>>>>>>> ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
>>>>>>> ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
>>>>>>> ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
>>>>>>> .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
>>>>>>> ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
>>>>>>> .../0008-bootchart-fix-default-init-path.patch     |  44 +
>>>>>>> ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
>>>>>>> ...0-Make-root-s-home-directory-configurable.patch |  89 +-
>>>>>>> ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
>>>>>>> ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
>>>>>>> ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
>>>>>>> ...aker-dependencies-between-mount-and-devic.patch |  33 +
>>>>>>> ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
>>>>>>> ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
>>>>>>> ...l-add-some-hints-how-to-override-settings.patch |  39 +
>>>>>>> .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
>>>>>>> .../0018-core-fix-return-value-on-OOM.patch        |  26 +
>>>>>>> ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
>>>>>>> ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
>>>>>>> ...downgrade-unit-type-not-supported-message.patch |  31 +
>>>>>>> ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
>>>>>>> ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
>>>>>>> ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
>>>>>>> ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
>>>>>>> ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
>>>>>>> meta/recipes-core/systemd/systemd_219.bb           |  33 +-
>>>>>>> 28 files changed, 2050 insertions(+), 55 deletions(-)
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
>>>>>>> 
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..172bea2
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
>>>>>>> @@ -0,0 +1,31 @@
>>>>>>> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
>>>>>>> +From: Michal Schmidt <mschmidt@redhat.com>
>>>>>>> +Date: Tue, 17 Feb 2015 10:33:01 +0100
>>>>>>> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
>>>>>>> +
>>>>>>> +The output of gnutls_certificate_verification_status_print() needs to be
>>>>>>> +freed.
>>>>>>> +
>>>>>>> +Noticed this while staring at verify_cert_authorized() to see what could
>>>>>>> +possibly confuse gcc5 on armv7hl to segfault during compilation.
>>>>>>> +
>>>>>>> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
>>>>>>> +---
>>>>>>> + src/journal-remote/microhttpd-util.c | 1 +
>>>>>>> + 1 file changed, 1 insertion(+)
>>>>>>> +
>>>>>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
>>>>>>> +index 34d9337..de9c6ab 100644
>>>>>>> +--- a/src/journal-remote/microhttpd-util.c
>>>>>>> ++++ b/src/journal-remote/microhttpd-util.c
>>>>>>> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
>>>>>>> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
>>>>>>> +
>>>>>>> +         log_info("Certificate status: %s", out.data);
>>>>>>> ++        gnutls_free(out.data);
>>>>>>> +
>>>>>>> +         return status == 0 ? 0 : -EPERM;
>>>>>>> + }
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..f615876
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
>>>>>>> @@ -0,0 +1,35 @@
>>>>>>> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
>>>>>>> +From: Michal Schmidt <mschmidt@redhat.com>
>>>>>>> +Date: Tue, 17 Feb 2015 10:36:57 +0100
>>>>>>> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
>>>>>>> +
>>>>>>> +Found by Valgrind while testing the previous memory leak fix.
>>>>>>> +
>>>>>>> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
>>>>>>> +---
>>>>>>> + src/journal-remote/microhttpd-util.c | 6 +++++-
>>>>>>> + 1 file changed, 5 insertions(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
>>>>>>> +index de9c6ab..a95fff1 100644
>>>>>>> +--- a/src/journal-remote/microhttpd-util.c
>>>>>>> ++++ b/src/journal-remote/microhttpd-util.c
>>>>>>> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
>>>>>>> +         return 0;
>>>>>>> + }
>>>>>>> +
>>>>>>> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
>>>>>>> ++        gnutls_x509_crt_deinit(*p);
>>>>>>> ++}
>>>>>>> ++
>>>>>>> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
>>>>>>> +         const union MHD_ConnectionInfo *ci;
>>>>>>> +         gnutls_session_t session;
>>>>>>> +-        gnutls_x509_crt_t client_cert;
>>>>>>> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
>>>>>>> +         _cleanup_free_ char *buf = NULL;
>>>>>>> +         int r;
>>>>>>> +
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..15fa98c
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
>>>>>>> @@ -0,0 +1,28 @@
>>>>>>> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
>>>>>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
>>>>>>> +Date: Tue, 17 Feb 2015 12:47:51 +0100
>>>>>>> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
>>>>>>> +
>>>>>>> +parse_acl() returns the error instead of setting errno.
>>>>>>> +
>>>>>>> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
>>>>>>> +---
>>>>>>> + src/tmpfiles/tmpfiles.c | 2 +-
>>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
>>>>>>> +index c948d4d..88ba7e4 100644
>>>>>>> +--- a/src/tmpfiles/tmpfiles.c
>>>>>>> ++++ b/src/tmpfiles/tmpfiles.c
>>>>>>> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
>>>>>>> +          * afterwards, so the mask can be added now if necessary. */
>>>>>>> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
>>>>>>> +         if (r < 0)
>>>>>>> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
>>>>>>> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
>>>>>>> +                                   item->argument);
>>>>>>> + #else
>>>>>>> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..f43068d
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
>>>>>>> @@ -0,0 +1,26 @@
>>>>>>> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
>>>>>>> +From: Tom Gundersen <teg@jklm.no>
>>>>>>> +Date: Wed, 18 Feb 2015 14:33:50 +0100
>>>>>>> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
>>>>>>> +
>>>>>>> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
>>>>>>> +---
>>>>>>> + src/test/test-utf8.c | 2 +-
>>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
>>>>>>> +index befa385..346f852 100644
>>>>>>> +--- a/src/test/test-utf8.c
>>>>>>> ++++ b/src/test/test-utf8.c
>>>>>>> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
>>>>>>> +
>>>>>>> + static void test_utf16_to_utf8(void) {
>>>>>>> +         char *a = NULL;
>>>>>>> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
>>>>>>> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
>>>>>>> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
>>>>>>> +
>>>>>>> +         a = utf16_to_utf8(utf16, 14);
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..35fe913
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
>>>>>>> @@ -0,0 +1,131 @@
>>>>>>> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
>>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>>>>> +Date: Mon, 23 Feb 2015 23:19:54 -0500
>>>>>>> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
>>>>>>> +
>>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
>>>>>>> +https://bugs.debian.org/778656
>>>>>>> +
>>>>>>> +Status quo ante can be restored with:
>>>>>>> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
>>>>>>> +
>>>>>>> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
>>>>>>> +---
>>>>>>> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
>>>>>>> + src/shared/acl-util.h |  4 +++
>>>>>>> + 2 files changed, 81 insertions(+), 2 deletions(-)
>>>>>>> +
>>>>>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
>>>>>>> +index a4ff1ab..cbe09d7 100644
>>>>>>> +--- a/src/shared/acl-util.c
>>>>>>> ++++ b/src/shared/acl-util.c
>>>>>>> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
>>>>>>> +         return 0;
>>>>>>> + }
>>>>>>> +
>>>>>>> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
>>>>>>> ++        acl_tag_t tag_a, tag_b;
>>>>>>> ++
>>>>>>> ++        if (acl_get_tag_type(a, &tag_a) < 0)
>>>>>>> ++                return -errno;
>>>>>>> ++
>>>>>>> ++        if (acl_get_tag_type(b, &tag_b) < 0)
>>>>>>> ++                return -errno;
>>>>>>> ++
>>>>>>> ++        if (tag_a != tag_b)
>>>>>>> ++                return false;
>>>>>>> ++
>>>>>>> ++        switch (tag_a) {
>>>>>>> ++        case ACL_USER_OBJ:
>>>>>>> ++        case ACL_GROUP_OBJ:
>>>>>>> ++        case ACL_MASK:
>>>>>>> ++        case ACL_OTHER:
>>>>>>> ++                /* can have only one of those */
>>>>>>> ++                return true;
>>>>>>> ++        case ACL_USER: {
>>>>>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
>>>>>>> ++
>>>>>>> ++                uid_a = acl_get_qualifier(a);
>>>>>>> ++                if (!uid_a)
>>>>>>> ++                        return -errno;
>>>>>>> ++
>>>>>>> ++                uid_b = acl_get_qualifier(b);
>>>>>>> ++                if (!uid_b)
>>>>>>> ++                        return -errno;
>>>>>>> ++
>>>>>>> ++                return *uid_a == *uid_b;
>>>>>>> ++        }
>>>>>>> ++        case ACL_GROUP: {
>>>>>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
>>>>>>> ++
>>>>>>> ++                gid_a = acl_get_qualifier(a);
>>>>>>> ++                if (!gid_a)
>>>>>>> ++                        return -errno;
>>>>>>> ++
>>>>>>> ++                gid_b = acl_get_qualifier(b);
>>>>>>> ++                if (!gid_b)
>>>>>>> ++                        return -errno;
>>>>>>> ++
>>>>>>> ++                return *gid_a == *gid_b;
>>>>>>> ++        }
>>>>>>> ++        default:
>>>>>>> ++                assert_not_reached("Unknown acl tag type");
>>>>>>> ++        }
>>>>>>> ++}
>>>>>>> ++
>>>>>>> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
>>>>>>> ++        acl_entry_t i;
>>>>>>> ++        int r;
>>>>>>> ++
>>>>>>> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
>>>>>>> ++             r > 0;
>>>>>>> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
>>>>>>> ++
>>>>>>> ++                r = acl_entry_equal(i, entry);
>>>>>>> ++                if (r < 0)
>>>>>>> ++                        return r;
>>>>>>> ++                if (r > 0) {
>>>>>>> ++                        *out = i;
>>>>>>> ++                        return 1;
>>>>>>> ++                }
>>>>>>> ++        }
>>>>>>> ++        if (r < 0)
>>>>>>> ++                return -errno;
>>>>>>> ++        return 0;
>>>>>>> ++}
>>>>>>> ++
>>>>>>> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
>>>>>>> +         _cleanup_(acl_freep) acl_t old;
>>>>>>> +         acl_entry_t i;
>>>>>>> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
>>>>>>> +
>>>>>>> +                 acl_entry_t j;
>>>>>>> +
>>>>>>> +-                if (acl_create_entry(&old, &j) < 0)
>>>>>>> +-                        return -errno;
>>>>>>> ++                r = find_acl_entry(old, i, &j);
>>>>>>> ++                if (r < 0)
>>>>>>> ++                        return r;
>>>>>>> ++                if (r == 0)
>>>>>>> ++                        if (acl_create_entry(&old, &j) < 0)
>>>>>>> ++                                return -errno;
>>>>>>> +
>>>>>>> +                 if (acl_copy_entry(j, i) < 0)
>>>>>>> +                         return -errno;
>>>>>>> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
>>>>>>> +index 90e88ff..fdb9006 100644
>>>>>>> +--- a/src/shared/acl-util.h
>>>>>>> ++++ b/src/shared/acl-util.h
>>>>>>> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
>>>>>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
>>>>>>> + #define acl_free_charp acl_free
>>>>>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
>>>>>>> ++#define acl_free_uid_tp acl_free
>>>>>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
>>>>>>> ++#define acl_free_gid_tp acl_free
>>>>>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
>>>>>>> +
>>>>>>> + #endif
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..fc707bb
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
>>>>>>> @@ -0,0 +1,32 @@
>>>>>>> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
>>>>>>> +From: Daniel Mack <daniel@zonque.org>
>>>>>>> +Date: Tue, 24 Feb 2015 13:26:09 +0100
>>>>>>> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
>>>>>>> +
>>>>>>> +  CC       src/shared/libsystemd_shared_la-time-util.lo
>>>>>>> +src/shared/time-util.c: In function 'parse_nsec':
>>>>>>> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
>>>>>>> +                 if (!*s != 0)
>>>>>>> +                         ^
>>>>>>> +
>>>>>>> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
>>>>>>> +---
>>>>>>> + src/shared/time-util.c | 2 +-
>>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
>>>>>>> +index 947ac1f..1c36c57 100644
>>>>>>> +--- a/src/shared/time-util.c
>>>>>>> ++++ b/src/shared/time-util.c
>>>>>>> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
>>>>>>> +         s = startswith(p, "infinity");
>>>>>>> +         if (s) {
>>>>>>> +                 s += strspn(s, WHITESPACE);
>>>>>>> +-                if (!*s != 0)
>>>>>>> ++                if (*s != 0)
>>>>>>> +                         return -EINVAL;
>>>>>>> +
>>>>>>> +                 *nsec = NSEC_INFINITY;
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..161b7b5
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
>>>>>>> @@ -0,0 +1,36 @@
>>>>>>> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
>>>>>>> +From: Daniel Mack <daniel@zonque.org>
>>>>>>> +Date: Tue, 24 Feb 2015 13:27:10 +0100
>>>>>>> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
>>>>>>> +
>>>>>>> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
>>>>>>> +---
>>>>>>> + src/test/test-time.c | 6 ++++++
>>>>>>> + 1 file changed, 6 insertions(+)
>>>>>>> +
>>>>>>> +diff --git a/src/test/test-time.c b/src/test/test-time.c
>>>>>>> +index 8cfc4cc..3840fff 100644
>>>>>>> +--- a/src/test/test-time.c
>>>>>>> ++++ b/src/test/test-time.c
>>>>>>> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
>>>>>>> +         assert_se(u == 2);
>>>>>>> +         assert_se(parse_nsec(".7", &u) >= 0);
>>>>>>> +         assert_se(u == 0);
>>>>>>> ++        assert_se(parse_nsec("infinity", &u) >= 0);
>>>>>>> ++        assert_se(u == NSEC_INFINITY);
>>>>>>> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
>>>>>>> ++        assert_se(u == NSEC_INFINITY);
>>>>>>> +
>>>>>>> +         assert_se(parse_nsec(" xyz ", &u) < 0);
>>>>>>> +         assert_se(parse_nsec("", &u) < 0);
>>>>>>> +         assert_se(parse_nsec(" . ", &u) < 0);
>>>>>>> +         assert_se(parse_nsec(" 5. ", &u) < 0);
>>>>>>> +         assert_se(parse_nsec(".s ", &u) < 0);
>>>>>>> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
>>>>>>> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
>>>>>>> + }
>>>>>>> +
>>>>>>> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..7eaad1e
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
>>>>>>> @@ -0,0 +1,44 @@
>>>>>>> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
>>>>>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
>>>>>>> +Date: Tue, 24 Feb 2015 14:30:10 +0100
>>>>>>> +Subject: [PATCH 08/26] bootchart: fix default init path
>>>>>>> +
>>>>>>> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
>>>>>>> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
>>>>>>> +multi-arch systems.
>>>>>>> +
>>>>>>> +https://launchpad.net/bugs/1423867
>>>>>>> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
>>>>>>> +---
>>>>>>> + Makefile.am               | 1 +
>>>>>>> + src/bootchart/bootchart.c | 2 +-
>>>>>>> + 2 files changed, 2 insertions(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/Makefile.am b/Makefile.am
>>>>>>> +index bf04d31..cc577ce 100644
>>>>>>> +--- a/Makefile.am
>>>>>>> ++++ b/Makefile.am
>>>>>>> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
>>>>>>> +     -DKEXEC=\"$(KEXEC)\" \
>>>>>>> +     -DLIBDIR=\"$(libdir)\" \
>>>>>>> +     -DROOTLIBDIR=\"$(rootlibdir)\" \
>>>>>>> ++    -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
>>>>>>> +     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
>>>>>>> +     -I $(top_srcdir)/src \
>>>>>>> +     -I $(top_builddir)/src/shared \
>>>>>>> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
>>>>>>> +index 64a384b..175be68 100644
>>>>>>> +--- a/src/bootchart/bootchart.c
>>>>>>> ++++ b/src/bootchart/bootchart.c
>>>>>>> +@@ -76,7 +76,7 @@ int sysfd=-1;
>>>>>>> + #define DEFAULT_HZ 25.0
>>>>>>> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
>>>>>>> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
>>>>>>> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
>>>>>>> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
>>>>>>> + #define DEFAULT_OUTPUT "/run/log"
>>>>>>> +
>>>>>>> + /* graph defaults */
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..dbffa5b
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
>>>>>>> @@ -0,0 +1,44 @@
>>>>>>> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
>>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>>>>> +Date: Tue, 24 Feb 2015 10:10:04 -0500
>>>>>>> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
>>>>>>> +
>>>>>>> +It is not necessary when running as telinit, etc.
>>>>>>> +
>>>>>>> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
>>>>>>> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
>>>>>>> +---
>>>>>>> + src/systemctl/systemctl.c | 10 +++++-----
>>>>>>> + 1 file changed, 5 insertions(+), 5 deletions(-)
>>>>>>> +
>>>>>>> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
>>>>>>> +index 21cb898..6b93ec8 100644
>>>>>>> +--- a/src/systemctl/systemctl.c
>>>>>>> ++++ b/src/systemctl/systemctl.c
>>>>>>> +@@ -7204,6 +7204,11 @@ found:
>>>>>>> +                 }
>>>>>>> +         }
>>>>>>> +
>>>>>>> ++        /* Increase max number of open files to 16K if we can, we
>>>>>>> ++         * might needs this when browsing journal files, which might
>>>>>>> ++         * be split up into many files. */
>>>>>>> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
>>>>>>> ++
>>>>>>> +         return verb->dispatch(bus, argv + optind);
>>>>>>> + }
>>>>>>> +
>>>>>>> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
>>>>>>> +                 goto finish;
>>>>>>> +         }
>>>>>>> +
>>>>>>> +-        /* Increase max number of open files to 16K if we can, we
>>>>>>> +-         * might needs this when browsing journal files, which might
>>>>>>> +-         * be split up into many files. */
>>>>>>> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
>>>>>>> +-
>>>>>>> +         if (!avoid_bus())
>>>>>>> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
>>>>>>> +
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
>>>>>>> index 41b9039..ff2871b 100644
>>>>>>> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
>>>>>>> @@ -1,7 +1,7 @@
>>>>>>> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
>>>>>>> -From: Khem Raj <raj.khem@gmail.com>
>>>>>>> -Date: Fri, 20 Feb 2015 05:24:49 +0000
>>>>>>> -Subject: [PATCH 10/11] Make root's home directory configurable
>>>>>>> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
>>>>>>> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
>>>>>>> +Date: Thu, 5 Mar 2015 17:38:12 -0300
>>>>>>> +Subject: [PATCH] Make root's home directory configurable
>>>>>>> 
>>>>>>> OpenEmbedded has a configurable home directory for root. Allow
>>>>>>> systemd to be built using its idea of what root's home directory
>>>>>>> @@ -9,32 +9,31 @@ should be.
>>>>>>> 
>>>>>>> Upstream-Status: Pending
>>>>>>> 
>>>>>>> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
>>>>>>> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
>>>>>>> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
>>>>>>> +compatbile with systemd 219-stable
>>>>>>> ---
>>>>>>> - Makefile.am                       | 2 ++
>>>>>>> - configure.ac                      | 7 +++++++
>>>>>>> - src/core/unit-printf.c            | 2 +-
>>>>>>> - src/nspawn/nspawn.c               | 4 ++--
>>>>>>> - src/shared/util.c                 | 4 ++--
>>>>>>> - units/console-shell.service.m4.in | 4 ++--
>>>>>>> - units/emergency.service.in        | 4 ++--
>>>>>>> - units/rescue.service.in           | 4 ++--
>>>>>>> - 8 files changed, 20 insertions(+), 11 deletions(-)
>>>>>>> + Makefile.am                | 2 ++
>>>>>>> + configure.ac               | 7 +++++++
>>>>>>> + src/core/unit-printf.c     | 2 +-
>>>>>>> + src/nspawn/nspawn.c        | 5 ++---
>>>>>>> + src/shared/util.c          | 4 ++--
>>>>>>> + units/emergency.service.in | 4 ++--
>>>>>>> + units/rescue.service.in    | 4 ++--
>>>>>>> + 7 files changed, 18 insertions(+), 10 deletions(-)
>>>>>>> 
>>>>>>> diff --git a/Makefile.am b/Makefile.am
>>>>>>> -index 0fb3f9f..4623963 100644
>>>>>>> +index 93c0509..31ea94d 100644
>>>>>>> --- a/Makefile.am
>>>>>>> +++ b/Makefile.am
>>>>>>> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
>>>>>>> -     -DKEXEC=\"$(KEXEC)\" \
>>>>>>> -     -DLIBDIR=\"$(libdir)\" \
>>>>>>> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
>>>>>>>     -DROOTLIBDIR=\"$(rootlibdir)\" \
>>>>>>> -+    -DROOTHOMEDIR=\"$(roothomedir)\" \
>>>>>>> +     -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
>>>>>>>     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
>>>>>>> ++    -DROOTHOMEDIR=\"$(roothomedir)\" \
>>>>>>>     -I $(top_srcdir)/src \
>>>>>>>     -I $(top_builddir)/src/shared \
>>>>>>> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
>>>>>>> +     -I $(top_srcdir)/src/shared \
>>>>>>> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
>>>>>>> substitutions = \
>>>>>>>        '|rootlibexecdir=$(rootlibexecdir)|' \
>>>>>>>        '|rootbindir=$(rootbindir)|' \
>>>>>>> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
>>>>>>>        '|SYSTEMCTL=$(rootbindir)/systemctl|' \
>>>>>>>        '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
>>>>>>> diff --git a/configure.ac b/configure.ac
>>>>>>> -index a5b2e6e..55bb7d8 100644
>>>>>>> +index 01ee8dc..800a587 100644
>>>>>>> --- a/configure.ac
>>>>>>> +++ b/configure.ac
>>>>>>> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
>>>>>>> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
>>>>>>>         [],
>>>>>>>         [with_rootlibdir=${libdir}])
>>>>>>> 
>>>>>>> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
>>>>>>> AC_ARG_WITH([pamlibdir],
>>>>>>>         AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
>>>>>>>         [],
>>>>>>> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
>>>>>>> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
>>>>>>> AC_SUBST([pamconfdir], [$with_pamconfdir])
>>>>>>> AC_SUBST([rootprefix], [$with_rootprefix])
>>>>>>> AC_SUBST([rootlibdir], [$with_rootlibdir])
>>>>>>> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
>>>>>>> 
>>>>>>> AC_CONFIG_FILES([
>>>>>>>         Makefile po/Makefile.in
>>>>>>> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
>>>>>>> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
>>>>>>>         include_prefix:          ${INCLUDE_PREFIX}
>>>>>>>         lib dir:                 ${libdir}
>>>>>>>         rootlib dir:             ${with_rootlibdir}
>>>>>>> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
>>>>>>>         SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
>>>>>>>         Build Python:            ${PYTHON}
>>>>>>> diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
>>>>>>> -index 97135db..14d12f1 100644
>>>>>>> +index 7736899..ac5f008 100644
>>>>>>> --- a/src/core/unit-printf.c
>>>>>>> +++ b/src/core/unit-printf.c
>>>>>>> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
>>>>>>> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
>>>>>>>                  * best of it if we can, but fail if we can't */
>>>>>>> 
>>>>>>>                 if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
>>>>>>> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
>>>>>>>                         return -ENOTSUP;
>>>>>>> 
>>>>>>> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
>>>>>>> -index b597edb..0b32673 100644
>>>>>>> +index 08bfdcf..b44b4cd 100644
>>>>>>> --- a/src/nspawn/nspawn.c
>>>>>>> +++ b/src/nspawn/nspawn.c
>>>>>>> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
>>>>>>> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
>>>>>>> +                         r = change_uid_gid(&home);
>>>>>>>                         if (r < 0)
>>>>>>>                                 _exit(EXIT_FAILURE);
>>>>>>> -
>>>>>>> +-
>>>>>>> -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
>>>>>>> +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
>>>>>>>                             (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
>>>>>>>                             (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
>>>>>>>                                 log_oom();
>>>>>>> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
>>>>>>> -                                 execvp(argv[optind], argv + optind);
>>>>>>> - #endif /* HAVE_EXECVPE */
>>>>>>> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
>>>>>>> +                         } else if (argc > optind)
>>>>>>> +                                 execvpe(argv[optind], argv + optind, env_use);
>>>>>>>                         else {
>>>>>>> -                                chdir(home ? home : "/root");
>>>>>>> +                                chdir(home ? home : ROOTHOMEDIR);
>>>>>>> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
>>>>>>>                                 execle("/bin/sh", "-sh", NULL, env_use);
>>>>>>>                         }
>>>>>>> diff --git a/src/shared/util.c b/src/shared/util.c
>>>>>>> -index cbbe3b1..a0e3cc5 100644
>>>>>>> +index 241e752..00adab6 100644
>>>>>>> --- a/src/shared/util.c
>>>>>>> +++ b/src/shared/util.c
>>>>>>> -@@ -4609,7 +4609,7 @@ int get_user_creds(
>>>>>>> +@@ -4604,7 +4604,7 @@ int get_user_creds(
>>>>>>>                         *gid = 0;
>>>>>>> 
>>>>>>>                 if (home)
>>>>>>> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
>>>>>>> 
>>>>>>>                 if (shell)
>>>>>>>                         *shell = "/bin/sh";
>>>>>>> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
>>>>>>> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
>>>>>>>         /* Hardcode home directory for root to avoid NSS */
>>>>>>>         u = getuid();
>>>>>>>         if (u == 0) {
>>>>>>> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
>>>>>>>                 if (!h)
>>>>>>>                         return -ENOMEM;
>>>>>>> 
>>>>>>> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
>>>>>>> -index 5c80722..efde5f0 100644
>>>>>>> ---- a/units/console-shell.service.m4.in
>>>>>>> -+++ b/units/console-shell.service.m4.in
>>>>>>> -@@ -15,8 +15,8 @@ After=rc-local.service
>>>>>>> - Before=getty.target
>>>>>>> -
>>>>>>> - [Service]
>>>>>>> --Environment=HOME=/root
>>>>>>> --WorkingDirectory=/root
>>>>>>> -+Environment=HOME=@roothomedir@
>>>>>>> -+WorkingDirectory=@roothomedir@
>>>>>>> - ExecStart=-@SULOGIN@
>>>>>>> - ExecStopPost=-@SYSTEMCTL@ poweroff
>>>>>>> - Type=idle
>>>>>>> diff --git a/units/emergency.service.in b/units/emergency.service.in
>>>>>>> index 2695d7b..7f47b73 100644
>>>>>>> --- a/units/emergency.service.in
>>>>>>> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
>>>>>>> ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
>>>>>>> ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
>>>>>>> --
>>>>>>> -2.1.4
>>>>>>> +1.9.1
>>>>>>> 
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..1e4a69d
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
>>>>>>> @@ -0,0 +1,37 @@
>>>>>>> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
>>>>>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
>>>>>>> +Date: Tue, 24 Feb 2015 20:40:07 +0100
>>>>>>> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
>>>>>>> +
>>>>>>> +CID#1271344/1271345
>>>>>>> +
>>>>>>> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
>>>>>>> +---
>>>>>>> + src/shared/acl-util.c | 4 ++--
>>>>>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
>>>>>>> +
>>>>>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
>>>>>>> +index cbe09d7..e67e9ac 100644
>>>>>>> +--- a/src/shared/acl-util.c
>>>>>>> ++++ b/src/shared/acl-util.c
>>>>>>> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
>>>>>>> +                 /* can have only one of those */
>>>>>>> +                 return true;
>>>>>>> +         case ACL_USER: {
>>>>>>> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
>>>>>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
>>>>>>> +
>>>>>>> +                 uid_a = acl_get_qualifier(a);
>>>>>>> +                 if (!uid_a)
>>>>>>> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
>>>>>>> +                 return *uid_a == *uid_b;
>>>>>>> +         }
>>>>>>> +         case ACL_GROUP: {
>>>>>>> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
>>>>>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
>>>>>>> +
>>>>>>> +                 gid_a = acl_get_qualifier(a);
>>>>>>> +                 if (!gid_a)
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..dca5e20
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
>>>>>>> @@ -0,0 +1,28 @@
>>>>>>> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
>>>>>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
>>>>>>> +Date: Tue, 24 Feb 2015 18:32:31 +0200
>>>>>>> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
>>>>>>> +
>>>>>>> +If we have less samples than expected, systemd-bootchart will crash.
>>>>>>> +
>>>>>>> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
>>>>>>> +---
>>>>>>> + src/bootchart/svg.c | 2 +-
>>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
>>>>>>> +index e111fa9..144177c 100644
>>>>>>> +--- a/src/bootchart/svg.c
>>>>>>> ++++ b/src/bootchart/svg.c
>>>>>>> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
>>>>>>> +
>>>>>>> +                 ps->sample = ps->sample->next;
>>>>>>> +                 sample_hz = ps->sample;
>>>>>>> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
>>>>>>> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
>>>>>>> +                         sample_hz = sample_hz->next;
>>>>>>> +
>>>>>>> +                 /* subtract bootchart cpu utilization from total */
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..e0cb193
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
>>>>>>> @@ -0,0 +1,38 @@
>>>>>>> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
>>>>>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
>>>>>>> +Date: Mon, 23 Feb 2015 16:01:31 +0200
>>>>>>> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
>>>>>>> +
>>>>>>> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
>>>>>>> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
>>>>>>> +syscalls getrandom and memfd_create").
>>>>>>> +
>>>>>>> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
>>>>>>> +---
>>>>>>> + src/shared/missing.h | 10 ++++++++++
>>>>>>> + 1 file changed, 10 insertions(+)
>>>>>>> +
>>>>>>> +diff --git a/src/shared/missing.h b/src/shared/missing.h
>>>>>>> +index b33a70c..e72631e 100644
>>>>>>> +--- a/src/shared/missing.h
>>>>>>> ++++ b/src/shared/missing.h
>>>>>>> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
>>>>>>> + #    define __NR_getrandom 349
>>>>>>> + #  elif defined(__powerpc__)
>>>>>>> + #    define __NR_getrandom 359
>>>>>>> ++#  elif defined _MIPS_SIM
>>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
>>>>>>> ++#      define __NR_getrandom 4353
>>>>>>> ++#    endif
>>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
>>>>>>> ++#      define __NR_getrandom 6317
>>>>>>> ++#    endif
>>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
>>>>>>> ++#      define __NR_getrandom 5313
>>>>>>> ++#    endif
>>>>>>> + #  else
>>>>>>> + #    warning "__NR_getrandom unknown for your architecture"
>>>>>>> + #    define __NR_getrandom 0xffffffff
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..1b842a2
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
>>>>>>> @@ -0,0 +1,33 @@
>>>>>>> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
>>>>>>> +From: Lennart Poettering <lennart@poettering.net>
>>>>>>> +Date: Wed, 25 Feb 2015 22:05:14 +0100
>>>>>>> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
>>>>>>> + units in --user mode
>>>>>>> +
>>>>>>> +When running in user mode unmounting of mount units when a device
>>>>>>> +vanishes is unlikely to work, and even if it would work is already done
>>>>>>> +by PID 1 anyway. HEnce, when creating implicit dependencies between
>>>>>>> +mount units and their backing devices, created a Wants= type dependency
>>>>>>> +in --user mode, but leave a BindsTo= dependency in --system mode.
>>>>>>> +
>>>>>>> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
>>>>>>> +---
>>>>>>> + src/core/unit.c | 2 +-
>>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
>>>>>>> +index ee8e607..9f1e55e 100644
>>>>>>> +--- a/src/core/unit.c
>>>>>>> ++++ b/src/core/unit.c
>>>>>>> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
>>>>>>> +         if (r < 0)
>>>>>>> +                 return r;
>>>>>>> +
>>>>>>> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
>>>>>>> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
>>>>>>> +         if (r < 0)
>>>>>>> +                 return r;
>>>>>>> +
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..92c4b8f
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
>>>>>>> @@ -0,0 +1,43 @@
>>>>>>> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
>>>>>>> +From: Colin Walters <walters@verbum.org>
>>>>>>> +Date: Tue, 17 Feb 2015 13:47:34 -0500
>>>>>>> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
>>>>>>> + caused it
>>>>>>> +
>>>>>>> +I'm trying to track down a relatively recent change in systemd
>>>>>>> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
>>>>>>> +
>>>>>>> +Systemd started to stop sysroot.mount, and this patch should help
>>>>>>> +me debug why at least.
>>>>>>> +
>>>>>>> +While we're here, "break" on the first unit we find that will
>>>>>>> +deactivate, as there's no point in further iteration.
>>>>>>> +
>>>>>>> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
>>>>>>> +---
>>>>>>> + src/core/unit.c | 4 +++-
>>>>>>> + 1 file changed, 3 insertions(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
>>>>>>> +index 9f1e55e..563f6fe 100644
>>>>>>> +--- a/src/core/unit.c
>>>>>>> ++++ b/src/core/unit.c
>>>>>>> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
>>>>>>> +                         continue;
>>>>>>> +
>>>>>>> +                 stop = true;
>>>>>>> ++                break;
>>>>>>> +         }
>>>>>>> +
>>>>>>> +         if (!stop)
>>>>>>> +                 return;
>>>>>>> +
>>>>>>> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
>>>>>>> ++        assert(other);
>>>>>>> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
>>>>>>> +
>>>>>>> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
>>>>>>> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..46c25bd
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
>>>>>>> @@ -0,0 +1,30 @@
>>>>>>> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
>>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>>>>> +Date: Thu, 26 Feb 2015 19:00:11 -0500
>>>>>>> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
>>>>>>> + debug
>>>>>>> +
>>>>>>> +Printing it at info level was tedious. We don't do that for any other
>>>>>>> +overrides.
>>>>>>> +
>>>>>>> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
>>>>>>> +---
>>>>>>> + src/sysctl/sysctl.c | 2 +-
>>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
>>>>>>> +index 275a5b7..2415d84 100644
>>>>>>> +--- a/src/sysctl/sysctl.c
>>>>>>> ++++ b/src/sysctl/sysctl.c
>>>>>>> +@@ -176,7 +176,7 @@ found:
>>>>>>> +                         if (streq(value, existing))
>>>>>>> +                                 continue;
>>>>>>> +
>>>>>>> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
>>>>>>> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
>>>>>>> +                         free(hashmap_remove(sysctl_options, p));
>>>>>>> +                         free(v);
>>>>>>> +                 }
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..87dce1f
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
>>>>>>> @@ -0,0 +1,39 @@
>>>>>>> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
>>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>>>>> +Date: Thu, 26 Feb 2015 19:05:51 -0500
>>>>>>> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
>>>>>>> +
>>>>>>> +Also a link to decent documentation for sysrq keys. It is surprising
>>>>>>> +hard to find.
>>>>>>> +
>>>>>>> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
>>>>>>> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
>>>>>>> +---
>>>>>>> + sysctl.d/50-default.conf | 9 ++++++++-
>>>>>>> + 1 file changed, 8 insertions(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
>>>>>>> +index f189233..def151b 100644
>>>>>>> +--- a/sysctl.d/50-default.conf
>>>>>>> ++++ b/sysctl.d/50-default.conf
>>>>>>> +@@ -5,9 +5,16 @@
>>>>>>> + #  the Free Software Foundation; either version 2.1 of the License, or
>>>>>>> + #  (at your option) any later version.
>>>>>>> +
>>>>>>> +-# See sysctl.d(5) and core(5) for for details.
>>>>>>> ++# See sysctl.d(5) and core(5) for for documentation.
>>>>>>> ++
>>>>>>> ++# To override settings in this file, create a local file in /etc
>>>>>>> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
>>>>>>> ++# there.
>>>>>>> +
>>>>>>> + # System Request functionality of the kernel (SYNC)
>>>>>>> ++#
>>>>>>> ++# Use kernel.sysrq = 1 to allow all keys.
>>>>>>> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
>>>>>>> + kernel.sysrq = 16
>>>>>>> +
>>>>>>> + # Append the PID to the core filename
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..a3ab3e4
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
>>>>>>> @@ -0,0 +1,912 @@
>>>>>>> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
>>>>>>> +From: Lennart Poettering <lennart@poettering.net>
>>>>>>> +Date: Fri, 27 Feb 2015 21:55:08 +0100
>>>>>>> +Subject: [PATCH 17/26] core: rework device state logic
>>>>>>> +
>>>>>>> +This change introduces a new state "tentative" for device units. Device
>>>>>>> +units are considered "plugged" when udev announced them, "dead" when
>>>>>>> +they are not available in the kernel, and "tentative" when they are
>>>>>>> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
>>>>>>> +announced via udev.
>>>>>>> +
>>>>>>> +This should fix a race when device nodes (like loop devices) are created
>>>>>>> +and immediately mounted. Previously, systemd might end up seeing the
>>>>>>> +mount unit before the device, and would thus pull down the mount because
>>>>>>> +its BindTo dependency on the device would not be fulfilled.
>>>>>>> +
>>>>>>> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
>>>>>>> +---
>>>>>>> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
>>>>>>> + src/core/device.h |  14 ++-
>>>>>>> + src/core/mount.c  |  46 ++++---
>>>>>>> + src/core/swap.c   |  32 +++--
>>>>>>> + src/core/swap.h   |   4 +-
>>>>>>> + src/core/unit.c   |   1 -
>>>>>>> + 6 files changed, 285 insertions(+), 180 deletions(-)
>>>>>>> +
>>>>>>> +diff --git a/src/core/device.c b/src/core/device.c
>>>>>>> +index d3deac3..75b9a46 100644
>>>>>>> +--- a/src/core/device.c
>>>>>>> ++++ b/src/core/device.c
>>>>>>> +@@ -36,7 +36,8 @@
>>>>>>> +
>>>>>>> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
>>>>>>> +         [DEVICE_DEAD] = UNIT_INACTIVE,
>>>>>>> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
>>>>>>> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
>>>>>>> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
>>>>>>> + };
>>>>>>> +
>>>>>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
>>>>>>> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
>>>>>>> +         d->sysfs = NULL;
>>>>>>> + }
>>>>>>> +
>>>>>>> ++static int device_set_sysfs(Device *d, const char *sysfs) {
>>>>>>> ++        Device *first;
>>>>>>> ++        char *copy;
>>>>>>> ++        int r;
>>>>>>> ++
>>>>>>> ++        assert(d);
>>>>>>> ++
>>>>>>> ++        if (streq_ptr(d->sysfs, sysfs))
>>>>>>> ++                return 0;
>>>>>>> ++
>>>>>>> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
>>>>>>> ++        if (r < 0)
>>>>>>> ++                return r;
>>>>>>> ++
>>>>>>> ++        copy = strdup(sysfs);
>>>>>>> ++        if (!copy)
>>>>>>> ++                return -ENOMEM;
>>>>>>> ++
>>>>>>> ++        device_unset_sysfs(d);
>>>>>>> ++
>>>>>>> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
>>>>>>> ++        LIST_PREPEND(same_sysfs, first, d);
>>>>>>> ++
>>>>>>> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
>>>>>>> ++        if (r < 0) {
>>>>>>> ++                LIST_REMOVE(same_sysfs, first, d);
>>>>>>> ++                free(copy);
>>>>>>> ++                return r;
>>>>>>> ++        }
>>>>>>> ++
>>>>>>> ++        d->sysfs = copy;
>>>>>>> ++
>>>>>>> ++        return 0;
>>>>>>> ++}
>>>>>>> ++
>>>>>>> + static void device_init(Unit *u) {
>>>>>>> +         Device *d = DEVICE(u);
>>>>>>> +
>>>>>>> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
>>>>>>> +         assert(d);
>>>>>>> +         assert(d->state == DEVICE_DEAD);
>>>>>>> +
>>>>>>> +-        if (d->sysfs)
>>>>>>> ++        if (d->found & DEVICE_FOUND_UDEV)
>>>>>>> ++                /* If udev says the device is around, it's around */
>>>>>>> +                 device_set_state(d, DEVICE_PLUGGED);
>>>>>>> ++        else if (d->found != DEVICE_NOT_FOUND)
>>>>>>> ++                /* If a device is found in /proc/self/mountinfo or
>>>>>>> ++                 * /proc/swaps, it's "tentatively" around. */
>>>>>>> ++                device_set_state(d, DEVICE_TENTATIVE);
>>>>>>> +
>>>>>>> +         return 0;
>>>>>>> + }
>>>>>>> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
>>>>>>> +         return device_state_to_string(DEVICE(u)->state);
>>>>>>> + }
>>>>>>> +
>>>>>>> +-static int device_add_escaped_name(Unit *u, const char *dn) {
>>>>>>> +-        _cleanup_free_ char *e = NULL;
>>>>>>> +-        int r;
>>>>>>> +-
>>>>>>> +-        assert(u);
>>>>>>> +-        assert(dn);
>>>>>>> +-        assert(dn[0] == '/');
>>>>>>> +-
>>>>>>> +-        e = unit_name_from_path(dn, ".device");
>>>>>>> +-        if (!e)
>>>>>>> +-                return -ENOMEM;
>>>>>>> +-
>>>>>>> +-        r = unit_add_name(u, e);
>>>>>>> +-        if (r < 0 && r != -EEXIST)
>>>>>>> +-                return r;
>>>>>>> +-
>>>>>>> +-        return 0;
>>>>>>> +-}
>>>>>>> +-
>>>>>>> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
>>>>>>> +-        _cleanup_free_ char *e = NULL;
>>>>>>> +-        Unit *u;
>>>>>>> +-
>>>>>>> +-        assert(m);
>>>>>>> +-        assert(dn);
>>>>>>> +-        assert(dn[0] == '/');
>>>>>>> +-        assert(_u);
>>>>>>> +-
>>>>>>> +-        e = unit_name_from_path(dn, ".device");
>>>>>>> +-        if (!e)
>>>>>>> +-                return -ENOMEM;
>>>>>>> +-
>>>>>>> +-        u = manager_get_unit(m, e);
>>>>>>> +-        if (u) {
>>>>>>> +-                *_u = u;
>>>>>>> +-                return 1;
>>>>>>> +-        }
>>>>>>> +-
>>>>>>> +-        return 0;
>>>>>>> +-}
>>>>>>> +-
>>>>>>> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
>>>>>>> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
>>>>>>> +         const char *model;
>>>>>>> ++        int r;
>>>>>>> +
>>>>>>> +         assert(u);
>>>>>>> +         assert(dev);
>>>>>>> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
>>>>>>> +
>>>>>>> +                         j = strjoin(model, " ", label, NULL);
>>>>>>> +                         if (j)
>>>>>>> +-                                return unit_set_description(u, j);
>>>>>>> +-                }
>>>>>>> ++                                r = unit_set_description(u, j);
>>>>>>> ++                } else
>>>>>>> ++                        r = unit_set_description(u, model);
>>>>>>> ++        } else
>>>>>>> ++                r = unit_set_description(u, path);
>>>>>>> +
>>>>>>> +-                return unit_set_description(u, model);
>>>>>>> +-        }
>>>>>>> ++        if (r < 0)
>>>>>>> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
>>>>>>> +
>>>>>>> +-        return unit_set_description(u, path);
>>>>>>> ++        return r;
>>>>>>> + }
>>>>>>> +
>>>>>>> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
>>>>>>> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
>>>>>>> +
>>>>>>> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
>>>>>>> +                 if (!n)
>>>>>>> +-                        return -ENOMEM;
>>>>>>> ++                        return log_oom();
>>>>>>> +
>>>>>>> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
>>>>>>> +                 if (r < 0)
>>>>>>> +-                        return r;
>>>>>>> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
>>>>>>> +         }
>>>>>>> +         if (!isempty(state))
>>>>>>> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
>>>>>>> +-                                 property, strna(udev_device_get_syspath(dev)));
>>>>>>> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
>>>>>>> +
>>>>>>> +         return 0;
>>>>>>> + }
>>>>>>> +
>>>>>>> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
>>>>>>> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
>>>>>>> ++        _cleanup_free_ char *e = NULL;
>>>>>>> +         const char *sysfs;
>>>>>>> +         Unit *u = NULL;
>>>>>>> +         bool delete;
>>>>>>> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>>>>>>> +         if (!sysfs)
>>>>>>> +                 return 0;
>>>>>>> +
>>>>>>> +-        r = device_find_escape_name(m, path, &u);
>>>>>>> +-        if (r < 0)
>>>>>>> +-                return r;
>>>>>>> ++        e = unit_name_from_path(path, ".device");
>>>>>>> ++        if (!e)
>>>>>>> ++                return log_oom();
>>>>>>> ++
>>>>>>> ++        u = manager_get_unit(m, e);
>>>>>>> +
>>>>>>> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
>>>>>>> ++        if (u &&
>>>>>>> ++            DEVICE(u)->sysfs &&
>>>>>>> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
>>>>>>> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
>>>>>>> +                 return -EEXIST;
>>>>>>> ++        }
>>>>>>> +
>>>>>>> +         if (!u) {
>>>>>>> +                 delete = true;
>>>>>>> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>>>>>>> +                 if (!u)
>>>>>>> +                         return log_oom();
>>>>>>> +
>>>>>>> +-                r = device_add_escaped_name(u, path);
>>>>>>> ++                r = unit_add_name(u, e);
>>>>>>> +                 if (r < 0)
>>>>>>> +                         goto fail;
>>>>>>> +
>>>>>>> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>>>>>>> +          * actually been seen yet ->sysfs will not be
>>>>>>> +          * initialized. Hence initialize it if necessary. */
>>>>>>> +
>>>>>>> +-        if (!DEVICE(u)->sysfs) {
>>>>>>> +-                Device *first;
>>>>>>> +-
>>>>>>> +-                DEVICE(u)->sysfs = strdup(sysfs);
>>>>>>> +-                if (!DEVICE(u)->sysfs) {
>>>>>>> +-                        r = -ENOMEM;
>>>>>>> +-                        goto fail;
>>>>>>> +-                }
>>>>>>> +-
>>>>>>> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
>>>>>>> +-                if (r < 0)
>>>>>>> +-                        goto fail;
>>>>>>> +-
>>>>>>> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
>>>>>>> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
>>>>>>> +-
>>>>>>> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
>>>>>>> +-                if (r < 0)
>>>>>>> +-                        goto fail;
>>>>>>> +-        }
>>>>>>> +-
>>>>>>> +-        device_make_description(u, dev, path);
>>>>>>> ++        r = device_set_sysfs(DEVICE(u), sysfs);
>>>>>>> ++        if (r < 0)
>>>>>>> ++                goto fail;
>>>>>>> +
>>>>>>> +-        if (main) {
>>>>>>> +-                /* The additional systemd udev properties we only
>>>>>>> +-                 * interpret for the main object */
>>>>>>> ++        (void) device_update_description(u, dev, path);
>>>>>>> +
>>>>>>> +-                r = device_add_udev_wants(u, dev);
>>>>>>> +-                if (r < 0)
>>>>>>> +-                        goto fail;
>>>>>>> +-        }
>>>>>>> ++        /* The additional systemd udev properties we only interpret
>>>>>>> ++         * for the main object */
>>>>>>> ++        if (main)
>>>>>>> ++                (void) device_add_udev_wants(u, dev);
>>>>>>> +
>>>>>>> +         /* Note that this won't dispatch the load queue, the caller
>>>>>>> +          * has to do that if needed and appropriate */
>>>>>>> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
>>>>>>> +         return 0;
>>>>>>> +
>>>>>>> + fail:
>>>>>>> +-        log_warning_errno(r, "Failed to load device unit: %m");
>>>>>>> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
>>>>>>> +
>>>>>>> +         if (delete && u)
>>>>>>> +                 unit_free(u);
>>>>>>> +@@ -342,7 +331,7 @@ fail:
>>>>>>> +         return r;
>>>>>>> + }
>>>>>>> +
>>>>>>> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
>>>>>>> ++static int device_process_new(Manager *m, struct udev_device *dev) {
>>>>>>> +         const char *sysfs, *dn, *alias;
>>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
>>>>>>> +         int r;
>>>>>>> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>>>>>>> +                 return 0;
>>>>>>> +
>>>>>>> +         /* Add the main unit named after the sysfs path */
>>>>>>> +-        r = device_update_unit(m, dev, sysfs, true);
>>>>>>> ++        r = device_setup_unit(m, dev, sysfs, true);
>>>>>>> +         if (r < 0)
>>>>>>> +                 return r;
>>>>>>> +
>>>>>>> +         /* Add an additional unit for the device node */
>>>>>>> +         dn = udev_device_get_devnode(dev);
>>>>>>> +         if (dn)
>>>>>>> +-                device_update_unit(m, dev, dn, false);
>>>>>>> ++                (void) device_setup_unit(m, dev, dn, false);
>>>>>>> +
>>>>>>> +         /* Add additional units for all symlinks */
>>>>>>> +         first = udev_device_get_devlinks_list_entry(dev);
>>>>>>> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>>>>>>> +                             st.st_rdev != udev_device_get_devnum(dev))
>>>>>>> +                                 continue;
>>>>>>> +
>>>>>>> +-                device_update_unit(m, dev, p, false);
>>>>>>> ++                (void) device_setup_unit(m, dev, p, false);
>>>>>>> +         }
>>>>>>> +
>>>>>>> +         /* Add additional units for all explicitly configured
>>>>>>> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>>>>>>> +                         e[l] = 0;
>>>>>>> +
>>>>>>> +                         if (path_is_absolute(e))
>>>>>>> +-                                device_update_unit(m, dev, e, false);
>>>>>>> ++                                (void) device_setup_unit(m, dev, e, false);
>>>>>>> +                         else
>>>>>>> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
>>>>>>> +                 }
>>>>>>> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
>>>>>>> +         return 0;
>>>>>>> + }
>>>>>>> +
>>>>>>> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
>>>>>>> +-        const char *sysfs;
>>>>>>> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
>>>>>>> ++        DeviceFound n;
>>>>>>> ++
>>>>>>> ++        assert(d);
>>>>>>> ++
>>>>>>> ++        n = add ? (d->found | found) : (d->found & ~found);
>>>>>>> ++        if (n == d->found)
>>>>>>> ++                return;
>>>>>>> ++
>>>>>>> ++        d->found = n;
>>>>>>> ++
>>>>>>> ++        if (now) {
>>>>>>> ++                if (d->found & DEVICE_FOUND_UDEV)
>>>>>>> ++                        device_set_state(d, DEVICE_PLUGGED);
>>>>>>> ++                else if (d->found != DEVICE_NOT_FOUND)
>>>>>>> ++                        device_set_state(d, DEVICE_TENTATIVE);
>>>>>>> ++                else
>>>>>>> ++                        device_set_state(d, DEVICE_DEAD);
>>>>>>> ++        }
>>>>>>> ++}
>>>>>>> ++
>>>>>>> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
>>>>>>> +         Device *d, *l;
>>>>>>> +
>>>>>>> +         assert(m);
>>>>>>> +-        assert(dev);
>>>>>>> ++        assert(sysfs);
>>>>>>> +
>>>>>>> +-        sysfs = udev_device_get_syspath(dev);
>>>>>>> +-        if (!sysfs)
>>>>>>> +-                return;
>>>>>>> ++        if (found == DEVICE_NOT_FOUND)
>>>>>>> ++                return 0;
>>>>>>> +
>>>>>>> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
>>>>>>> +         LIST_FOREACH(same_sysfs, d, l)
>>>>>>> +-                device_set_state(d, DEVICE_PLUGGED);
>>>>>>> ++                device_update_found_one(d, add, found, now);
>>>>>>> ++
>>>>>>> ++        return 0;
>>>>>>> + }
>>>>>>> +
>>>>>>> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
>>>>>>> +-        const char *sysfs;
>>>>>>> +-        Device *d;
>>>>>>> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
>>>>>>> ++        _cleanup_free_ char *e = NULL;
>>>>>>> ++        Unit *u;
>>>>>>> +
>>>>>>> +         assert(m);
>>>>>>> +-        assert(dev);
>>>>>>> ++        assert(path);
>>>>>>> +
>>>>>>> +-        sysfs = udev_device_get_syspath(dev);
>>>>>>> +-        if (!sysfs)
>>>>>>> +-                return -ENOMEM;
>>>>>>> ++        if (found == DEVICE_NOT_FOUND)
>>>>>>> ++                return 0;
>>>>>>> +
>>>>>>> +-        /* Remove all units of this sysfs path */
>>>>>>> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
>>>>>>> +-                device_unset_sysfs(d);
>>>>>>> +-                device_set_state(d, DEVICE_DEAD);
>>>>>>> +-        }
>>>>>>> ++        e = unit_name_from_path(path, ".device");
>>>>>>> ++        if (!e)
>>>>>>> ++                return log_oom();
>>>>>>> +
>>>>>>> ++        u = manager_get_unit(m, e);
>>>>>>> ++        if (!u)
>>>>>>> ++                return 0;
>>>>>>> ++
>>>>>>> ++        device_update_found_one(DEVICE(u), add, found, now);
>>>>>>> +         return 0;
>>>>>>> + }
>>>>>>> +
>>>>>>> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
>>>>>>> +         return parse_boolean(ready) != 0;
>>>>>>> + }
>>>>>>> +
>>>>>>> +-static int device_process_new_path(Manager *m, const char *path) {
>>>>>>> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>>>>>>> +-
>>>>>>> +-        assert(m);
>>>>>>> +-        assert(path);
>>>>>>> +-
>>>>>>> +-        dev = udev_device_new_from_syspath(m->udev, path);
>>>>>>> +-        if (!dev)
>>>>>>> +-                return log_oom();
>>>>>>> +-
>>>>>>> +-        if (!device_is_ready(dev))
>>>>>>> +-                return 0;
>>>>>>> +-
>>>>>>> +-        return device_process_new_device(m, dev);
>>>>>>> +-}
>>>>>>> +-
>>>>>>> + static Unit *device_following(Unit *u) {
>>>>>>> +         Device *d = DEVICE(u);
>>>>>>> +         Device *other, *first = NULL;
>>>>>>> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
>>>>>>> +                 goto fail;
>>>>>>> +
>>>>>>> +         first = udev_enumerate_get_list_entry(e);
>>>>>>> +-        udev_list_entry_foreach(item, first)
>>>>>>> +-                device_process_new_path(m, udev_list_entry_get_name(item));
>>>>>>> ++        udev_list_entry_foreach(item, first) {
>>>>>>> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>>>>>>> ++                const char *sysfs;
>>>>>>> ++
>>>>>>> ++                sysfs = udev_list_entry_get_name(item);
>>>>>>> ++
>>>>>>> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
>>>>>>> ++                if (!dev) {
>>>>>>> ++                        log_oom();
>>>>>>> ++                        continue;
>>>>>>> ++                }
>>>>>>> ++
>>>>>>> ++                if (!device_is_ready(dev))
>>>>>>> ++                        continue;
>>>>>>> ++
>>>>>>> ++                (void) device_process_new(m, dev);
>>>>>>> ++
>>>>>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
>>>>>>> ++        }
>>>>>>> +
>>>>>>> +         return 0;
>>>>>>> +
>>>>>>> + fail:
>>>>>>> ++        log_error_errno(r, "Failed to enumerate devices: %m");
>>>>>>> ++
>>>>>>> +         device_shutdown(m);
>>>>>>> +         return r;
>>>>>>> + }
>>>>>>> +@@ -619,7 +634,7 @@ fail:
>>>>>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
>>>>>>> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>>>>>>> +         Manager *m = userdata;
>>>>>>> +-        const char *action;
>>>>>>> ++        const char *action, *sysfs;
>>>>>>> +         int r;
>>>>>>> +
>>>>>>> +         assert(m);
>>>>>>> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
>>>>>>> +         if (!dev)
>>>>>>> +                 return 0;
>>>>>>> +
>>>>>>> ++        sysfs = udev_device_get_syspath(dev);
>>>>>>> ++        if (!sysfs) {
>>>>>>> ++                log_error("Failed to get udev sys path.");
>>>>>>> ++                return 0;
>>>>>>> ++        }
>>>>>>> ++
>>>>>>> +         action = udev_device_get_action(dev);
>>>>>>> +         if (!action) {
>>>>>>> +                 log_error("Failed to get udev action string.");
>>>>>>> +                 return 0;
>>>>>>> +         }
>>>>>>> +
>>>>>>> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
>>>>>>> +-                r = device_process_removed_device(m, dev);
>>>>>>> +-                if (r < 0)
>>>>>>> +-                        log_error_errno(r, "Failed to process device remove event: %m");
>>>>>>> +-
>>>>>>> +-                r = swap_process_removed_device(m, dev);
>>>>>>> ++        if (streq(action, "remove"))  {
>>>>>>> ++                r = swap_process_device_remove(m, dev);
>>>>>>> +                 if (r < 0)
>>>>>>> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
>>>>>>> +
>>>>>>> +-        } else {
>>>>>>> +-                r = device_process_new_device(m, dev);
>>>>>>> +-                if (r < 0)
>>>>>>> +-                        log_error_errno(r, "Failed to process device new event: %m");
>>>>>>> ++                /* If we get notified that a device was removed by
>>>>>>> ++                 * udev, then it's completely gone, hence unset all
>>>>>>> ++                 * found bits */
>>>>>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
>>>>>>> +
>>>>>>> +-                r = swap_process_new_device(m, dev);
>>>>>>> ++        } else if (device_is_ready(dev)) {
>>>>>>> ++
>>>>>>> ++                (void) device_process_new(m, dev);
>>>>>>> ++
>>>>>>> ++                r = swap_process_device_new(m, dev);
>>>>>>> +                 if (r < 0)
>>>>>>> +                         log_error_errno(r, "Failed to process swap device new event: %m");
>>>>>>> +
>>>>>>> +                 manager_dispatch_load_queue(m);
>>>>>>> +
>>>>>>> +-                device_set_path_plugged(m, dev);
>>>>>>> ++                /* The device is found now, set the udev found bit */
>>>>>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
>>>>>>> ++
>>>>>>> ++        } else {
>>>>>>> ++                /* The device is nominally around, but not ready for
>>>>>>> ++                 * us. Hence unset the udev bit, but leave the rest
>>>>>>> ++                 * around. */
>>>>>>> ++
>>>>>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
>>>>>>> +         }
>>>>>>> +
>>>>>>> +         return 0;
>>>>>>> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
>>>>>>> +         return read_only <= 0;
>>>>>>> + }
>>>>>>> +
>>>>>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
>>>>>>> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
>>>>>>> ++        struct stat st;
>>>>>>> ++
>>>>>>> ++        assert(m);
>>>>>>> ++        assert(node);
>>>>>>> ++
>>>>>>> ++        /* This is called whenever we find a device referenced in
>>>>>>> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
>>>>>>> ++         * mounted/enabled at a time where udev has not finished
>>>>>>> ++         * probing it yet, and we thus haven't learned about it
>>>>>>> ++         * yet. In this case we will set the device unit to
>>>>>>> ++         * "tentative" state. */
>>>>>>> ++
>>>>>>> ++        if (add) {
>>>>>>> ++                if (!path_startswith(node, "/dev"))
>>>>>>> ++                        return 0;
>>>>>>> ++
>>>>>>> ++                if (stat(node, &st) < 0) {
>>>>>>> ++                        if (errno == ENOENT)
>>>>>>> ++                                return 0;
>>>>>>> ++
>>>>>>> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
>>>>>>> ++                }
>>>>>>> ++
>>>>>>> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
>>>>>>> ++                        return 0;
>>>>>>> ++
>>>>>>> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
>>>>>>> ++                if (!dev) {
>>>>>>> ++                        if (errno == ENOENT)
>>>>>>> ++                                return 0;
>>>>>>> ++
>>>>>>> ++                        return log_oom();
>>>>>>> ++                }
>>>>>>> ++
>>>>>>> ++                /* If the device is known in the kernel and newly
>>>>>>> ++                 * appeared, then we'll create a device unit for it,
>>>>>>> ++                 * under the name referenced in /proc/swaps or
>>>>>>> ++                 * /proc/self/mountinfo. */
>>>>>>> ++
>>>>>>> ++                (void) device_setup_unit(m, dev, node, false);
>>>>>>> ++        }
>>>>>>> ++
>>>>>>> ++        /* Update the device unit's state, should it exist */
>>>>>>> ++        return device_update_found_by_name(m, node, add, found, now);
>>>>>>> ++}
>>>>>>> ++
>>>>>>> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
>>>>>>> +         [DEVICE_DEAD] = "dead",
>>>>>>> +-        [DEVICE_PLUGGED] = "plugged"
>>>>>>> ++        [DEVICE_TENTATIVE] = "tentative",
>>>>>>> ++        [DEVICE_PLUGGED] = "plugged",
>>>>>>> + };
>>>>>>> +
>>>>>>> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
>>>>>>> +diff --git a/src/core/device.h b/src/core/device.h
>>>>>>> +index bb7ae07..0609b20 100644
>>>>>>> +--- a/src/core/device.h
>>>>>>> ++++ b/src/core/device.h
>>>>>>> +@@ -29,20 +29,28 @@ typedef struct Device Device;
>>>>>>> +  * simplifies the state engine greatly */
>>>>>>> + typedef enum DeviceState {
>>>>>>> +         DEVICE_DEAD,
>>>>>>> +-        DEVICE_PLUGGED,
>>>>>>> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
>>>>>>> ++        DEVICE_PLUGGED,   /* announced by udev */
>>>>>>> +         _DEVICE_STATE_MAX,
>>>>>>> +         _DEVICE_STATE_INVALID = -1
>>>>>>> + } DeviceState;
>>>>>>> +
>>>>>>> ++typedef enum DeviceFound {
>>>>>>> ++        DEVICE_NOT_FOUND = 0,
>>>>>>> ++        DEVICE_FOUND_UDEV = 1,
>>>>>>> ++        DEVICE_FOUND_MOUNT = 2,
>>>>>>> ++        DEVICE_FOUND_SWAP = 4,
>>>>>>> ++} DeviceFound;
>>>>>>> ++
>>>>>>> + struct Device {
>>>>>>> +         Unit meta;
>>>>>>> +
>>>>>>> +         char *sysfs;
>>>>>>> ++        DeviceFound found;
>>>>>>> +
>>>>>>> +         /* In order to be able to distinguish dependencies on
>>>>>>> +         different device nodes we might end up creating multiple
>>>>>>> +         devices for the same sysfs path. We chain them up here. */
>>>>>>> +-
>>>>>>> +         LIST_FIELDS(struct Device, same_sysfs);
>>>>>>> +
>>>>>>> +         DeviceState state;
>>>>>>> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
>>>>>>> +
>>>>>>> + const char* device_state_to_string(DeviceState i) _const_;
>>>>>>> + DeviceState device_state_from_string(const char *s) _pure_;
>>>>>>> ++
>>>>>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
>>>>>>> +diff --git a/src/core/mount.c b/src/core/mount.c
>>>>>>> +index f3977e6..c971330 100644
>>>>>>> +--- a/src/core/mount.c
>>>>>>> ++++ b/src/core/mount.c
>>>>>>> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
>>>>>>> +         return 0;
>>>>>>> + }
>>>>>>> +
>>>>>>> +-static int mount_add_one(
>>>>>>> ++static int mount_setup_unit(
>>>>>>> +                 Manager *m,
>>>>>>> +                 const char *what,
>>>>>>> +                 const char *where,
>>>>>>> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
>>>>>>> +
>>>>>>> +                 u = unit_new(m, sizeof(Mount));
>>>>>>> +                 if (!u)
>>>>>>> +-                        return -ENOMEM;
>>>>>>> ++                        return log_oom();
>>>>>>> +
>>>>>>> +                 r = unit_add_name(u, e);
>>>>>>> +                 if (r < 0)
>>>>>>> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
>>>>>>> +         return 0;
>>>>>>> +
>>>>>>> + fail:
>>>>>>> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
>>>>>>> ++
>>>>>>> +         if (delete && u)
>>>>>>> +                 unit_free(u);
>>>>>>> +
>>>>>>> +@@ -1554,33 +1556,36 @@ fail:
>>>>>>> + }
>>>>>>> +
>>>>>>> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
>>>>>>> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
>>>>>>> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
>>>>>>> +-        struct libmnt_fs *fs;
>>>>>>> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
>>>>>>> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
>>>>>>> +         int r = 0;
>>>>>>> +
>>>>>>> +         assert(m);
>>>>>>> +
>>>>>>> +-        tb = mnt_new_table();
>>>>>>> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
>>>>>>> +-        if (!tb || !itr)
>>>>>>> ++        t = mnt_new_table();
>>>>>>> ++        if (!t)
>>>>>>> +                 return log_oom();
>>>>>>> +
>>>>>>> +-        r = mnt_table_parse_mtab(tb, NULL);
>>>>>>> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
>>>>>>> ++        if (!i)
>>>>>>> ++                return log_oom();
>>>>>>> ++
>>>>>>> ++        r = mnt_table_parse_mtab(t, NULL);
>>>>>>> +         if (r < 0)
>>>>>>> +-                return r;
>>>>>>> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
>>>>>>> +
>>>>>>> +         r = 0;
>>>>>>> +         for (;;) {
>>>>>>> +                 const char *device, *path, *options, *fstype;
>>>>>>> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
>>>>>>> ++                struct libmnt_fs *fs;
>>>>>>> +                 int k;
>>>>>>> +
>>>>>>> +-                k = mnt_table_next_fs(tb, itr, &fs);
>>>>>>> ++                k = mnt_table_next_fs(t, i, &fs);
>>>>>>> +                 if (k == 1)
>>>>>>> +                         break;
>>>>>>> +-                else if (k < 0)
>>>>>>> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
>>>>>>> ++                if (k < 0)
>>>>>>> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
>>>>>>> +
>>>>>>> +                 device = mnt_fs_get_source(fs);
>>>>>>> +                 path = mnt_fs_get_target(fs);
>>>>>>> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
>>>>>>> +                 fstype = mnt_fs_get_fstype(fs);
>>>>>>> +
>>>>>>> +                 d = cunescape(device);
>>>>>>> ++                if (!d)
>>>>>>> ++                        return log_oom();
>>>>>>> ++
>>>>>>> +                 p = cunescape(path);
>>>>>>> +-                if (!d || !p)
>>>>>>> ++                if (!p)
>>>>>>> +                         return log_oom();
>>>>>>> +
>>>>>>> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
>>>>>>> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
>>>>>>> ++
>>>>>>> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
>>>>>>> +                 if (r == 0 && k < 0)
>>>>>>> +                         r = k;
>>>>>>> +         }
>>>>>>> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
>>>>>>> +
>>>>>>> +         r = mount_load_proc_self_mountinfo(m, true);
>>>>>>> +         if (r < 0) {
>>>>>>> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
>>>>>>> +-
>>>>>>> +                 /* Reset flags, just in case, for later calls */
>>>>>>> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
>>>>>>> +                         Mount *mount = MOUNT(u);
>>>>>>> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
>>>>>>> +                                 break;
>>>>>>> +                         }
>>>>>>> +
>>>>>>> ++                        if (mount->parameters_proc_self_mountinfo.what)
>>>>>>> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
>>>>>>> ++
>>>>>>> ++
>>>>>>> +                 } else if (mount->just_mounted || mount->just_changed) {
>>>>>>> +
>>>>>>> +                         /* New or changed mount entry */
>>>>>>> +diff --git a/src/core/swap.c b/src/core/swap.c
>>>>>>> +index 6997921..5c19af5 100644
>>>>>>> +--- a/src/core/swap.c
>>>>>>> ++++ b/src/core/swap.c
>>>>>>> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
>>>>>>> +         return swap_verify(s);
>>>>>>> + }
>>>>>>> +
>>>>>>> +-static int swap_add_one(
>>>>>>> ++static int swap_setup_unit(
>>>>>>> +                 Manager *m,
>>>>>>> +                 const char *what,
>>>>>>> +                 const char *what_proc_swaps,
>>>>>>> +@@ -363,8 +363,10 @@ static int swap_add_one(
>>>>>>> +
>>>>>>> +         if (u &&
>>>>>>> +             SWAP(u)->from_proc_swaps &&
>>>>>>> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
>>>>>>> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
>>>>>>> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
>>>>>>> +                 return -EEXIST;
>>>>>>> ++        }
>>>>>>> +
>>>>>>> +         if (!u) {
>>>>>>> +                 delete = true;
>>>>>>> +@@ -379,7 +381,7 @@ static int swap_add_one(
>>>>>>> +
>>>>>>> +                 SWAP(u)->what = strdup(what);
>>>>>>> +                 if (!SWAP(u)->what) {
>>>>>>> +-                        r = log_oom();
>>>>>>> ++                        r = -ENOMEM;
>>>>>>> +                         goto fail;
>>>>>>> +                 }
>>>>>>> +
>>>>>>> +@@ -407,7 +409,6 @@ static int swap_add_one(
>>>>>>> +         p->priority = priority;
>>>>>>> +
>>>>>>> +         unit_add_to_dbus_queue(u);
>>>>>>> +-
>>>>>>> +         return 0;
>>>>>>> +
>>>>>>> + fail:
>>>>>>> +@@ -419,7 +420,7 @@ fail:
>>>>>>> +         return r;
>>>>>>> + }
>>>>>>> +
>>>>>>> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
>>>>>>> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
>>>>>>> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
>>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
>>>>>>> +         const char *dn;
>>>>>>> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
>>>>>>> +
>>>>>>> +         assert(m);
>>>>>>> +
>>>>>>> +-        r = swap_add_one(m, device, device, prio, set_flags);
>>>>>>> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
>>>>>>> +         if (r < 0)
>>>>>>> +                 return r;
>>>>>>> +
>>>>>>> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
>>>>>>> +         /* Add the main device node */
>>>>>>> +         dn = udev_device_get_devnode(d);
>>>>>>> +         if (dn && !streq(dn, device))
>>>>>>> +-                swap_add_one(m, dn, device, prio, set_flags);
>>>>>>> ++                swap_setup_unit(m, dn, device, prio, set_flags);
>>>>>>> +
>>>>>>> +         /* Add additional units for all symlinks */
>>>>>>> +         first = udev_device_get_devlinks_list_entry(d);
>>>>>>> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
>>>>>>> +                             st.st_rdev != udev_device_get_devnum(d))
>>>>>>> +                                 continue;
>>>>>>> +
>>>>>>> +-                swap_add_one(m, p, device, prio, set_flags);
>>>>>>> ++                swap_setup_unit(m, p, device, prio, set_flags);
>>>>>>> +         }
>>>>>>> +
>>>>>>> +         return r;
>>>>>>> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
>>>>>>> +                         if (k == EOF)
>>>>>>> +                                 break;
>>>>>>> +
>>>>>>> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
>>>>>>> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
>>>>>>> +                         continue;
>>>>>>> +                 }
>>>>>>> +
>>>>>>> +                 d = cunescape(dev);
>>>>>>> +                 if (!d)
>>>>>>> +-                        return -ENOMEM;
>>>>>>> ++                        return log_oom();
>>>>>>> ++
>>>>>>> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
>>>>>>> +
>>>>>>> +-                k = swap_process_new_swap(m, d, prio, set_flags);
>>>>>>> ++                k = swap_process_new(m, d, prio, set_flags);
>>>>>>> +                 if (k < 0)
>>>>>>> +                         r = k;
>>>>>>> +         }
>>>>>>> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
>>>>>>> +                                 break;
>>>>>>> +                         }
>>>>>>> +
>>>>>>> ++                        if (swap->what)
>>>>>>> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
>>>>>>> ++
>>>>>>> +                 } else if (swap->just_activated) {
>>>>>>> +
>>>>>>> +                         /* New swap entry */
>>>>>>> +@@ -1298,7 +1304,7 @@ fail:
>>>>>>> +         return r;
>>>>>>> + }
>>>>>>> +
>>>>>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
>>>>>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
>>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
>>>>>>> +         _cleanup_free_ char *e = NULL;
>>>>>>> +         const char *dn;
>>>>>>> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
>>>>>>> +         return r;
>>>>>>> + }
>>>>>>> +
>>>>>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
>>>>>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
>>>>>>> +         const char *dn;
>>>>>>> +         int r = 0;
>>>>>>> +         Swap *s;
>>>>>>> +diff --git a/src/core/swap.h b/src/core/swap.h
>>>>>>> +index 73e64d8..914a2db 100644
>>>>>>> +--- a/src/core/swap.h
>>>>>>> ++++ b/src/core/swap.h
>>>>>>> +@@ -116,8 +116,8 @@ struct Swap {
>>>>>>> +
>>>>>>> + extern const UnitVTable swap_vtable;
>>>>>>> +
>>>>>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
>>>>>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
>>>>>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
>>>>>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
>>>>>>> +
>>>>>>> + const char* swap_state_to_string(SwapState i) _const_;
>>>>>>> + SwapState swap_state_from_string(const char *s) _pure_;
>>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
>>>>>>> +index 563f6fe..a6558ee 100644
>>>>>>> +--- a/src/core/unit.c
>>>>>>> ++++ b/src/core/unit.c
>>>>>>> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
>>>>>>> +                 return -ENOMEM;
>>>>>>> +
>>>>>>> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
>>>>>>> +-
>>>>>>> +         if (r < 0)
>>>>>>> +                 return r;
>>>>>>> +
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..d614085
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
>>>>>>> @@ -0,0 +1,26 @@
>>>>>>> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
>>>>>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
>>>>>>> +Date: Sat, 28 Feb 2015 23:39:55 +0100
>>>>>>> +Subject: [PATCH 18/26] core: fix return value on OOM
>>>>>>> +
>>>>>>> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
>>>>>>> +---
>>>>>>> + src/core/device.c | 2 ++
>>>>>>> + 1 file changed, 2 insertions(+)
>>>>>>> +
>>>>>>> +diff --git a/src/core/device.c b/src/core/device.c
>>>>>>> +index 75b9a46..1cc103c 100644
>>>>>>> +--- a/src/core/device.c
>>>>>>> ++++ b/src/core/device.c
>>>>>>> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
>>>>>>> +                         j = strjoin(model, " ", label, NULL);
>>>>>>> +                         if (j)
>>>>>>> +                                 r = unit_set_description(u, j);
>>>>>>> ++                        else
>>>>>>> ++                                r = -ENOMEM;
>>>>>>> +                 } else
>>>>>>> +                         r = unit_set_description(u, model);
>>>>>>> +         } else
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..d94da60
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
>>>>>>> @@ -0,0 +1,33 @@
>>>>>>> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
>>>>>>> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
>>>>>>> +Date: Thu, 19 Feb 2015 20:47:28 +0100
>>>>>>> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
>>>>>>> + bus on dbus1
>>>>>>> +
>>>>>>> +This fixes "machinectl login" on systems configured with --disable-kdbus.
>>>>>>> +
>>>>>>> +The error was:
>>>>>>> +machinectl login foo
>>>>>>> +Failed to get machine PTY: Input/output error
>>>>>>> +
>>>>>>> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
>>>>>>> +---
>>>>>>> + src/machine/machine-dbus.c | 2 +-
>>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
>>>>>>> +index b46f0a8..b0f0f66 100644
>>>>>>> +--- a/src/machine/machine-dbus.c
>>>>>>> ++++ b/src/machine/machine-dbus.c
>>>>>>> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
>>>>>>> + #ifdef ENABLE_KDBUS
>>>>>>> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
>>>>>>> + #else
>>>>>>> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
>>>>>>> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
>>>>>>> + #endif
>>>>>>> +         if (!container_bus->address)
>>>>>>> +                 return -ENOMEM;
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..fcc2adf
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
>>>>>>> @@ -0,0 +1,25 @@
>>>>>>> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
>>>>>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
>>>>>>> +Date: Fri, 20 Feb 2015 15:35:11 -0300
>>>>>>> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
>>>>>>> +
>>>>>>> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
>>>>>>> +---
>>>>>>> + src/shared/util.c | 1 +
>>>>>>> + 1 file changed, 1 insertion(+)
>>>>>>> +
>>>>>>> +diff --git a/src/shared/util.c b/src/shared/util.c
>>>>>>> +index ba035ca..f24b5b4 100644
>>>>>>> +--- a/src/shared/util.c
>>>>>>> ++++ b/src/shared/util.c
>>>>>>> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
>>>>>>> +
>>>>>>> + bool fstype_is_network(const char *fstype) {
>>>>>>> +         static const char table[] =
>>>>>>> ++                "afs\0"
>>>>>>> +                 "cifs\0"
>>>>>>> +                 "smbfs\0"
>>>>>>> +                 "sshfs\0"
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..02e279d
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
>>>>>>> @@ -0,0 +1,31 @@
>>>>>>> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
>>>>>>> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
>>>>>>> +Date: Fri, 20 Feb 2015 10:53:28 +0100
>>>>>>> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
>>>>>>> +
>>>>>>> +Otherwise every daemon reload prints out warnings like:
>>>>>>> +
>>>>>>> +systemd[1]: Unit type .busname is not supported on this system.
>>>>>>> +systemd[1]: Unit type .swap is not supported on this system.
>>>>>>> +
>>>>>>> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
>>>>>>> +---
>>>>>>> + src/core/manager.c | 2 +-
>>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/core/manager.c b/src/core/manager.c
>>>>>>> +index 4775219..bc9b7ec 100644
>>>>>>> +--- a/src/core/manager.c
>>>>>>> ++++ b/src/core/manager.c
>>>>>>> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
>>>>>>> +                 int q;
>>>>>>> +
>>>>>>> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
>>>>>>> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
>>>>>>> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
>>>>>>> +                         continue;
>>>>>>> +                 }
>>>>>>> +
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..f5afd09
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
>>>>>>> @@ -0,0 +1,97 @@
>>>>>>> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
>>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>>>>> +Date: Mon, 2 Mar 2015 10:34:51 -0500
>>>>>>> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
>>>>>>> +
>>>>>>> +Binary fields were not processed properly, and resulting journal files
>>>>>>> +were non-conforming, resulting in an error ("Invalid field.") when reading.
>>>>>>> +
>>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
>>>>>>> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
>>>>>>> +---
>>>>>>> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
>>>>>>> + src/journal-remote/journal-remote-parse.h |  4 +++-
>>>>>>> + 2 files changed, 21 insertions(+), 14 deletions(-)
>>>>>>> +
>>>>>>> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
>>>>>>> +index d9dea8d..afded7e 100644
>>>>>>> +--- a/src/journal-remote/journal-remote-parse.c
>>>>>>> ++++ b/src/journal-remote/journal-remote-parse.c
>>>>>>> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
>>>>>>> +                    LLLLLLLL0011223344...\n
>>>>>>> +                 */
>>>>>>> +                 sep = memchr(line, '=', n);
>>>>>>> +-                if (sep)
>>>>>>> ++                if (sep) {
>>>>>>> +                         /* chomp newline */
>>>>>>> +                         n--;
>>>>>>> +-                else
>>>>>>> ++
>>>>>>> ++                        r = iovw_put(&source->iovw, line, n);
>>>>>>> ++                        if (r < 0)
>>>>>>> ++                                return r;
>>>>>>> ++                } else {
>>>>>>> +                         /* replace \n with = */
>>>>>>> +                         line[n-1] = '=';
>>>>>>> +-                log_trace("Received: %.*s", (int) n, line);
>>>>>>> +
>>>>>>> +-                r = iovw_put(&source->iovw, line, n);
>>>>>>> +-                if (r < 0) {
>>>>>>> +-                        log_error("Failed to put line in iovect");
>>>>>>> +-                        return r;
>>>>>>> ++                        source->field_len = n;
>>>>>>> ++                        source->state = STATE_DATA_START;
>>>>>>> ++
>>>>>>> ++                        /* we cannot put the field in iovec until we have all data */
>>>>>>> +                 }
>>>>>>> +
>>>>>>> +-                if (!sep)
>>>>>>> +-                        source->state = STATE_DATA_START;
>>>>>>> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
>>>>>>> ++
>>>>>>> +                 return 0; /* continue */
>>>>>>> +         }
>>>>>>> +
>>>>>>> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
>>>>>>> +
>>>>>>> +         case STATE_DATA: {
>>>>>>> +                 void *data;
>>>>>>> ++                char *field;
>>>>>>> +
>>>>>>> +                 assert(source->data_size > 0);
>>>>>>> +
>>>>>>> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
>>>>>>> +
>>>>>>> +                 assert(data);
>>>>>>> +
>>>>>>> +-                r = iovw_put(&source->iovw, data, source->data_size);
>>>>>>> +-                if (r < 0) {
>>>>>>> +-                        log_error("failed to put binary buffer in iovect");
>>>>>>> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
>>>>>>> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
>>>>>>> ++
>>>>>>> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
>>>>>>> ++                if (r < 0)
>>>>>>> +                         return r;
>>>>>>> +-                }
>>>>>>> +
>>>>>>> +                 source->state = STATE_DATA_FINISH;
>>>>>>> +
>>>>>>> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
>>>>>>> +index 8499f4e..22db550 100644
>>>>>>> +--- a/src/journal-remote/journal-remote-parse.h
>>>>>>> ++++ b/src/journal-remote/journal-remote-parse.h
>>>>>>> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
>>>>>>> +         size_t offset;     /* offset to the beginning of live data in the buffer */
>>>>>>> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
>>>>>>> +         size_t filled;     /* total number of bytes in the buffer */
>>>>>>> +-        size_t data_size;  /* size of the binary data chunk being processed */
>>>>>>> ++
>>>>>>> ++        size_t field_len;  /* used for binary fields: the field name length */
>>>>>>> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
>>>>>>> +
>>>>>>> +         struct iovec_wrapper iovw;
>>>>>>> +
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..79e565b
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
>>>>>>> @@ -0,0 +1,37 @@
>>>>>>> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
>>>>>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
>>>>>>> +Date: Sun, 1 Mar 2015 21:13:10 -0300
>>>>>>> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
>>>>>>> +
>>>>>>> +Logs constantly show
>>>>>>> +
>>>>>>> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
>>>>>>> +
>>>>>>> +This is because ext4 does not support FS_NOCOW_FL.
>>>>>>> +
>>>>>>> +[zj: fold into one conditional as suggested on the ML and
>>>>>>> +     fix (preexisting) r/errno confusion in error message.]
>>>>>>> +
>>>>>>> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
>>>>>>> +---
>>>>>>> + src/journal/journal-file.c | 4 ++--
>>>>>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
>>>>>>> +
>>>>>>> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
>>>>>>> +index 2845e05..0f28718 100644
>>>>>>> +--- a/src/journal/journal-file.c
>>>>>>> ++++ b/src/journal/journal-file.c
>>>>>>> +@@ -2611,8 +2611,8 @@ int journal_file_open(
>>>>>>> +                  * shouldn't be too bad, given that we do our own
>>>>>>> +                  * checksumming). */
>>>>>>> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
>>>>>>> +-                if (r < 0)
>>>>>>> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
>>>>>>> ++                if (r < 0 && r != -ENOTTY)
>>>>>>> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
>>>>>>> +
>>>>>>> +                 /* Let's attach the creation time to the journal file,
>>>>>>> +                  * so that the vacuuming code knows the age of this
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..0cf9a0a
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
>>>>>>> @@ -0,0 +1,53 @@
>>>>>>> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
>>>>>>> +From: Lennart Poettering <lennart@poettering.net>
>>>>>>> +Date: Mon, 2 Mar 2015 20:55:38 +0100
>>>>>>> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
>>>>>>> + happy
>>>>>>> +
>>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
>>>>>>> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
>>>>>>> +---
>>>>>>> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
>>>>>>> + 1 file changed, 5 insertions(+), 7 deletions(-)
>>>>>>> +
>>>>>>> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
>>>>>>> +index 028c2a7..22a3a53 100644
>>>>>>> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
>>>>>>> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
>>>>>>> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
>>>>>>> +                 .msg_iovlen = 1,
>>>>>>> +                 .msg_name = &sockaddr,
>>>>>>> +         };
>>>>>>> +-        union {
>>>>>>> +-                struct cmsghdr cmsghdr;
>>>>>>> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
>>>>>>> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
>>>>>>> +-        } control;
>>>>>>> ++        struct cmsghdr *control;
>>>>>>> +         _cleanup_close_ int fd = -1;
>>>>>>> +         struct cmsghdr *cmsg = NULL;
>>>>>>> +         const char *e;
>>>>>>> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
>>>>>>> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
>>>>>>> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
>>>>>>> +
>>>>>>> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
>>>>>>> ++
>>>>>>> +         if (n_fds > 0) {
>>>>>>> +-                msghdr.msg_control = &control;
>>>>>>> ++                msghdr.msg_control = control;
>>>>>>> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
>>>>>>> +
>>>>>>> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
>>>>>>> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
>>>>>>> +                 try_without_ucred = true;
>>>>>>> +                 controllen_without_ucred = msghdr.msg_controllen;
>>>>>>> +
>>>>>>> +-                msghdr.msg_control = &control;
>>>>>>> ++                msghdr.msg_control = control;
>>>>>>> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
>>>>>>> +
>>>>>>> +                 if (cmsg)
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..6912489
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
>>>>>>> @@ -0,0 +1,84 @@
>>>>>>> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
>>>>>>> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
>>>>>>> +Date: Tue, 3 Mar 2015 00:35:08 +0100
>>>>>>> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
>>>>>>> + filesystems
>>>>>>> +
>>>>>>> +A warning is printed if ACLs cannot be retrieved for any reason other
>>>>>>> +than -ENOSYS. For -ENOSYS, debug log is printed.
>>>>>>> +
>>>>>>> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
>>>>>>> +---
>>>>>>> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
>>>>>>> + 1 file changed, 20 insertions(+), 16 deletions(-)
>>>>>>> +
>>>>>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
>>>>>>> +index 88ba7e4..187997e 100644
>>>>>>> +--- a/src/tmpfiles/tmpfiles.c
>>>>>>> ++++ b/src/tmpfiles/tmpfiles.c
>>>>>>> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
>>>>>>> +         int r;
>>>>>>> +         _cleanup_(acl_free_charpp) char *t = NULL;
>>>>>>> +
>>>>>>> ++        /* Returns 0 for success, positive error if already warned,
>>>>>>> ++         * negative error otherwise. */
>>>>>>> ++
>>>>>>> +         if (modify) {
>>>>>>> +                 r = acls_for_file(path, type, acl, &dup);
>>>>>>> +                 if (r < 0)
>>>>>>> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
>>>>>>> +
>>>>>>> +         r = acl_set_file(path, type, dup);
>>>>>>> +         if (r < 0)
>>>>>>> +-                return log_error_errno(-errno,
>>>>>>> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
>>>>>>> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
>>>>>>> +-                                       strna(t), path);
>>>>>>> ++                return -log_error_errno(errno,
>>>>>>> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
>>>>>>> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
>>>>>>> ++                                        strna(t), path);
>>>>>>> ++
>>>>>>> +         return 0;
>>>>>>> + }
>>>>>>> + #endif
>>>>>>> +
>>>>>>> + static int path_set_acls(Item *item, const char *path) {
>>>>>>> ++        int r = 0;
>>>>>>> + #ifdef HAVE_ACL
>>>>>>> +-        int r;
>>>>>>> +-
>>>>>>> +         assert(item);
>>>>>>> +         assert(path);
>>>>>>> +
>>>>>>> +-        if (item->acl_access) {
>>>>>>> ++        if (item->acl_access)
>>>>>>> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
>>>>>>> +-                if (r < 0)
>>>>>>> +-                        return r;
>>>>>>> +-        }
>>>>>>> +
>>>>>>> +-        if (item->acl_default) {
>>>>>>> ++        if (r == 0 && item->acl_default)
>>>>>>> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
>>>>>>> +-                if (r < 0)
>>>>>>> +-                        return r;
>>>>>>> +-        }
>>>>>>> +-#endif
>>>>>>> +
>>>>>>> +-        return 0;
>>>>>>> ++        if (r > 0)
>>>>>>> ++                return -r; /* already warned */
>>>>>>> ++        else if (r == -ENOTSUP) {
>>>>>>> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
>>>>>>> ++                return 0;
>>>>>>> ++        } else if (r < 0)
>>>>>>> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
>>>>>>> ++#endif
>>>>>>> ++        return r;
>>>>>>> + }
>>>>>>> +
>>>>>>> + static int write_one_file(Item *i, const char *path) {
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
>>>>>>> new file mode 100644
>>>>>>> index 0000000..a49a369
>>>>>>> --- /dev/null
>>>>>>> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
>>>>>>> @@ -0,0 +1,30 @@
>>>>>>> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
>>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
>>>>>>> +Date: Tue, 3 Mar 2015 19:07:28 -0500
>>>>>>> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
>>>>>>> + missing
>>>>>>> +
>>>>>>> +On s390 (at least) /sys/class/power_supply is not present. We should
>>>>>>> +treat this like if this directory was empty, and not an error.
>>>>>>> +
>>>>>>> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
>>>>>>> +---
>>>>>>> + src/shared/util.c | 2 +-
>>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>> +
>>>>>>> +diff --git a/src/shared/util.c b/src/shared/util.c
>>>>>>> +index f24b5b4..8548723 100644
>>>>>>> +--- a/src/shared/util.c
>>>>>>> ++++ b/src/shared/util.c
>>>>>>> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
>>>>>>> +
>>>>>>> +         d = opendir("/sys/class/power_supply");
>>>>>>> +         if (!d)
>>>>>>> +-                return -errno;
>>>>>>> ++                return errno == ENOENT ? true : -errno;
>>>>>>> +
>>>>>>> +         for (;;) {
>>>>>>> +                 struct dirent *de;
>>>>>>> +--
>>>>>>> +1.9.1
>>>>>>> +
>>>>>>> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
>>>>>>> index 73b930e..9c20b11 100644
>>>>>>> --- a/meta/recipes-core/systemd/systemd_219.bb
>>>>>>> +++ b/meta/recipes-core/systemd/systemd_219.bb
>>>>>>> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
>>>>>>>           file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
>>>>>>>           file://0010-Make-root-s-home-directory-configurable.patch \
>>>>>>>           file://0011-systemd-user-avoid-using-system-auth.patch \
>>>>>>> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
>>>>>>> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
>>>>>>>           file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
>>>>>>> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
>>>>>>>           file://0014-Revert-rules-remove-firmware-loading-rules.patch \
>>>>>>>           file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
>>>>>>>           file://tmpfiles-pam.patch \
>>>>>>> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
>>>>>>> 
>>>>>>> S = "${WORKDIR}/git"
>>>>>>> 
>>>>>>> +# Appending backport fixes released for version 219-stable
>>>>>>> +SRC_URI_append = "\
>>>>>>> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
>>>>>>> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
>>>>>>> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
>>>>>>> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
>>>>>>> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
>>>>>>> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
>>>>>>> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
>>>>>>> +           file://0008-bootchart-fix-default-init-path.patch \
>>>>>>> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
>>>>>>> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
>>>>>>> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
>>>>>>> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
>>>>>>> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
>>>>>>> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
>>>>>>> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
>>>>>>> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
>>>>>>> +           file://0017-core-rework-device-state-logic.patch \
>>>>>>> +           file://0018-core-fix-return-value-on-OOM.patch \
>>>>>>> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
>>>>>>> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
>>>>>>> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
>>>>>>> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
>>>>>>> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
>>>>>>> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
>>>>>>> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
>>>>>>> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
>>>>>>> +           "
>>>>>>> +
>>>>>>> SRC_URI_append_libc-uclibc = "\
>>>>>>>            file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
>>>>>>>           "
>>>>>>> --
>>>>>>> 1.9.1
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> --
>>>>>> _______________________________________________
>>>>>> Openembedded-core mailing list
>>>>>> Openembedded-core@lists.openembedded.org
>>>>>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>> 
>>> 
>> 
>> 
> 
> 



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-04-07 19:33             ` Khem Raj
@ 2015-04-09 12:57               ` Bottazzini, Bruno
  2015-04-13 21:21                 ` Bottazzini, Bruno
  0 siblings, 1 reply; 12+ messages in thread
From: Bottazzini, Bruno @ 2015-04-09 12:57 UTC (permalink / raw)
  To: Khem Raj; +Cc: Patches and discussions about the oe-core layer

Good! 

When will this patch be merged with master?

Thanks and best regards

On Ter, 2015-04-07 at 12:33 -0700, Khem Raj wrote:
> this looks ok
> 
> > On Apr 7, 2015, at 6:10 AM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
> > 
> > Ping
> > 
> >> On Qua, 2015-04-01 at 14:14 -0700, Khem Raj wrote:
> >>> I will try it out. give me a day
> >>> 
> >>>> On Apr 1, 2015, at 2:08 PM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
> >>>> 
> >>>> Khem,
> >>>> 
> >>>> Could you verify this patch and see if this satisfies what you have
> >>>> pointed previously ?
> >>>> 
> >>>> Do you think this patch is ready to go to master ?
> >>>> 
> >>>> Regards,
> >>>> 
> >>>> On Ter, 2015-03-31 at 17:25 -0300, Otavio Salvador wrote:
> >>>>> I am not a heavy user of systemd so I prefer other people (Khem?) to
> >>>>> comment on this ...
> >>>>> 
> >>>>> On Tue, Mar 31, 2015 at 5:21 PM, Bottazzini, Bruno
> >>>>> <bruno.bottazzini@intel.com> wrote:
> >>>>>> Ping
> >>>>>> 
> >>>>>> On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
> >>>>>>> Adding patches that fix bugs for 219 version.
> >>>>>>> This will get the same consistency of the stable systemd 219 version.
> >>>>>>> 
> >>>>>>> More details:
> >>>>>>> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
> >>>>>>> ---
> >>>>>>> ...remote-fix-certificate-status-memory-leak.patch |  31 +
> >>>>>>> ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
> >>>>>>> ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
> >>>>>>> ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
> >>>>>>> ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
> >>>>>>> .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
> >>>>>>> ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
> >>>>>>> .../0008-bootchart-fix-default-init-path.patch     |  44 +
> >>>>>>> ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
> >>>>>>> ...0-Make-root-s-home-directory-configurable.patch |  89 +-
> >>>>>>> ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
> >>>>>>> ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
> >>>>>>> ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
> >>>>>>> ...aker-dependencies-between-mount-and-devic.patch |  33 +
> >>>>>>> ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
> >>>>>>> ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
> >>>>>>> ...l-add-some-hints-how-to-override-settings.patch |  39 +
> >>>>>>> .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
> >>>>>>> .../0018-core-fix-return-value-on-OOM.patch        |  26 +
> >>>>>>> ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
> >>>>>>> ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
> >>>>>>> ...downgrade-unit-type-not-supported-message.patch |  31 +
> >>>>>>> ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
> >>>>>>> ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
> >>>>>>> ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
> >>>>>>> ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
> >>>>>>> ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
> >>>>>>> meta/recipes-core/systemd/systemd_219.bb           |  33 +-
> >>>>>>> 28 files changed, 2050 insertions(+), 55 deletions(-)
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> >>>>>>> 
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..172bea2
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> >>>>>>> @@ -0,0 +1,31 @@
> >>>>>>> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Michal Schmidt <mschmidt@redhat.com>
> >>>>>>> +Date: Tue, 17 Feb 2015 10:33:01 +0100
> >>>>>>> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
> >>>>>>> +
> >>>>>>> +The output of gnutls_certificate_verification_status_print() needs to be
> >>>>>>> +freed.
> >>>>>>> +
> >>>>>>> +Noticed this while staring at verify_cert_authorized() to see what could
> >>>>>>> +possibly confuse gcc5 on armv7hl to segfault during compilation.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
> >>>>>>> +---
> >>>>>>> + src/journal-remote/microhttpd-util.c | 1 +
> >>>>>>> + 1 file changed, 1 insertion(+)
> >>>>>>> +
> >>>>>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> >>>>>>> +index 34d9337..de9c6ab 100644
> >>>>>>> +--- a/src/journal-remote/microhttpd-util.c
> >>>>>>> ++++ b/src/journal-remote/microhttpd-util.c
> >>>>>>> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
> >>>>>>> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
> >>>>>>> +
> >>>>>>> +         log_info("Certificate status: %s", out.data);
> >>>>>>> ++        gnutls_free(out.data);
> >>>>>>> +
> >>>>>>> +         return status == 0 ? 0 : -EPERM;
> >>>>>>> + }
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..f615876
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> >>>>>>> @@ -0,0 +1,35 @@
> >>>>>>> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Michal Schmidt <mschmidt@redhat.com>
> >>>>>>> +Date: Tue, 17 Feb 2015 10:36:57 +0100
> >>>>>>> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
> >>>>>>> +
> >>>>>>> +Found by Valgrind while testing the previous memory leak fix.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
> >>>>>>> +---
> >>>>>>> + src/journal-remote/microhttpd-util.c | 6 +++++-
> >>>>>>> + 1 file changed, 5 insertions(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> >>>>>>> +index de9c6ab..a95fff1 100644
> >>>>>>> +--- a/src/journal-remote/microhttpd-util.c
> >>>>>>> ++++ b/src/journal-remote/microhttpd-util.c
> >>>>>>> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
> >>>>>>> +         return 0;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
> >>>>>>> ++        gnutls_x509_crt_deinit(*p);
> >>>>>>> ++}
> >>>>>>> ++
> >>>>>>> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
> >>>>>>> +         const union MHD_ConnectionInfo *ci;
> >>>>>>> +         gnutls_session_t session;
> >>>>>>> +-        gnutls_x509_crt_t client_cert;
> >>>>>>> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
> >>>>>>> +         _cleanup_free_ char *buf = NULL;
> >>>>>>> +         int r;
> >>>>>>> +
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..15fa98c
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> >>>>>>> @@ -0,0 +1,28 @@
> >>>>>>> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
> >>>>>>> +Date: Tue, 17 Feb 2015 12:47:51 +0100
> >>>>>>> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
> >>>>>>> +
> >>>>>>> +parse_acl() returns the error instead of setting errno.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
> >>>>>>> +---
> >>>>>>> + src/tmpfiles/tmpfiles.c | 2 +-
> >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> >>>>>>> +index c948d4d..88ba7e4 100644
> >>>>>>> +--- a/src/tmpfiles/tmpfiles.c
> >>>>>>> ++++ b/src/tmpfiles/tmpfiles.c
> >>>>>>> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
> >>>>>>> +          * afterwards, so the mask can be added now if necessary. */
> >>>>>>> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
> >>>>>>> +         if (r < 0)
> >>>>>>> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
> >>>>>>> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
> >>>>>>> +                                   item->argument);
> >>>>>>> + #else
> >>>>>>> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..f43068d
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> >>>>>>> @@ -0,0 +1,26 @@
> >>>>>>> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Tom Gundersen <teg@jklm.no>
> >>>>>>> +Date: Wed, 18 Feb 2015 14:33:50 +0100
> >>>>>>> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
> >>>>>>> +---
> >>>>>>> + src/test/test-utf8.c | 2 +-
> >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
> >>>>>>> +index befa385..346f852 100644
> >>>>>>> +--- a/src/test/test-utf8.c
> >>>>>>> ++++ b/src/test/test-utf8.c
> >>>>>>> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
> >>>>>>> +
> >>>>>>> + static void test_utf16_to_utf8(void) {
> >>>>>>> +         char *a = NULL;
> >>>>>>> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
> >>>>>>> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
> >>>>>>> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
> >>>>>>> +
> >>>>>>> +         a = utf16_to_utf8(utf16, 14);
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..35fe913
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> >>>>>>> @@ -0,0 +1,131 @@
> >>>>>>> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>>>>> +Date: Mon, 23 Feb 2015 23:19:54 -0500
> >>>>>>> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
> >>>>>>> +
> >>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
> >>>>>>> +https://bugs.debian.org/778656
> >>>>>>> +
> >>>>>>> +Status quo ante can be restored with:
> >>>>>>> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
> >>>>>>> +---
> >>>>>>> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
> >>>>>>> + src/shared/acl-util.h |  4 +++
> >>>>>>> + 2 files changed, 81 insertions(+), 2 deletions(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> >>>>>>> +index a4ff1ab..cbe09d7 100644
> >>>>>>> +--- a/src/shared/acl-util.c
> >>>>>>> ++++ b/src/shared/acl-util.c
> >>>>>>> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
> >>>>>>> +         return 0;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> >>>>>>> ++        acl_tag_t tag_a, tag_b;
> >>>>>>> ++
> >>>>>>> ++        if (acl_get_tag_type(a, &tag_a) < 0)
> >>>>>>> ++                return -errno;
> >>>>>>> ++
> >>>>>>> ++        if (acl_get_tag_type(b, &tag_b) < 0)
> >>>>>>> ++                return -errno;
> >>>>>>> ++
> >>>>>>> ++        if (tag_a != tag_b)
> >>>>>>> ++                return false;
> >>>>>>> ++
> >>>>>>> ++        switch (tag_a) {
> >>>>>>> ++        case ACL_USER_OBJ:
> >>>>>>> ++        case ACL_GROUP_OBJ:
> >>>>>>> ++        case ACL_MASK:
> >>>>>>> ++        case ACL_OTHER:
> >>>>>>> ++                /* can have only one of those */
> >>>>>>> ++                return true;
> >>>>>>> ++        case ACL_USER: {
> >>>>>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> >>>>>>> ++
> >>>>>>> ++                uid_a = acl_get_qualifier(a);
> >>>>>>> ++                if (!uid_a)
> >>>>>>> ++                        return -errno;
> >>>>>>> ++
> >>>>>>> ++                uid_b = acl_get_qualifier(b);
> >>>>>>> ++                if (!uid_b)
> >>>>>>> ++                        return -errno;
> >>>>>>> ++
> >>>>>>> ++                return *uid_a == *uid_b;
> >>>>>>> ++        }
> >>>>>>> ++        case ACL_GROUP: {
> >>>>>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> >>>>>>> ++
> >>>>>>> ++                gid_a = acl_get_qualifier(a);
> >>>>>>> ++                if (!gid_a)
> >>>>>>> ++                        return -errno;
> >>>>>>> ++
> >>>>>>> ++                gid_b = acl_get_qualifier(b);
> >>>>>>> ++                if (!gid_b)
> >>>>>>> ++                        return -errno;
> >>>>>>> ++
> >>>>>>> ++                return *gid_a == *gid_b;
> >>>>>>> ++        }
> >>>>>>> ++        default:
> >>>>>>> ++                assert_not_reached("Unknown acl tag type");
> >>>>>>> ++        }
> >>>>>>> ++}
> >>>>>>> ++
> >>>>>>> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
> >>>>>>> ++        acl_entry_t i;
> >>>>>>> ++        int r;
> >>>>>>> ++
> >>>>>>> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
> >>>>>>> ++             r > 0;
> >>>>>>> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
> >>>>>>> ++
> >>>>>>> ++                r = acl_entry_equal(i, entry);
> >>>>>>> ++                if (r < 0)
> >>>>>>> ++                        return r;
> >>>>>>> ++                if (r > 0) {
> >>>>>>> ++                        *out = i;
> >>>>>>> ++                        return 1;
> >>>>>>> ++                }
> >>>>>>> ++        }
> >>>>>>> ++        if (r < 0)
> >>>>>>> ++                return -errno;
> >>>>>>> ++        return 0;
> >>>>>>> ++}
> >>>>>>> ++
> >>>>>>> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> >>>>>>> +         _cleanup_(acl_freep) acl_t old;
> >>>>>>> +         acl_entry_t i;
> >>>>>>> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> >>>>>>> +
> >>>>>>> +                 acl_entry_t j;
> >>>>>>> +
> >>>>>>> +-                if (acl_create_entry(&old, &j) < 0)
> >>>>>>> +-                        return -errno;
> >>>>>>> ++                r = find_acl_entry(old, i, &j);
> >>>>>>> ++                if (r < 0)
> >>>>>>> ++                        return r;
> >>>>>>> ++                if (r == 0)
> >>>>>>> ++                        if (acl_create_entry(&old, &j) < 0)
> >>>>>>> ++                                return -errno;
> >>>>>>> +
> >>>>>>> +                 if (acl_copy_entry(j, i) < 0)
> >>>>>>> +                         return -errno;
> >>>>>>> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
> >>>>>>> +index 90e88ff..fdb9006 100644
> >>>>>>> +--- a/src/shared/acl-util.h
> >>>>>>> ++++ b/src/shared/acl-util.h
> >>>>>>> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
> >>>>>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
> >>>>>>> + #define acl_free_charp acl_free
> >>>>>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
> >>>>>>> ++#define acl_free_uid_tp acl_free
> >>>>>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
> >>>>>>> ++#define acl_free_gid_tp acl_free
> >>>>>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
> >>>>>>> +
> >>>>>>> + #endif
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..fc707bb
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> >>>>>>> @@ -0,0 +1,32 @@
> >>>>>>> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Daniel Mack <daniel@zonque.org>
> >>>>>>> +Date: Tue, 24 Feb 2015 13:26:09 +0100
> >>>>>>> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
> >>>>>>> +
> >>>>>>> +  CC       src/shared/libsystemd_shared_la-time-util.lo
> >>>>>>> +src/shared/time-util.c: In function 'parse_nsec':
> >>>>>>> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
> >>>>>>> +                 if (!*s != 0)
> >>>>>>> +                         ^
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
> >>>>>>> +---
> >>>>>>> + src/shared/time-util.c | 2 +-
> >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
> >>>>>>> +index 947ac1f..1c36c57 100644
> >>>>>>> +--- a/src/shared/time-util.c
> >>>>>>> ++++ b/src/shared/time-util.c
> >>>>>>> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
> >>>>>>> +         s = startswith(p, "infinity");
> >>>>>>> +         if (s) {
> >>>>>>> +                 s += strspn(s, WHITESPACE);
> >>>>>>> +-                if (!*s != 0)
> >>>>>>> ++                if (*s != 0)
> >>>>>>> +                         return -EINVAL;
> >>>>>>> +
> >>>>>>> +                 *nsec = NSEC_INFINITY;
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..161b7b5
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> >>>>>>> @@ -0,0 +1,36 @@
> >>>>>>> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Daniel Mack <daniel@zonque.org>
> >>>>>>> +Date: Tue, 24 Feb 2015 13:27:10 +0100
> >>>>>>> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
> >>>>>>> +
> >>>>>>> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
> >>>>>>> +---
> >>>>>>> + src/test/test-time.c | 6 ++++++
> >>>>>>> + 1 file changed, 6 insertions(+)
> >>>>>>> +
> >>>>>>> +diff --git a/src/test/test-time.c b/src/test/test-time.c
> >>>>>>> +index 8cfc4cc..3840fff 100644
> >>>>>>> +--- a/src/test/test-time.c
> >>>>>>> ++++ b/src/test/test-time.c
> >>>>>>> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
> >>>>>>> +         assert_se(u == 2);
> >>>>>>> +         assert_se(parse_nsec(".7", &u) >= 0);
> >>>>>>> +         assert_se(u == 0);
> >>>>>>> ++        assert_se(parse_nsec("infinity", &u) >= 0);
> >>>>>>> ++        assert_se(u == NSEC_INFINITY);
> >>>>>>> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
> >>>>>>> ++        assert_se(u == NSEC_INFINITY);
> >>>>>>> +
> >>>>>>> +         assert_se(parse_nsec(" xyz ", &u) < 0);
> >>>>>>> +         assert_se(parse_nsec("", &u) < 0);
> >>>>>>> +         assert_se(parse_nsec(" . ", &u) < 0);
> >>>>>>> +         assert_se(parse_nsec(" 5. ", &u) < 0);
> >>>>>>> +         assert_se(parse_nsec(".s ", &u) < 0);
> >>>>>>> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
> >>>>>>> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..7eaad1e
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> >>>>>>> @@ -0,0 +1,44 @@
> >>>>>>> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
> >>>>>>> +Date: Tue, 24 Feb 2015 14:30:10 +0100
> >>>>>>> +Subject: [PATCH 08/26] bootchart: fix default init path
> >>>>>>> +
> >>>>>>> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
> >>>>>>> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
> >>>>>>> +multi-arch systems.
> >>>>>>> +
> >>>>>>> +https://launchpad.net/bugs/1423867
> >>>>>>> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
> >>>>>>> +---
> >>>>>>> + Makefile.am               | 1 +
> >>>>>>> + src/bootchart/bootchart.c | 2 +-
> >>>>>>> + 2 files changed, 2 insertions(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/Makefile.am b/Makefile.am
> >>>>>>> +index bf04d31..cc577ce 100644
> >>>>>>> +--- a/Makefile.am
> >>>>>>> ++++ b/Makefile.am
> >>>>>>> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
> >>>>>>> +     -DKEXEC=\"$(KEXEC)\" \
> >>>>>>> +     -DLIBDIR=\"$(libdir)\" \
> >>>>>>> +     -DROOTLIBDIR=\"$(rootlibdir)\" \
> >>>>>>> ++    -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> >>>>>>> +     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> >>>>>>> +     -I $(top_srcdir)/src \
> >>>>>>> +     -I $(top_builddir)/src/shared \
> >>>>>>> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
> >>>>>>> +index 64a384b..175be68 100644
> >>>>>>> +--- a/src/bootchart/bootchart.c
> >>>>>>> ++++ b/src/bootchart/bootchart.c
> >>>>>>> +@@ -76,7 +76,7 @@ int sysfd=-1;
> >>>>>>> + #define DEFAULT_HZ 25.0
> >>>>>>> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
> >>>>>>> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
> >>>>>>> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
> >>>>>>> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
> >>>>>>> + #define DEFAULT_OUTPUT "/run/log"
> >>>>>>> +
> >>>>>>> + /* graph defaults */
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..dbffa5b
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> >>>>>>> @@ -0,0 +1,44 @@
> >>>>>>> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
> >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>>>>> +Date: Tue, 24 Feb 2015 10:10:04 -0500
> >>>>>>> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
> >>>>>>> +
> >>>>>>> +It is not necessary when running as telinit, etc.
> >>>>>>> +
> >>>>>>> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
> >>>>>>> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
> >>>>>>> +---
> >>>>>>> + src/systemctl/systemctl.c | 10 +++++-----
> >>>>>>> + 1 file changed, 5 insertions(+), 5 deletions(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
> >>>>>>> +index 21cb898..6b93ec8 100644
> >>>>>>> +--- a/src/systemctl/systemctl.c
> >>>>>>> ++++ b/src/systemctl/systemctl.c
> >>>>>>> +@@ -7204,6 +7204,11 @@ found:
> >>>>>>> +                 }
> >>>>>>> +         }
> >>>>>>> +
> >>>>>>> ++        /* Increase max number of open files to 16K if we can, we
> >>>>>>> ++         * might needs this when browsing journal files, which might
> >>>>>>> ++         * be split up into many files. */
> >>>>>>> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> >>>>>>> ++
> >>>>>>> +         return verb->dispatch(bus, argv + optind);
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
> >>>>>>> +                 goto finish;
> >>>>>>> +         }
> >>>>>>> +
> >>>>>>> +-        /* Increase max number of open files to 16K if we can, we
> >>>>>>> +-         * might needs this when browsing journal files, which might
> >>>>>>> +-         * be split up into many files. */
> >>>>>>> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> >>>>>>> +-
> >>>>>>> +         if (!avoid_bus())
> >>>>>>> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
> >>>>>>> +
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> >>>>>>> index 41b9039..ff2871b 100644
> >>>>>>> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> >>>>>>> @@ -1,7 +1,7 @@
> >>>>>>> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
> >>>>>>> -From: Khem Raj <raj.khem@gmail.com>
> >>>>>>> -Date: Fri, 20 Feb 2015 05:24:49 +0000
> >>>>>>> -Subject: [PATCH 10/11] Make root's home directory configurable
> >>>>>>> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
> >>>>>>> +Date: Thu, 5 Mar 2015 17:38:12 -0300
> >>>>>>> +Subject: [PATCH] Make root's home directory configurable
> >>>>>>> 
> >>>>>>> OpenEmbedded has a configurable home directory for root. Allow
> >>>>>>> systemd to be built using its idea of what root's home directory
> >>>>>>> @@ -9,32 +9,31 @@ should be.
> >>>>>>> 
> >>>>>>> Upstream-Status: Pending
> >>>>>>> 
> >>>>>>> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
> >>>>>>> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
> >>>>>>> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
> >>>>>>> +compatbile with systemd 219-stable
> >>>>>>> ---
> >>>>>>> - Makefile.am                       | 2 ++
> >>>>>>> - configure.ac                      | 7 +++++++
> >>>>>>> - src/core/unit-printf.c            | 2 +-
> >>>>>>> - src/nspawn/nspawn.c               | 4 ++--
> >>>>>>> - src/shared/util.c                 | 4 ++--
> >>>>>>> - units/console-shell.service.m4.in | 4 ++--
> >>>>>>> - units/emergency.service.in        | 4 ++--
> >>>>>>> - units/rescue.service.in           | 4 ++--
> >>>>>>> - 8 files changed, 20 insertions(+), 11 deletions(-)
> >>>>>>> + Makefile.am                | 2 ++
> >>>>>>> + configure.ac               | 7 +++++++
> >>>>>>> + src/core/unit-printf.c     | 2 +-
> >>>>>>> + src/nspawn/nspawn.c        | 5 ++---
> >>>>>>> + src/shared/util.c          | 4 ++--
> >>>>>>> + units/emergency.service.in | 4 ++--
> >>>>>>> + units/rescue.service.in    | 4 ++--
> >>>>>>> + 7 files changed, 18 insertions(+), 10 deletions(-)
> >>>>>>> 
> >>>>>>> diff --git a/Makefile.am b/Makefile.am
> >>>>>>> -index 0fb3f9f..4623963 100644
> >>>>>>> +index 93c0509..31ea94d 100644
> >>>>>>> --- a/Makefile.am
> >>>>>>> +++ b/Makefile.am
> >>>>>>> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
> >>>>>>> -     -DKEXEC=\"$(KEXEC)\" \
> >>>>>>> -     -DLIBDIR=\"$(libdir)\" \
> >>>>>>> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
> >>>>>>>     -DROOTLIBDIR=\"$(rootlibdir)\" \
> >>>>>>> -+    -DROOTHOMEDIR=\"$(roothomedir)\" \
> >>>>>>> +     -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> >>>>>>>     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> >>>>>>> ++    -DROOTHOMEDIR=\"$(roothomedir)\" \
> >>>>>>>     -I $(top_srcdir)/src \
> >>>>>>>     -I $(top_builddir)/src/shared \
> >>>>>>> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
> >>>>>>> +     -I $(top_srcdir)/src/shared \
> >>>>>>> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
> >>>>>>> substitutions = \
> >>>>>>>        '|rootlibexecdir=$(rootlibexecdir)|' \
> >>>>>>>        '|rootbindir=$(rootbindir)|' \
> >>>>>>> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
> >>>>>>>        '|SYSTEMCTL=$(rootbindir)/systemctl|' \
> >>>>>>>        '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
> >>>>>>> diff --git a/configure.ac b/configure.ac
> >>>>>>> -index a5b2e6e..55bb7d8 100644
> >>>>>>> +index 01ee8dc..800a587 100644
> >>>>>>> --- a/configure.ac
> >>>>>>> +++ b/configure.ac
> >>>>>>> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
> >>>>>>> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
> >>>>>>>         [],
> >>>>>>>         [with_rootlibdir=${libdir}])
> >>>>>>> 
> >>>>>>> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
> >>>>>>> AC_ARG_WITH([pamlibdir],
> >>>>>>>         AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
> >>>>>>>         [],
> >>>>>>> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> >>>>>>> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> >>>>>>> AC_SUBST([pamconfdir], [$with_pamconfdir])
> >>>>>>> AC_SUBST([rootprefix], [$with_rootprefix])
> >>>>>>> AC_SUBST([rootlibdir], [$with_rootlibdir])
> >>>>>>> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
> >>>>>>> 
> >>>>>>> AC_CONFIG_FILES([
> >>>>>>>         Makefile po/Makefile.in
> >>>>>>> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
> >>>>>>> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
> >>>>>>>         include_prefix:          ${INCLUDE_PREFIX}
> >>>>>>>         lib dir:                 ${libdir}
> >>>>>>>         rootlib dir:             ${with_rootlibdir}
> >>>>>>> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
> >>>>>>>         SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
> >>>>>>>         Build Python:            ${PYTHON}
> >>>>>>> diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
> >>>>>>> -index 97135db..14d12f1 100644
> >>>>>>> +index 7736899..ac5f008 100644
> >>>>>>> --- a/src/core/unit-printf.c
> >>>>>>> +++ b/src/core/unit-printf.c
> >>>>>>> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> >>>>>>> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> >>>>>>>                  * best of it if we can, but fail if we can't */
> >>>>>>> 
> >>>>>>>                 if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
> >>>>>>> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
> >>>>>>>                         return -ENOTSUP;
> >>>>>>> 
> >>>>>>> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
> >>>>>>> -index b597edb..0b32673 100644
> >>>>>>> +index 08bfdcf..b44b4cd 100644
> >>>>>>> --- a/src/nspawn/nspawn.c
> >>>>>>> +++ b/src/nspawn/nspawn.c
> >>>>>>> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
> >>>>>>> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
> >>>>>>> +                         r = change_uid_gid(&home);
> >>>>>>>                         if (r < 0)
> >>>>>>>                                 _exit(EXIT_FAILURE);
> >>>>>>> -
> >>>>>>> +-
> >>>>>>> -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
> >>>>>>> +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
> >>>>>>>                             (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
> >>>>>>>                             (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
> >>>>>>>                                 log_oom();
> >>>>>>> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
> >>>>>>> -                                 execvp(argv[optind], argv + optind);
> >>>>>>> - #endif /* HAVE_EXECVPE */
> >>>>>>> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
> >>>>>>> +                         } else if (argc > optind)
> >>>>>>> +                                 execvpe(argv[optind], argv + optind, env_use);
> >>>>>>>                         else {
> >>>>>>> -                                chdir(home ? home : "/root");
> >>>>>>> +                                chdir(home ? home : ROOTHOMEDIR);
> >>>>>>> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
> >>>>>>>                                 execle("/bin/sh", "-sh", NULL, env_use);
> >>>>>>>                         }
> >>>>>>> diff --git a/src/shared/util.c b/src/shared/util.c
> >>>>>>> -index cbbe3b1..a0e3cc5 100644
> >>>>>>> +index 241e752..00adab6 100644
> >>>>>>> --- a/src/shared/util.c
> >>>>>>> +++ b/src/shared/util.c
> >>>>>>> -@@ -4609,7 +4609,7 @@ int get_user_creds(
> >>>>>>> +@@ -4604,7 +4604,7 @@ int get_user_creds(
> >>>>>>>                         *gid = 0;
> >>>>>>> 
> >>>>>>>                 if (home)
> >>>>>>> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
> >>>>>>> 
> >>>>>>>                 if (shell)
> >>>>>>>                         *shell = "/bin/sh";
> >>>>>>> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
> >>>>>>> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
> >>>>>>>         /* Hardcode home directory for root to avoid NSS */
> >>>>>>>         u = getuid();
> >>>>>>>         if (u == 0) {
> >>>>>>> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
> >>>>>>>                 if (!h)
> >>>>>>>                         return -ENOMEM;
> >>>>>>> 
> >>>>>>> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
> >>>>>>> -index 5c80722..efde5f0 100644
> >>>>>>> ---- a/units/console-shell.service.m4.in
> >>>>>>> -+++ b/units/console-shell.service.m4.in
> >>>>>>> -@@ -15,8 +15,8 @@ After=rc-local.service
> >>>>>>> - Before=getty.target
> >>>>>>> -
> >>>>>>> - [Service]
> >>>>>>> --Environment=HOME=/root
> >>>>>>> --WorkingDirectory=/root
> >>>>>>> -+Environment=HOME=@roothomedir@
> >>>>>>> -+WorkingDirectory=@roothomedir@
> >>>>>>> - ExecStart=-@SULOGIN@
> >>>>>>> - ExecStopPost=-@SYSTEMCTL@ poweroff
> >>>>>>> - Type=idle
> >>>>>>> diff --git a/units/emergency.service.in b/units/emergency.service.in
> >>>>>>> index 2695d7b..7f47b73 100644
> >>>>>>> --- a/units/emergency.service.in
> >>>>>>> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
> >>>>>>> ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
> >>>>>>> ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
> >>>>>>> --
> >>>>>>> -2.1.4
> >>>>>>> +1.9.1
> >>>>>>> 
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..1e4a69d
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> >>>>>>> @@ -0,0 +1,37 @@
> >>>>>>> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> >>>>>>> +Date: Tue, 24 Feb 2015 20:40:07 +0100
> >>>>>>> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
> >>>>>>> +
> >>>>>>> +CID#1271344/1271345
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
> >>>>>>> +---
> >>>>>>> + src/shared/acl-util.c | 4 ++--
> >>>>>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> >>>>>>> +index cbe09d7..e67e9ac 100644
> >>>>>>> +--- a/src/shared/acl-util.c
> >>>>>>> ++++ b/src/shared/acl-util.c
> >>>>>>> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> >>>>>>> +                 /* can have only one of those */
> >>>>>>> +                 return true;
> >>>>>>> +         case ACL_USER: {
> >>>>>>> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> >>>>>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
> >>>>>>> +
> >>>>>>> +                 uid_a = acl_get_qualifier(a);
> >>>>>>> +                 if (!uid_a)
> >>>>>>> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> >>>>>>> +                 return *uid_a == *uid_b;
> >>>>>>> +         }
> >>>>>>> +         case ACL_GROUP: {
> >>>>>>> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> >>>>>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
> >>>>>>> +
> >>>>>>> +                 gid_a = acl_get_qualifier(a);
> >>>>>>> +                 if (!gid_a)
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..dca5e20
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> >>>>>>> @@ -0,0 +1,28 @@
> >>>>>>> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> >>>>>>> +Date: Tue, 24 Feb 2015 18:32:31 +0200
> >>>>>>> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
> >>>>>>> +
> >>>>>>> +If we have less samples than expected, systemd-bootchart will crash.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
> >>>>>>> +---
> >>>>>>> + src/bootchart/svg.c | 2 +-
> >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
> >>>>>>> +index e111fa9..144177c 100644
> >>>>>>> +--- a/src/bootchart/svg.c
> >>>>>>> ++++ b/src/bootchart/svg.c
> >>>>>>> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
> >>>>>>> +
> >>>>>>> +                 ps->sample = ps->sample->next;
> >>>>>>> +                 sample_hz = ps->sample;
> >>>>>>> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
> >>>>>>> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
> >>>>>>> +                         sample_hz = sample_hz->next;
> >>>>>>> +
> >>>>>>> +                 /* subtract bootchart cpu utilization from total */
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..e0cb193
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> >>>>>>> @@ -0,0 +1,38 @@
> >>>>>>> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> >>>>>>> +Date: Mon, 23 Feb 2015 16:01:31 +0200
> >>>>>>> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
> >>>>>>> +
> >>>>>>> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
> >>>>>>> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
> >>>>>>> +syscalls getrandom and memfd_create").
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
> >>>>>>> +---
> >>>>>>> + src/shared/missing.h | 10 ++++++++++
> >>>>>>> + 1 file changed, 10 insertions(+)
> >>>>>>> +
> >>>>>>> +diff --git a/src/shared/missing.h b/src/shared/missing.h
> >>>>>>> +index b33a70c..e72631e 100644
> >>>>>>> +--- a/src/shared/missing.h
> >>>>>>> ++++ b/src/shared/missing.h
> >>>>>>> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
> >>>>>>> + #    define __NR_getrandom 349
> >>>>>>> + #  elif defined(__powerpc__)
> >>>>>>> + #    define __NR_getrandom 359
> >>>>>>> ++#  elif defined _MIPS_SIM
> >>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
> >>>>>>> ++#      define __NR_getrandom 4353
> >>>>>>> ++#    endif
> >>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
> >>>>>>> ++#      define __NR_getrandom 6317
> >>>>>>> ++#    endif
> >>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
> >>>>>>> ++#      define __NR_getrandom 5313
> >>>>>>> ++#    endif
> >>>>>>> + #  else
> >>>>>>> + #    warning "__NR_getrandom unknown for your architecture"
> >>>>>>> + #    define __NR_getrandom 0xffffffff
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..1b842a2
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> >>>>>>> @@ -0,0 +1,33 @@
> >>>>>>> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Lennart Poettering <lennart@poettering.net>
> >>>>>>> +Date: Wed, 25 Feb 2015 22:05:14 +0100
> >>>>>>> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
> >>>>>>> + units in --user mode
> >>>>>>> +
> >>>>>>> +When running in user mode unmounting of mount units when a device
> >>>>>>> +vanishes is unlikely to work, and even if it would work is already done
> >>>>>>> +by PID 1 anyway. HEnce, when creating implicit dependencies between
> >>>>>>> +mount units and their backing devices, created a Wants= type dependency
> >>>>>>> +in --user mode, but leave a BindsTo= dependency in --system mode.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
> >>>>>>> +---
> >>>>>>> + src/core/unit.c | 2 +-
> >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> >>>>>>> +index ee8e607..9f1e55e 100644
> >>>>>>> +--- a/src/core/unit.c
> >>>>>>> ++++ b/src/core/unit.c
> >>>>>>> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> >>>>>>> +         if (r < 0)
> >>>>>>> +                 return r;
> >>>>>>> +
> >>>>>>> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
> >>>>>>> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
> >>>>>>> +         if (r < 0)
> >>>>>>> +                 return r;
> >>>>>>> +
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..92c4b8f
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> >>>>>>> @@ -0,0 +1,43 @@
> >>>>>>> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Colin Walters <walters@verbum.org>
> >>>>>>> +Date: Tue, 17 Feb 2015 13:47:34 -0500
> >>>>>>> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
> >>>>>>> + caused it
> >>>>>>> +
> >>>>>>> +I'm trying to track down a relatively recent change in systemd
> >>>>>>> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
> >>>>>>> +
> >>>>>>> +Systemd started to stop sysroot.mount, and this patch should help
> >>>>>>> +me debug why at least.
> >>>>>>> +
> >>>>>>> +While we're here, "break" on the first unit we find that will
> >>>>>>> +deactivate, as there's no point in further iteration.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
> >>>>>>> +---
> >>>>>>> + src/core/unit.c | 4 +++-
> >>>>>>> + 1 file changed, 3 insertions(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> >>>>>>> +index 9f1e55e..563f6fe 100644
> >>>>>>> +--- a/src/core/unit.c
> >>>>>>> ++++ b/src/core/unit.c
> >>>>>>> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
> >>>>>>> +                         continue;
> >>>>>>> +
> >>>>>>> +                 stop = true;
> >>>>>>> ++                break;
> >>>>>>> +         }
> >>>>>>> +
> >>>>>>> +         if (!stop)
> >>>>>>> +                 return;
> >>>>>>> +
> >>>>>>> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
> >>>>>>> ++        assert(other);
> >>>>>>> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
> >>>>>>> +
> >>>>>>> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
> >>>>>>> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..46c25bd
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> >>>>>>> @@ -0,0 +1,30 @@
> >>>>>>> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
> >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>>>>> +Date: Thu, 26 Feb 2015 19:00:11 -0500
> >>>>>>> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
> >>>>>>> + debug
> >>>>>>> +
> >>>>>>> +Printing it at info level was tedious. We don't do that for any other
> >>>>>>> +overrides.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
> >>>>>>> +---
> >>>>>>> + src/sysctl/sysctl.c | 2 +-
> >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
> >>>>>>> +index 275a5b7..2415d84 100644
> >>>>>>> +--- a/src/sysctl/sysctl.c
> >>>>>>> ++++ b/src/sysctl/sysctl.c
> >>>>>>> +@@ -176,7 +176,7 @@ found:
> >>>>>>> +                         if (streq(value, existing))
> >>>>>>> +                                 continue;
> >>>>>>> +
> >>>>>>> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
> >>>>>>> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
> >>>>>>> +                         free(hashmap_remove(sysctl_options, p));
> >>>>>>> +                         free(v);
> >>>>>>> +                 }
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..87dce1f
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> >>>>>>> @@ -0,0 +1,39 @@
> >>>>>>> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>>>>> +Date: Thu, 26 Feb 2015 19:05:51 -0500
> >>>>>>> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
> >>>>>>> +
> >>>>>>> +Also a link to decent documentation for sysrq keys. It is surprising
> >>>>>>> +hard to find.
> >>>>>>> +
> >>>>>>> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
> >>>>>>> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
> >>>>>>> +---
> >>>>>>> + sysctl.d/50-default.conf | 9 ++++++++-
> >>>>>>> + 1 file changed, 8 insertions(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
> >>>>>>> +index f189233..def151b 100644
> >>>>>>> +--- a/sysctl.d/50-default.conf
> >>>>>>> ++++ b/sysctl.d/50-default.conf
> >>>>>>> +@@ -5,9 +5,16 @@
> >>>>>>> + #  the Free Software Foundation; either version 2.1 of the License, or
> >>>>>>> + #  (at your option) any later version.
> >>>>>>> +
> >>>>>>> +-# See sysctl.d(5) and core(5) for for details.
> >>>>>>> ++# See sysctl.d(5) and core(5) for for documentation.
> >>>>>>> ++
> >>>>>>> ++# To override settings in this file, create a local file in /etc
> >>>>>>> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
> >>>>>>> ++# there.
> >>>>>>> +
> >>>>>>> + # System Request functionality of the kernel (SYNC)
> >>>>>>> ++#
> >>>>>>> ++# Use kernel.sysrq = 1 to allow all keys.
> >>>>>>> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
> >>>>>>> + kernel.sysrq = 16
> >>>>>>> +
> >>>>>>> + # Append the PID to the core filename
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..a3ab3e4
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> >>>>>>> @@ -0,0 +1,912 @@
> >>>>>>> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Lennart Poettering <lennart@poettering.net>
> >>>>>>> +Date: Fri, 27 Feb 2015 21:55:08 +0100
> >>>>>>> +Subject: [PATCH 17/26] core: rework device state logic
> >>>>>>> +
> >>>>>>> +This change introduces a new state "tentative" for device units. Device
> >>>>>>> +units are considered "plugged" when udev announced them, "dead" when
> >>>>>>> +they are not available in the kernel, and "tentative" when they are
> >>>>>>> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
> >>>>>>> +announced via udev.
> >>>>>>> +
> >>>>>>> +This should fix a race when device nodes (like loop devices) are created
> >>>>>>> +and immediately mounted. Previously, systemd might end up seeing the
> >>>>>>> +mount unit before the device, and would thus pull down the mount because
> >>>>>>> +its BindTo dependency on the device would not be fulfilled.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
> >>>>>>> +---
> >>>>>>> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
> >>>>>>> + src/core/device.h |  14 ++-
> >>>>>>> + src/core/mount.c  |  46 ++++---
> >>>>>>> + src/core/swap.c   |  32 +++--
> >>>>>>> + src/core/swap.h   |   4 +-
> >>>>>>> + src/core/unit.c   |   1 -
> >>>>>>> + 6 files changed, 285 insertions(+), 180 deletions(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/core/device.c b/src/core/device.c
> >>>>>>> +index d3deac3..75b9a46 100644
> >>>>>>> +--- a/src/core/device.c
> >>>>>>> ++++ b/src/core/device.c
> >>>>>>> +@@ -36,7 +36,8 @@
> >>>>>>> +
> >>>>>>> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
> >>>>>>> +         [DEVICE_DEAD] = UNIT_INACTIVE,
> >>>>>>> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
> >>>>>>> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
> >>>>>>> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
> >>>>>>> + };
> >>>>>>> +
> >>>>>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
> >>>>>>> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
> >>>>>>> +         d->sysfs = NULL;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> ++static int device_set_sysfs(Device *d, const char *sysfs) {
> >>>>>>> ++        Device *first;
> >>>>>>> ++        char *copy;
> >>>>>>> ++        int r;
> >>>>>>> ++
> >>>>>>> ++        assert(d);
> >>>>>>> ++
> >>>>>>> ++        if (streq_ptr(d->sysfs, sysfs))
> >>>>>>> ++                return 0;
> >>>>>>> ++
> >>>>>>> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
> >>>>>>> ++        if (r < 0)
> >>>>>>> ++                return r;
> >>>>>>> ++
> >>>>>>> ++        copy = strdup(sysfs);
> >>>>>>> ++        if (!copy)
> >>>>>>> ++                return -ENOMEM;
> >>>>>>> ++
> >>>>>>> ++        device_unset_sysfs(d);
> >>>>>>> ++
> >>>>>>> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
> >>>>>>> ++        LIST_PREPEND(same_sysfs, first, d);
> >>>>>>> ++
> >>>>>>> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
> >>>>>>> ++        if (r < 0) {
> >>>>>>> ++                LIST_REMOVE(same_sysfs, first, d);
> >>>>>>> ++                free(copy);
> >>>>>>> ++                return r;
> >>>>>>> ++        }
> >>>>>>> ++
> >>>>>>> ++        d->sysfs = copy;
> >>>>>>> ++
> >>>>>>> ++        return 0;
> >>>>>>> ++}
> >>>>>>> ++
> >>>>>>> + static void device_init(Unit *u) {
> >>>>>>> +         Device *d = DEVICE(u);
> >>>>>>> +
> >>>>>>> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
> >>>>>>> +         assert(d);
> >>>>>>> +         assert(d->state == DEVICE_DEAD);
> >>>>>>> +
> >>>>>>> +-        if (d->sysfs)
> >>>>>>> ++        if (d->found & DEVICE_FOUND_UDEV)
> >>>>>>> ++                /* If udev says the device is around, it's around */
> >>>>>>> +                 device_set_state(d, DEVICE_PLUGGED);
> >>>>>>> ++        else if (d->found != DEVICE_NOT_FOUND)
> >>>>>>> ++                /* If a device is found in /proc/self/mountinfo or
> >>>>>>> ++                 * /proc/swaps, it's "tentatively" around. */
> >>>>>>> ++                device_set_state(d, DEVICE_TENTATIVE);
> >>>>>>> +
> >>>>>>> +         return 0;
> >>>>>>> + }
> >>>>>>> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
> >>>>>>> +         return device_state_to_string(DEVICE(u)->state);
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-static int device_add_escaped_name(Unit *u, const char *dn) {
> >>>>>>> +-        _cleanup_free_ char *e = NULL;
> >>>>>>> +-        int r;
> >>>>>>> +-
> >>>>>>> +-        assert(u);
> >>>>>>> +-        assert(dn);
> >>>>>>> +-        assert(dn[0] == '/');
> >>>>>>> +-
> >>>>>>> +-        e = unit_name_from_path(dn, ".device");
> >>>>>>> +-        if (!e)
> >>>>>>> +-                return -ENOMEM;
> >>>>>>> +-
> >>>>>>> +-        r = unit_add_name(u, e);
> >>>>>>> +-        if (r < 0 && r != -EEXIST)
> >>>>>>> +-                return r;
> >>>>>>> +-
> >>>>>>> +-        return 0;
> >>>>>>> +-}
> >>>>>>> +-
> >>>>>>> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
> >>>>>>> +-        _cleanup_free_ char *e = NULL;
> >>>>>>> +-        Unit *u;
> >>>>>>> +-
> >>>>>>> +-        assert(m);
> >>>>>>> +-        assert(dn);
> >>>>>>> +-        assert(dn[0] == '/');
> >>>>>>> +-        assert(_u);
> >>>>>>> +-
> >>>>>>> +-        e = unit_name_from_path(dn, ".device");
> >>>>>>> +-        if (!e)
> >>>>>>> +-                return -ENOMEM;
> >>>>>>> +-
> >>>>>>> +-        u = manager_get_unit(m, e);
> >>>>>>> +-        if (u) {
> >>>>>>> +-                *_u = u;
> >>>>>>> +-                return 1;
> >>>>>>> +-        }
> >>>>>>> +-
> >>>>>>> +-        return 0;
> >>>>>>> +-}
> >>>>>>> +-
> >>>>>>> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
> >>>>>>> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
> >>>>>>> +         const char *model;
> >>>>>>> ++        int r;
> >>>>>>> +
> >>>>>>> +         assert(u);
> >>>>>>> +         assert(dev);
> >>>>>>> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
> >>>>>>> +
> >>>>>>> +                         j = strjoin(model, " ", label, NULL);
> >>>>>>> +                         if (j)
> >>>>>>> +-                                return unit_set_description(u, j);
> >>>>>>> +-                }
> >>>>>>> ++                                r = unit_set_description(u, j);
> >>>>>>> ++                } else
> >>>>>>> ++                        r = unit_set_description(u, model);
> >>>>>>> ++        } else
> >>>>>>> ++                r = unit_set_description(u, path);
> >>>>>>> +
> >>>>>>> +-                return unit_set_description(u, model);
> >>>>>>> +-        }
> >>>>>>> ++        if (r < 0)
> >>>>>>> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
> >>>>>>> +
> >>>>>>> +-        return unit_set_description(u, path);
> >>>>>>> ++        return r;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> >>>>>>> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> >>>>>>> +
> >>>>>>> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
> >>>>>>> +                 if (!n)
> >>>>>>> +-                        return -ENOMEM;
> >>>>>>> ++                        return log_oom();
> >>>>>>> +
> >>>>>>> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
> >>>>>>> +                 if (r < 0)
> >>>>>>> +-                        return r;
> >>>>>>> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
> >>>>>>> +         }
> >>>>>>> +         if (!isempty(state))
> >>>>>>> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
> >>>>>>> +-                                 property, strna(udev_device_get_syspath(dev)));
> >>>>>>> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
> >>>>>>> +
> >>>>>>> +         return 0;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> >>>>>>> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> >>>>>>> ++        _cleanup_free_ char *e = NULL;
> >>>>>>> +         const char *sysfs;
> >>>>>>> +         Unit *u = NULL;
> >>>>>>> +         bool delete;
> >>>>>>> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >>>>>>> +         if (!sysfs)
> >>>>>>> +                 return 0;
> >>>>>>> +
> >>>>>>> +-        r = device_find_escape_name(m, path, &u);
> >>>>>>> +-        if (r < 0)
> >>>>>>> +-                return r;
> >>>>>>> ++        e = unit_name_from_path(path, ".device");
> >>>>>>> ++        if (!e)
> >>>>>>> ++                return log_oom();
> >>>>>>> ++
> >>>>>>> ++        u = manager_get_unit(m, e);
> >>>>>>> +
> >>>>>>> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
> >>>>>>> ++        if (u &&
> >>>>>>> ++            DEVICE(u)->sysfs &&
> >>>>>>> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
> >>>>>>> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
> >>>>>>> +                 return -EEXIST;
> >>>>>>> ++        }
> >>>>>>> +
> >>>>>>> +         if (!u) {
> >>>>>>> +                 delete = true;
> >>>>>>> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >>>>>>> +                 if (!u)
> >>>>>>> +                         return log_oom();
> >>>>>>> +
> >>>>>>> +-                r = device_add_escaped_name(u, path);
> >>>>>>> ++                r = unit_add_name(u, e);
> >>>>>>> +                 if (r < 0)
> >>>>>>> +                         goto fail;
> >>>>>>> +
> >>>>>>> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >>>>>>> +          * actually been seen yet ->sysfs will not be
> >>>>>>> +          * initialized. Hence initialize it if necessary. */
> >>>>>>> +
> >>>>>>> +-        if (!DEVICE(u)->sysfs) {
> >>>>>>> +-                Device *first;
> >>>>>>> +-
> >>>>>>> +-                DEVICE(u)->sysfs = strdup(sysfs);
> >>>>>>> +-                if (!DEVICE(u)->sysfs) {
> >>>>>>> +-                        r = -ENOMEM;
> >>>>>>> +-                        goto fail;
> >>>>>>> +-                }
> >>>>>>> +-
> >>>>>>> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
> >>>>>>> +-                if (r < 0)
> >>>>>>> +-                        goto fail;
> >>>>>>> +-
> >>>>>>> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
> >>>>>>> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
> >>>>>>> +-
> >>>>>>> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
> >>>>>>> +-                if (r < 0)
> >>>>>>> +-                        goto fail;
> >>>>>>> +-        }
> >>>>>>> +-
> >>>>>>> +-        device_make_description(u, dev, path);
> >>>>>>> ++        r = device_set_sysfs(DEVICE(u), sysfs);
> >>>>>>> ++        if (r < 0)
> >>>>>>> ++                goto fail;
> >>>>>>> +
> >>>>>>> +-        if (main) {
> >>>>>>> +-                /* The additional systemd udev properties we only
> >>>>>>> +-                 * interpret for the main object */
> >>>>>>> ++        (void) device_update_description(u, dev, path);
> >>>>>>> +
> >>>>>>> +-                r = device_add_udev_wants(u, dev);
> >>>>>>> +-                if (r < 0)
> >>>>>>> +-                        goto fail;
> >>>>>>> +-        }
> >>>>>>> ++        /* The additional systemd udev properties we only interpret
> >>>>>>> ++         * for the main object */
> >>>>>>> ++        if (main)
> >>>>>>> ++                (void) device_add_udev_wants(u, dev);
> >>>>>>> +
> >>>>>>> +         /* Note that this won't dispatch the load queue, the caller
> >>>>>>> +          * has to do that if needed and appropriate */
> >>>>>>> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> >>>>>>> +         return 0;
> >>>>>>> +
> >>>>>>> + fail:
> >>>>>>> +-        log_warning_errno(r, "Failed to load device unit: %m");
> >>>>>>> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
> >>>>>>> +
> >>>>>>> +         if (delete && u)
> >>>>>>> +                 unit_free(u);
> >>>>>>> +@@ -342,7 +331,7 @@ fail:
> >>>>>>> +         return r;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >>>>>>> ++static int device_process_new(Manager *m, struct udev_device *dev) {
> >>>>>>> +         const char *sysfs, *dn, *alias;
> >>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> >>>>>>> +         int r;
> >>>>>>> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >>>>>>> +                 return 0;
> >>>>>>> +
> >>>>>>> +         /* Add the main unit named after the sysfs path */
> >>>>>>> +-        r = device_update_unit(m, dev, sysfs, true);
> >>>>>>> ++        r = device_setup_unit(m, dev, sysfs, true);
> >>>>>>> +         if (r < 0)
> >>>>>>> +                 return r;
> >>>>>>> +
> >>>>>>> +         /* Add an additional unit for the device node */
> >>>>>>> +         dn = udev_device_get_devnode(dev);
> >>>>>>> +         if (dn)
> >>>>>>> +-                device_update_unit(m, dev, dn, false);
> >>>>>>> ++                (void) device_setup_unit(m, dev, dn, false);
> >>>>>>> +
> >>>>>>> +         /* Add additional units for all symlinks */
> >>>>>>> +         first = udev_device_get_devlinks_list_entry(dev);
> >>>>>>> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >>>>>>> +                             st.st_rdev != udev_device_get_devnum(dev))
> >>>>>>> +                                 continue;
> >>>>>>> +
> >>>>>>> +-                device_update_unit(m, dev, p, false);
> >>>>>>> ++                (void) device_setup_unit(m, dev, p, false);
> >>>>>>> +         }
> >>>>>>> +
> >>>>>>> +         /* Add additional units for all explicitly configured
> >>>>>>> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >>>>>>> +                         e[l] = 0;
> >>>>>>> +
> >>>>>>> +                         if (path_is_absolute(e))
> >>>>>>> +-                                device_update_unit(m, dev, e, false);
> >>>>>>> ++                                (void) device_setup_unit(m, dev, e, false);
> >>>>>>> +                         else
> >>>>>>> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
> >>>>>>> +                 }
> >>>>>>> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> >>>>>>> +         return 0;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
> >>>>>>> +-        const char *sysfs;
> >>>>>>> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
> >>>>>>> ++        DeviceFound n;
> >>>>>>> ++
> >>>>>>> ++        assert(d);
> >>>>>>> ++
> >>>>>>> ++        n = add ? (d->found | found) : (d->found & ~found);
> >>>>>>> ++        if (n == d->found)
> >>>>>>> ++                return;
> >>>>>>> ++
> >>>>>>> ++        d->found = n;
> >>>>>>> ++
> >>>>>>> ++        if (now) {
> >>>>>>> ++                if (d->found & DEVICE_FOUND_UDEV)
> >>>>>>> ++                        device_set_state(d, DEVICE_PLUGGED);
> >>>>>>> ++                else if (d->found != DEVICE_NOT_FOUND)
> >>>>>>> ++                        device_set_state(d, DEVICE_TENTATIVE);
> >>>>>>> ++                else
> >>>>>>> ++                        device_set_state(d, DEVICE_DEAD);
> >>>>>>> ++        }
> >>>>>>> ++}
> >>>>>>> ++
> >>>>>>> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
> >>>>>>> +         Device *d, *l;
> >>>>>>> +
> >>>>>>> +         assert(m);
> >>>>>>> +-        assert(dev);
> >>>>>>> ++        assert(sysfs);
> >>>>>>> +
> >>>>>>> +-        sysfs = udev_device_get_syspath(dev);
> >>>>>>> +-        if (!sysfs)
> >>>>>>> +-                return;
> >>>>>>> ++        if (found == DEVICE_NOT_FOUND)
> >>>>>>> ++                return 0;
> >>>>>>> +
> >>>>>>> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
> >>>>>>> +         LIST_FOREACH(same_sysfs, d, l)
> >>>>>>> +-                device_set_state(d, DEVICE_PLUGGED);
> >>>>>>> ++                device_update_found_one(d, add, found, now);
> >>>>>>> ++
> >>>>>>> ++        return 0;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
> >>>>>>> +-        const char *sysfs;
> >>>>>>> +-        Device *d;
> >>>>>>> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
> >>>>>>> ++        _cleanup_free_ char *e = NULL;
> >>>>>>> ++        Unit *u;
> >>>>>>> +
> >>>>>>> +         assert(m);
> >>>>>>> +-        assert(dev);
> >>>>>>> ++        assert(path);
> >>>>>>> +
> >>>>>>> +-        sysfs = udev_device_get_syspath(dev);
> >>>>>>> +-        if (!sysfs)
> >>>>>>> +-                return -ENOMEM;
> >>>>>>> ++        if (found == DEVICE_NOT_FOUND)
> >>>>>>> ++                return 0;
> >>>>>>> +
> >>>>>>> +-        /* Remove all units of this sysfs path */
> >>>>>>> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
> >>>>>>> +-                device_unset_sysfs(d);
> >>>>>>> +-                device_set_state(d, DEVICE_DEAD);
> >>>>>>> +-        }
> >>>>>>> ++        e = unit_name_from_path(path, ".device");
> >>>>>>> ++        if (!e)
> >>>>>>> ++                return log_oom();
> >>>>>>> +
> >>>>>>> ++        u = manager_get_unit(m, e);
> >>>>>>> ++        if (!u)
> >>>>>>> ++                return 0;
> >>>>>>> ++
> >>>>>>> ++        device_update_found_one(DEVICE(u), add, found, now);
> >>>>>>> +         return 0;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
> >>>>>>> +         return parse_boolean(ready) != 0;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-static int device_process_new_path(Manager *m, const char *path) {
> >>>>>>> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >>>>>>> +-
> >>>>>>> +-        assert(m);
> >>>>>>> +-        assert(path);
> >>>>>>> +-
> >>>>>>> +-        dev = udev_device_new_from_syspath(m->udev, path);
> >>>>>>> +-        if (!dev)
> >>>>>>> +-                return log_oom();
> >>>>>>> +-
> >>>>>>> +-        if (!device_is_ready(dev))
> >>>>>>> +-                return 0;
> >>>>>>> +-
> >>>>>>> +-        return device_process_new_device(m, dev);
> >>>>>>> +-}
> >>>>>>> +-
> >>>>>>> + static Unit *device_following(Unit *u) {
> >>>>>>> +         Device *d = DEVICE(u);
> >>>>>>> +         Device *other, *first = NULL;
> >>>>>>> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
> >>>>>>> +                 goto fail;
> >>>>>>> +
> >>>>>>> +         first = udev_enumerate_get_list_entry(e);
> >>>>>>> +-        udev_list_entry_foreach(item, first)
> >>>>>>> +-                device_process_new_path(m, udev_list_entry_get_name(item));
> >>>>>>> ++        udev_list_entry_foreach(item, first) {
> >>>>>>> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >>>>>>> ++                const char *sysfs;
> >>>>>>> ++
> >>>>>>> ++                sysfs = udev_list_entry_get_name(item);
> >>>>>>> ++
> >>>>>>> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
> >>>>>>> ++                if (!dev) {
> >>>>>>> ++                        log_oom();
> >>>>>>> ++                        continue;
> >>>>>>> ++                }
> >>>>>>> ++
> >>>>>>> ++                if (!device_is_ready(dev))
> >>>>>>> ++                        continue;
> >>>>>>> ++
> >>>>>>> ++                (void) device_process_new(m, dev);
> >>>>>>> ++
> >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
> >>>>>>> ++        }
> >>>>>>> +
> >>>>>>> +         return 0;
> >>>>>>> +
> >>>>>>> + fail:
> >>>>>>> ++        log_error_errno(r, "Failed to enumerate devices: %m");
> >>>>>>> ++
> >>>>>>> +         device_shutdown(m);
> >>>>>>> +         return r;
> >>>>>>> + }
> >>>>>>> +@@ -619,7 +634,7 @@ fail:
> >>>>>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
> >>>>>>> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >>>>>>> +         Manager *m = userdata;
> >>>>>>> +-        const char *action;
> >>>>>>> ++        const char *action, *sysfs;
> >>>>>>> +         int r;
> >>>>>>> +
> >>>>>>> +         assert(m);
> >>>>>>> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> >>>>>>> +         if (!dev)
> >>>>>>> +                 return 0;
> >>>>>>> +
> >>>>>>> ++        sysfs = udev_device_get_syspath(dev);
> >>>>>>> ++        if (!sysfs) {
> >>>>>>> ++                log_error("Failed to get udev sys path.");
> >>>>>>> ++                return 0;
> >>>>>>> ++        }
> >>>>>>> ++
> >>>>>>> +         action = udev_device_get_action(dev);
> >>>>>>> +         if (!action) {
> >>>>>>> +                 log_error("Failed to get udev action string.");
> >>>>>>> +                 return 0;
> >>>>>>> +         }
> >>>>>>> +
> >>>>>>> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
> >>>>>>> +-                r = device_process_removed_device(m, dev);
> >>>>>>> +-                if (r < 0)
> >>>>>>> +-                        log_error_errno(r, "Failed to process device remove event: %m");
> >>>>>>> +-
> >>>>>>> +-                r = swap_process_removed_device(m, dev);
> >>>>>>> ++        if (streq(action, "remove"))  {
> >>>>>>> ++                r = swap_process_device_remove(m, dev);
> >>>>>>> +                 if (r < 0)
> >>>>>>> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
> >>>>>>> +
> >>>>>>> +-        } else {
> >>>>>>> +-                r = device_process_new_device(m, dev);
> >>>>>>> +-                if (r < 0)
> >>>>>>> +-                        log_error_errno(r, "Failed to process device new event: %m");
> >>>>>>> ++                /* If we get notified that a device was removed by
> >>>>>>> ++                 * udev, then it's completely gone, hence unset all
> >>>>>>> ++                 * found bits */
> >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
> >>>>>>> +
> >>>>>>> +-                r = swap_process_new_device(m, dev);
> >>>>>>> ++        } else if (device_is_ready(dev)) {
> >>>>>>> ++
> >>>>>>> ++                (void) device_process_new(m, dev);
> >>>>>>> ++
> >>>>>>> ++                r = swap_process_device_new(m, dev);
> >>>>>>> +                 if (r < 0)
> >>>>>>> +                         log_error_errno(r, "Failed to process swap device new event: %m");
> >>>>>>> +
> >>>>>>> +                 manager_dispatch_load_queue(m);
> >>>>>>> +
> >>>>>>> +-                device_set_path_plugged(m, dev);
> >>>>>>> ++                /* The device is found now, set the udev found bit */
> >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
> >>>>>>> ++
> >>>>>>> ++        } else {
> >>>>>>> ++                /* The device is nominally around, but not ready for
> >>>>>>> ++                 * us. Hence unset the udev bit, but leave the rest
> >>>>>>> ++                 * around. */
> >>>>>>> ++
> >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
> >>>>>>> +         }
> >>>>>>> +
> >>>>>>> +         return 0;
> >>>>>>> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
> >>>>>>> +         return read_only <= 0;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
> >>>>>>> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> >>>>>>> ++        struct stat st;
> >>>>>>> ++
> >>>>>>> ++        assert(m);
> >>>>>>> ++        assert(node);
> >>>>>>> ++
> >>>>>>> ++        /* This is called whenever we find a device referenced in
> >>>>>>> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
> >>>>>>> ++         * mounted/enabled at a time where udev has not finished
> >>>>>>> ++         * probing it yet, and we thus haven't learned about it
> >>>>>>> ++         * yet. In this case we will set the device unit to
> >>>>>>> ++         * "tentative" state. */
> >>>>>>> ++
> >>>>>>> ++        if (add) {
> >>>>>>> ++                if (!path_startswith(node, "/dev"))
> >>>>>>> ++                        return 0;
> >>>>>>> ++
> >>>>>>> ++                if (stat(node, &st) < 0) {
> >>>>>>> ++                        if (errno == ENOENT)
> >>>>>>> ++                                return 0;
> >>>>>>> ++
> >>>>>>> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
> >>>>>>> ++                }
> >>>>>>> ++
> >>>>>>> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
> >>>>>>> ++                        return 0;
> >>>>>>> ++
> >>>>>>> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
> >>>>>>> ++                if (!dev) {
> >>>>>>> ++                        if (errno == ENOENT)
> >>>>>>> ++                                return 0;
> >>>>>>> ++
> >>>>>>> ++                        return log_oom();
> >>>>>>> ++                }
> >>>>>>> ++
> >>>>>>> ++                /* If the device is known in the kernel and newly
> >>>>>>> ++                 * appeared, then we'll create a device unit for it,
> >>>>>>> ++                 * under the name referenced in /proc/swaps or
> >>>>>>> ++                 * /proc/self/mountinfo. */
> >>>>>>> ++
> >>>>>>> ++                (void) device_setup_unit(m, dev, node, false);
> >>>>>>> ++        }
> >>>>>>> ++
> >>>>>>> ++        /* Update the device unit's state, should it exist */
> >>>>>>> ++        return device_update_found_by_name(m, node, add, found, now);
> >>>>>>> ++}
> >>>>>>> ++
> >>>>>>> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
> >>>>>>> +         [DEVICE_DEAD] = "dead",
> >>>>>>> +-        [DEVICE_PLUGGED] = "plugged"
> >>>>>>> ++        [DEVICE_TENTATIVE] = "tentative",
> >>>>>>> ++        [DEVICE_PLUGGED] = "plugged",
> >>>>>>> + };
> >>>>>>> +
> >>>>>>> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
> >>>>>>> +diff --git a/src/core/device.h b/src/core/device.h
> >>>>>>> +index bb7ae07..0609b20 100644
> >>>>>>> +--- a/src/core/device.h
> >>>>>>> ++++ b/src/core/device.h
> >>>>>>> +@@ -29,20 +29,28 @@ typedef struct Device Device;
> >>>>>>> +  * simplifies the state engine greatly */
> >>>>>>> + typedef enum DeviceState {
> >>>>>>> +         DEVICE_DEAD,
> >>>>>>> +-        DEVICE_PLUGGED,
> >>>>>>> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
> >>>>>>> ++        DEVICE_PLUGGED,   /* announced by udev */
> >>>>>>> +         _DEVICE_STATE_MAX,
> >>>>>>> +         _DEVICE_STATE_INVALID = -1
> >>>>>>> + } DeviceState;
> >>>>>>> +
> >>>>>>> ++typedef enum DeviceFound {
> >>>>>>> ++        DEVICE_NOT_FOUND = 0,
> >>>>>>> ++        DEVICE_FOUND_UDEV = 1,
> >>>>>>> ++        DEVICE_FOUND_MOUNT = 2,
> >>>>>>> ++        DEVICE_FOUND_SWAP = 4,
> >>>>>>> ++} DeviceFound;
> >>>>>>> ++
> >>>>>>> + struct Device {
> >>>>>>> +         Unit meta;
> >>>>>>> +
> >>>>>>> +         char *sysfs;
> >>>>>>> ++        DeviceFound found;
> >>>>>>> +
> >>>>>>> +         /* In order to be able to distinguish dependencies on
> >>>>>>> +         different device nodes we might end up creating multiple
> >>>>>>> +         devices for the same sysfs path. We chain them up here. */
> >>>>>>> +-
> >>>>>>> +         LIST_FIELDS(struct Device, same_sysfs);
> >>>>>>> +
> >>>>>>> +         DeviceState state;
> >>>>>>> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
> >>>>>>> +
> >>>>>>> + const char* device_state_to_string(DeviceState i) _const_;
> >>>>>>> + DeviceState device_state_from_string(const char *s) _pure_;
> >>>>>>> ++
> >>>>>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
> >>>>>>> +diff --git a/src/core/mount.c b/src/core/mount.c
> >>>>>>> +index f3977e6..c971330 100644
> >>>>>>> +--- a/src/core/mount.c
> >>>>>>> ++++ b/src/core/mount.c
> >>>>>>> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
> >>>>>>> +         return 0;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-static int mount_add_one(
> >>>>>>> ++static int mount_setup_unit(
> >>>>>>> +                 Manager *m,
> >>>>>>> +                 const char *what,
> >>>>>>> +                 const char *where,
> >>>>>>> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
> >>>>>>> +
> >>>>>>> +                 u = unit_new(m, sizeof(Mount));
> >>>>>>> +                 if (!u)
> >>>>>>> +-                        return -ENOMEM;
> >>>>>>> ++                        return log_oom();
> >>>>>>> +
> >>>>>>> +                 r = unit_add_name(u, e);
> >>>>>>> +                 if (r < 0)
> >>>>>>> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
> >>>>>>> +         return 0;
> >>>>>>> +
> >>>>>>> + fail:
> >>>>>>> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
> >>>>>>> ++
> >>>>>>> +         if (delete && u)
> >>>>>>> +                 unit_free(u);
> >>>>>>> +
> >>>>>>> +@@ -1554,33 +1556,36 @@ fail:
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> >>>>>>> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
> >>>>>>> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
> >>>>>>> +-        struct libmnt_fs *fs;
> >>>>>>> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
> >>>>>>> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
> >>>>>>> +         int r = 0;
> >>>>>>> +
> >>>>>>> +         assert(m);
> >>>>>>> +
> >>>>>>> +-        tb = mnt_new_table();
> >>>>>>> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
> >>>>>>> +-        if (!tb || !itr)
> >>>>>>> ++        t = mnt_new_table();
> >>>>>>> ++        if (!t)
> >>>>>>> +                 return log_oom();
> >>>>>>> +
> >>>>>>> +-        r = mnt_table_parse_mtab(tb, NULL);
> >>>>>>> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
> >>>>>>> ++        if (!i)
> >>>>>>> ++                return log_oom();
> >>>>>>> ++
> >>>>>>> ++        r = mnt_table_parse_mtab(t, NULL);
> >>>>>>> +         if (r < 0)
> >>>>>>> +-                return r;
> >>>>>>> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
> >>>>>>> +
> >>>>>>> +         r = 0;
> >>>>>>> +         for (;;) {
> >>>>>>> +                 const char *device, *path, *options, *fstype;
> >>>>>>> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
> >>>>>>> ++                struct libmnt_fs *fs;
> >>>>>>> +                 int k;
> >>>>>>> +
> >>>>>>> +-                k = mnt_table_next_fs(tb, itr, &fs);
> >>>>>>> ++                k = mnt_table_next_fs(t, i, &fs);
> >>>>>>> +                 if (k == 1)
> >>>>>>> +                         break;
> >>>>>>> +-                else if (k < 0)
> >>>>>>> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
> >>>>>>> ++                if (k < 0)
> >>>>>>> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
> >>>>>>> +
> >>>>>>> +                 device = mnt_fs_get_source(fs);
> >>>>>>> +                 path = mnt_fs_get_target(fs);
> >>>>>>> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> >>>>>>> +                 fstype = mnt_fs_get_fstype(fs);
> >>>>>>> +
> >>>>>>> +                 d = cunescape(device);
> >>>>>>> ++                if (!d)
> >>>>>>> ++                        return log_oom();
> >>>>>>> ++
> >>>>>>> +                 p = cunescape(path);
> >>>>>>> +-                if (!d || !p)
> >>>>>>> ++                if (!p)
> >>>>>>> +                         return log_oom();
> >>>>>>> +
> >>>>>>> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
> >>>>>>> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
> >>>>>>> ++
> >>>>>>> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
> >>>>>>> +                 if (r == 0 && k < 0)
> >>>>>>> +                         r = k;
> >>>>>>> +         }
> >>>>>>> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> >>>>>>> +
> >>>>>>> +         r = mount_load_proc_self_mountinfo(m, true);
> >>>>>>> +         if (r < 0) {
> >>>>>>> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
> >>>>>>> +-
> >>>>>>> +                 /* Reset flags, just in case, for later calls */
> >>>>>>> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
> >>>>>>> +                         Mount *mount = MOUNT(u);
> >>>>>>> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> >>>>>>> +                                 break;
> >>>>>>> +                         }
> >>>>>>> +
> >>>>>>> ++                        if (mount->parameters_proc_self_mountinfo.what)
> >>>>>>> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
> >>>>>>> ++
> >>>>>>> ++
> >>>>>>> +                 } else if (mount->just_mounted || mount->just_changed) {
> >>>>>>> +
> >>>>>>> +                         /* New or changed mount entry */
> >>>>>>> +diff --git a/src/core/swap.c b/src/core/swap.c
> >>>>>>> +index 6997921..5c19af5 100644
> >>>>>>> +--- a/src/core/swap.c
> >>>>>>> ++++ b/src/core/swap.c
> >>>>>>> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
> >>>>>>> +         return swap_verify(s);
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-static int swap_add_one(
> >>>>>>> ++static int swap_setup_unit(
> >>>>>>> +                 Manager *m,
> >>>>>>> +                 const char *what,
> >>>>>>> +                 const char *what_proc_swaps,
> >>>>>>> +@@ -363,8 +363,10 @@ static int swap_add_one(
> >>>>>>> +
> >>>>>>> +         if (u &&
> >>>>>>> +             SWAP(u)->from_proc_swaps &&
> >>>>>>> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
> >>>>>>> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
> >>>>>>> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
> >>>>>>> +                 return -EEXIST;
> >>>>>>> ++        }
> >>>>>>> +
> >>>>>>> +         if (!u) {
> >>>>>>> +                 delete = true;
> >>>>>>> +@@ -379,7 +381,7 @@ static int swap_add_one(
> >>>>>>> +
> >>>>>>> +                 SWAP(u)->what = strdup(what);
> >>>>>>> +                 if (!SWAP(u)->what) {
> >>>>>>> +-                        r = log_oom();
> >>>>>>> ++                        r = -ENOMEM;
> >>>>>>> +                         goto fail;
> >>>>>>> +                 }
> >>>>>>> +
> >>>>>>> +@@ -407,7 +409,6 @@ static int swap_add_one(
> >>>>>>> +         p->priority = priority;
> >>>>>>> +
> >>>>>>> +         unit_add_to_dbus_queue(u);
> >>>>>>> +-
> >>>>>>> +         return 0;
> >>>>>>> +
> >>>>>>> + fail:
> >>>>>>> +@@ -419,7 +420,7 @@ fail:
> >>>>>>> +         return r;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
> >>>>>>> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
> >>>>>>> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
> >>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> >>>>>>> +         const char *dn;
> >>>>>>> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> >>>>>>> +
> >>>>>>> +         assert(m);
> >>>>>>> +
> >>>>>>> +-        r = swap_add_one(m, device, device, prio, set_flags);
> >>>>>>> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
> >>>>>>> +         if (r < 0)
> >>>>>>> +                 return r;
> >>>>>>> +
> >>>>>>> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> >>>>>>> +         /* Add the main device node */
> >>>>>>> +         dn = udev_device_get_devnode(d);
> >>>>>>> +         if (dn && !streq(dn, device))
> >>>>>>> +-                swap_add_one(m, dn, device, prio, set_flags);
> >>>>>>> ++                swap_setup_unit(m, dn, device, prio, set_flags);
> >>>>>>> +
> >>>>>>> +         /* Add additional units for all symlinks */
> >>>>>>> +         first = udev_device_get_devlinks_list_entry(d);
> >>>>>>> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> >>>>>>> +                             st.st_rdev != udev_device_get_devnum(d))
> >>>>>>> +                                 continue;
> >>>>>>> +
> >>>>>>> +-                swap_add_one(m, p, device, prio, set_flags);
> >>>>>>> ++                swap_setup_unit(m, p, device, prio, set_flags);
> >>>>>>> +         }
> >>>>>>> +
> >>>>>>> +         return r;
> >>>>>>> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
> >>>>>>> +                         if (k == EOF)
> >>>>>>> +                                 break;
> >>>>>>> +
> >>>>>>> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
> >>>>>>> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
> >>>>>>> +                         continue;
> >>>>>>> +                 }
> >>>>>>> +
> >>>>>>> +                 d = cunescape(dev);
> >>>>>>> +                 if (!d)
> >>>>>>> +-                        return -ENOMEM;
> >>>>>>> ++                        return log_oom();
> >>>>>>> ++
> >>>>>>> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
> >>>>>>> +
> >>>>>>> +-                k = swap_process_new_swap(m, d, prio, set_flags);
> >>>>>>> ++                k = swap_process_new(m, d, prio, set_flags);
> >>>>>>> +                 if (k < 0)
> >>>>>>> +                         r = k;
> >>>>>>> +         }
> >>>>>>> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
> >>>>>>> +                                 break;
> >>>>>>> +                         }
> >>>>>>> +
> >>>>>>> ++                        if (swap->what)
> >>>>>>> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
> >>>>>>> ++
> >>>>>>> +                 } else if (swap->just_activated) {
> >>>>>>> +
> >>>>>>> +                         /* New swap entry */
> >>>>>>> +@@ -1298,7 +1304,7 @@ fail:
> >>>>>>> +         return r;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
> >>>>>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
> >>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> >>>>>>> +         _cleanup_free_ char *e = NULL;
> >>>>>>> +         const char *dn;
> >>>>>>> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
> >>>>>>> +         return r;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
> >>>>>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
> >>>>>>> +         const char *dn;
> >>>>>>> +         int r = 0;
> >>>>>>> +         Swap *s;
> >>>>>>> +diff --git a/src/core/swap.h b/src/core/swap.h
> >>>>>>> +index 73e64d8..914a2db 100644
> >>>>>>> +--- a/src/core/swap.h
> >>>>>>> ++++ b/src/core/swap.h
> >>>>>>> +@@ -116,8 +116,8 @@ struct Swap {
> >>>>>>> +
> >>>>>>> + extern const UnitVTable swap_vtable;
> >>>>>>> +
> >>>>>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
> >>>>>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
> >>>>>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
> >>>>>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
> >>>>>>> +
> >>>>>>> + const char* swap_state_to_string(SwapState i) _const_;
> >>>>>>> + SwapState swap_state_from_string(const char *s) _pure_;
> >>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> >>>>>>> +index 563f6fe..a6558ee 100644
> >>>>>>> +--- a/src/core/unit.c
> >>>>>>> ++++ b/src/core/unit.c
> >>>>>>> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> >>>>>>> +                 return -ENOMEM;
> >>>>>>> +
> >>>>>>> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
> >>>>>>> +-
> >>>>>>> +         if (r < 0)
> >>>>>>> +                 return r;
> >>>>>>> +
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..d614085
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> >>>>>>> @@ -0,0 +1,26 @@
> >>>>>>> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> >>>>>>> +Date: Sat, 28 Feb 2015 23:39:55 +0100
> >>>>>>> +Subject: [PATCH 18/26] core: fix return value on OOM
> >>>>>>> +
> >>>>>>> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
> >>>>>>> +---
> >>>>>>> + src/core/device.c | 2 ++
> >>>>>>> + 1 file changed, 2 insertions(+)
> >>>>>>> +
> >>>>>>> +diff --git a/src/core/device.c b/src/core/device.c
> >>>>>>> +index 75b9a46..1cc103c 100644
> >>>>>>> +--- a/src/core/device.c
> >>>>>>> ++++ b/src/core/device.c
> >>>>>>> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
> >>>>>>> +                         j = strjoin(model, " ", label, NULL);
> >>>>>>> +                         if (j)
> >>>>>>> +                                 r = unit_set_description(u, j);
> >>>>>>> ++                        else
> >>>>>>> ++                                r = -ENOMEM;
> >>>>>>> +                 } else
> >>>>>>> +                         r = unit_set_description(u, model);
> >>>>>>> +         } else
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..d94da60
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> >>>>>>> @@ -0,0 +1,33 @@
> >>>>>>> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
> >>>>>>> +Date: Thu, 19 Feb 2015 20:47:28 +0100
> >>>>>>> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
> >>>>>>> + bus on dbus1
> >>>>>>> +
> >>>>>>> +This fixes "machinectl login" on systems configured with --disable-kdbus.
> >>>>>>> +
> >>>>>>> +The error was:
> >>>>>>> +machinectl login foo
> >>>>>>> +Failed to get machine PTY: Input/output error
> >>>>>>> +
> >>>>>>> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
> >>>>>>> +---
> >>>>>>> + src/machine/machine-dbus.c | 2 +-
> >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
> >>>>>>> +index b46f0a8..b0f0f66 100644
> >>>>>>> +--- a/src/machine/machine-dbus.c
> >>>>>>> ++++ b/src/machine/machine-dbus.c
> >>>>>>> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
> >>>>>>> + #ifdef ENABLE_KDBUS
> >>>>>>> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
> >>>>>>> + #else
> >>>>>>> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
> >>>>>>> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
> >>>>>>> + #endif
> >>>>>>> +         if (!container_bus->address)
> >>>>>>> +                 return -ENOMEM;
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..fcc2adf
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> >>>>>>> @@ -0,0 +1,25 @@
> >>>>>>> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
> >>>>>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> >>>>>>> +Date: Fri, 20 Feb 2015 15:35:11 -0300
> >>>>>>> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
> >>>>>>> +
> >>>>>>> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
> >>>>>>> +---
> >>>>>>> + src/shared/util.c | 1 +
> >>>>>>> + 1 file changed, 1 insertion(+)
> >>>>>>> +
> >>>>>>> +diff --git a/src/shared/util.c b/src/shared/util.c
> >>>>>>> +index ba035ca..f24b5b4 100644
> >>>>>>> +--- a/src/shared/util.c
> >>>>>>> ++++ b/src/shared/util.c
> >>>>>>> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
> >>>>>>> +
> >>>>>>> + bool fstype_is_network(const char *fstype) {
> >>>>>>> +         static const char table[] =
> >>>>>>> ++                "afs\0"
> >>>>>>> +                 "cifs\0"
> >>>>>>> +                 "smbfs\0"
> >>>>>>> +                 "sshfs\0"
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..02e279d
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> >>>>>>> @@ -0,0 +1,31 @@
> >>>>>>> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
> >>>>>>> +Date: Fri, 20 Feb 2015 10:53:28 +0100
> >>>>>>> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
> >>>>>>> +
> >>>>>>> +Otherwise every daemon reload prints out warnings like:
> >>>>>>> +
> >>>>>>> +systemd[1]: Unit type .busname is not supported on this system.
> >>>>>>> +systemd[1]: Unit type .swap is not supported on this system.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
> >>>>>>> +---
> >>>>>>> + src/core/manager.c | 2 +-
> >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/core/manager.c b/src/core/manager.c
> >>>>>>> +index 4775219..bc9b7ec 100644
> >>>>>>> +--- a/src/core/manager.c
> >>>>>>> ++++ b/src/core/manager.c
> >>>>>>> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
> >>>>>>> +                 int q;
> >>>>>>> +
> >>>>>>> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
> >>>>>>> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> >>>>>>> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> >>>>>>> +                         continue;
> >>>>>>> +                 }
> >>>>>>> +
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..f5afd09
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> >>>>>>> @@ -0,0 +1,97 @@
> >>>>>>> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>>>>> +Date: Mon, 2 Mar 2015 10:34:51 -0500
> >>>>>>> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
> >>>>>>> +
> >>>>>>> +Binary fields were not processed properly, and resulting journal files
> >>>>>>> +were non-conforming, resulting in an error ("Invalid field.") when reading.
> >>>>>>> +
> >>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
> >>>>>>> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
> >>>>>>> +---
> >>>>>>> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
> >>>>>>> + src/journal-remote/journal-remote-parse.h |  4 +++-
> >>>>>>> + 2 files changed, 21 insertions(+), 14 deletions(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
> >>>>>>> +index d9dea8d..afded7e 100644
> >>>>>>> +--- a/src/journal-remote/journal-remote-parse.c
> >>>>>>> ++++ b/src/journal-remote/journal-remote-parse.c
> >>>>>>> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
> >>>>>>> +                    LLLLLLLL0011223344...\n
> >>>>>>> +                 */
> >>>>>>> +                 sep = memchr(line, '=', n);
> >>>>>>> +-                if (sep)
> >>>>>>> ++                if (sep) {
> >>>>>>> +                         /* chomp newline */
> >>>>>>> +                         n--;
> >>>>>>> +-                else
> >>>>>>> ++
> >>>>>>> ++                        r = iovw_put(&source->iovw, line, n);
> >>>>>>> ++                        if (r < 0)
> >>>>>>> ++                                return r;
> >>>>>>> ++                } else {
> >>>>>>> +                         /* replace \n with = */
> >>>>>>> +                         line[n-1] = '=';
> >>>>>>> +-                log_trace("Received: %.*s", (int) n, line);
> >>>>>>> +
> >>>>>>> +-                r = iovw_put(&source->iovw, line, n);
> >>>>>>> +-                if (r < 0) {
> >>>>>>> +-                        log_error("Failed to put line in iovect");
> >>>>>>> +-                        return r;
> >>>>>>> ++                        source->field_len = n;
> >>>>>>> ++                        source->state = STATE_DATA_START;
> >>>>>>> ++
> >>>>>>> ++                        /* we cannot put the field in iovec until we have all data */
> >>>>>>> +                 }
> >>>>>>> +
> >>>>>>> +-                if (!sep)
> >>>>>>> +-                        source->state = STATE_DATA_START;
> >>>>>>> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
> >>>>>>> ++
> >>>>>>> +                 return 0; /* continue */
> >>>>>>> +         }
> >>>>>>> +
> >>>>>>> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
> >>>>>>> +
> >>>>>>> +         case STATE_DATA: {
> >>>>>>> +                 void *data;
> >>>>>>> ++                char *field;
> >>>>>>> +
> >>>>>>> +                 assert(source->data_size > 0);
> >>>>>>> +
> >>>>>>> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
> >>>>>>> +
> >>>>>>> +                 assert(data);
> >>>>>>> +
> >>>>>>> +-                r = iovw_put(&source->iovw, data, source->data_size);
> >>>>>>> +-                if (r < 0) {
> >>>>>>> +-                        log_error("failed to put binary buffer in iovect");
> >>>>>>> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
> >>>>>>> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
> >>>>>>> ++
> >>>>>>> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
> >>>>>>> ++                if (r < 0)
> >>>>>>> +                         return r;
> >>>>>>> +-                }
> >>>>>>> +
> >>>>>>> +                 source->state = STATE_DATA_FINISH;
> >>>>>>> +
> >>>>>>> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
> >>>>>>> +index 8499f4e..22db550 100644
> >>>>>>> +--- a/src/journal-remote/journal-remote-parse.h
> >>>>>>> ++++ b/src/journal-remote/journal-remote-parse.h
> >>>>>>> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
> >>>>>>> +         size_t offset;     /* offset to the beginning of live data in the buffer */
> >>>>>>> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
> >>>>>>> +         size_t filled;     /* total number of bytes in the buffer */
> >>>>>>> +-        size_t data_size;  /* size of the binary data chunk being processed */
> >>>>>>> ++
> >>>>>>> ++        size_t field_len;  /* used for binary fields: the field name length */
> >>>>>>> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
> >>>>>>> +
> >>>>>>> +         struct iovec_wrapper iovw;
> >>>>>>> +
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..79e565b
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> >>>>>>> @@ -0,0 +1,37 @@
> >>>>>>> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> >>>>>>> +Date: Sun, 1 Mar 2015 21:13:10 -0300
> >>>>>>> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
> >>>>>>> +
> >>>>>>> +Logs constantly show
> >>>>>>> +
> >>>>>>> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
> >>>>>>> +
> >>>>>>> +This is because ext4 does not support FS_NOCOW_FL.
> >>>>>>> +
> >>>>>>> +[zj: fold into one conditional as suggested on the ML and
> >>>>>>> +     fix (preexisting) r/errno confusion in error message.]
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
> >>>>>>> +---
> >>>>>>> + src/journal/journal-file.c | 4 ++--
> >>>>>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
> >>>>>>> +index 2845e05..0f28718 100644
> >>>>>>> +--- a/src/journal/journal-file.c
> >>>>>>> ++++ b/src/journal/journal-file.c
> >>>>>>> +@@ -2611,8 +2611,8 @@ int journal_file_open(
> >>>>>>> +                  * shouldn't be too bad, given that we do our own
> >>>>>>> +                  * checksumming). */
> >>>>>>> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
> >>>>>>> +-                if (r < 0)
> >>>>>>> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
> >>>>>>> ++                if (r < 0 && r != -ENOTTY)
> >>>>>>> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
> >>>>>>> +
> >>>>>>> +                 /* Let's attach the creation time to the journal file,
> >>>>>>> +                  * so that the vacuuming code knows the age of this
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..0cf9a0a
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> >>>>>>> @@ -0,0 +1,53 @@
> >>>>>>> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Lennart Poettering <lennart@poettering.net>
> >>>>>>> +Date: Mon, 2 Mar 2015 20:55:38 +0100
> >>>>>>> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
> >>>>>>> + happy
> >>>>>>> +
> >>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
> >>>>>>> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
> >>>>>>> +---
> >>>>>>> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
> >>>>>>> + 1 file changed, 5 insertions(+), 7 deletions(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
> >>>>>>> +index 028c2a7..22a3a53 100644
> >>>>>>> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
> >>>>>>> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
> >>>>>>> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> >>>>>>> +                 .msg_iovlen = 1,
> >>>>>>> +                 .msg_name = &sockaddr,
> >>>>>>> +         };
> >>>>>>> +-        union {
> >>>>>>> +-                struct cmsghdr cmsghdr;
> >>>>>>> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
> >>>>>>> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
> >>>>>>> +-        } control;
> >>>>>>> ++        struct cmsghdr *control;
> >>>>>>> +         _cleanup_close_ int fd = -1;
> >>>>>>> +         struct cmsghdr *cmsg = NULL;
> >>>>>>> +         const char *e;
> >>>>>>> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> >>>>>>> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
> >>>>>>> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
> >>>>>>> +
> >>>>>>> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
> >>>>>>> ++
> >>>>>>> +         if (n_fds > 0) {
> >>>>>>> +-                msghdr.msg_control = &control;
> >>>>>>> ++                msghdr.msg_control = control;
> >>>>>>> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
> >>>>>>> +
> >>>>>>> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
> >>>>>>> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> >>>>>>> +                 try_without_ucred = true;
> >>>>>>> +                 controllen_without_ucred = msghdr.msg_controllen;
> >>>>>>> +
> >>>>>>> +-                msghdr.msg_control = &control;
> >>>>>>> ++                msghdr.msg_control = control;
> >>>>>>> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
> >>>>>>> +
> >>>>>>> +                 if (cmsg)
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..6912489
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> >>>>>>> @@ -0,0 +1,84 @@
> >>>>>>> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
> >>>>>>> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
> >>>>>>> +Date: Tue, 3 Mar 2015 00:35:08 +0100
> >>>>>>> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
> >>>>>>> + filesystems
> >>>>>>> +
> >>>>>>> +A warning is printed if ACLs cannot be retrieved for any reason other
> >>>>>>> +than -ENOSYS. For -ENOSYS, debug log is printed.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
> >>>>>>> +---
> >>>>>>> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
> >>>>>>> + 1 file changed, 20 insertions(+), 16 deletions(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> >>>>>>> +index 88ba7e4..187997e 100644
> >>>>>>> +--- a/src/tmpfiles/tmpfiles.c
> >>>>>>> ++++ b/src/tmpfiles/tmpfiles.c
> >>>>>>> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> >>>>>>> +         int r;
> >>>>>>> +         _cleanup_(acl_free_charpp) char *t = NULL;
> >>>>>>> +
> >>>>>>> ++        /* Returns 0 for success, positive error if already warned,
> >>>>>>> ++         * negative error otherwise. */
> >>>>>>> ++
> >>>>>>> +         if (modify) {
> >>>>>>> +                 r = acls_for_file(path, type, acl, &dup);
> >>>>>>> +                 if (r < 0)
> >>>>>>> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> >>>>>>> +
> >>>>>>> +         r = acl_set_file(path, type, dup);
> >>>>>>> +         if (r < 0)
> >>>>>>> +-                return log_error_errno(-errno,
> >>>>>>> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
> >>>>>>> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
> >>>>>>> +-                                       strna(t), path);
> >>>>>>> ++                return -log_error_errno(errno,
> >>>>>>> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
> >>>>>>> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
> >>>>>>> ++                                        strna(t), path);
> >>>>>>> ++
> >>>>>>> +         return 0;
> >>>>>>> + }
> >>>>>>> + #endif
> >>>>>>> +
> >>>>>>> + static int path_set_acls(Item *item, const char *path) {
> >>>>>>> ++        int r = 0;
> >>>>>>> + #ifdef HAVE_ACL
> >>>>>>> +-        int r;
> >>>>>>> +-
> >>>>>>> +         assert(item);
> >>>>>>> +         assert(path);
> >>>>>>> +
> >>>>>>> +-        if (item->acl_access) {
> >>>>>>> ++        if (item->acl_access)
> >>>>>>> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
> >>>>>>> +-                if (r < 0)
> >>>>>>> +-                        return r;
> >>>>>>> +-        }
> >>>>>>> +
> >>>>>>> +-        if (item->acl_default) {
> >>>>>>> ++        if (r == 0 && item->acl_default)
> >>>>>>> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
> >>>>>>> +-                if (r < 0)
> >>>>>>> +-                        return r;
> >>>>>>> +-        }
> >>>>>>> +-#endif
> >>>>>>> +
> >>>>>>> +-        return 0;
> >>>>>>> ++        if (r > 0)
> >>>>>>> ++                return -r; /* already warned */
> >>>>>>> ++        else if (r == -ENOTSUP) {
> >>>>>>> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
> >>>>>>> ++                return 0;
> >>>>>>> ++        } else if (r < 0)
> >>>>>>> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
> >>>>>>> ++#endif
> >>>>>>> ++        return r;
> >>>>>>> + }
> >>>>>>> +
> >>>>>>> + static int write_one_file(Item *i, const char *path) {
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> >>>>>>> new file mode 100644
> >>>>>>> index 0000000..a49a369
> >>>>>>> --- /dev/null
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> >>>>>>> @@ -0,0 +1,30 @@
> >>>>>>> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
> >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> >>>>>>> +Date: Tue, 3 Mar 2015 19:07:28 -0500
> >>>>>>> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
> >>>>>>> + missing
> >>>>>>> +
> >>>>>>> +On s390 (at least) /sys/class/power_supply is not present. We should
> >>>>>>> +treat this like if this directory was empty, and not an error.
> >>>>>>> +
> >>>>>>> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
> >>>>>>> +---
> >>>>>>> + src/shared/util.c | 2 +-
> >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>> +
> >>>>>>> +diff --git a/src/shared/util.c b/src/shared/util.c
> >>>>>>> +index f24b5b4..8548723 100644
> >>>>>>> +--- a/src/shared/util.c
> >>>>>>> ++++ b/src/shared/util.c
> >>>>>>> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
> >>>>>>> +
> >>>>>>> +         d = opendir("/sys/class/power_supply");
> >>>>>>> +         if (!d)
> >>>>>>> +-                return -errno;
> >>>>>>> ++                return errno == ENOENT ? true : -errno;
> >>>>>>> +
> >>>>>>> +         for (;;) {
> >>>>>>> +                 struct dirent *de;
> >>>>>>> +--
> >>>>>>> +1.9.1
> >>>>>>> +
> >>>>>>> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
> >>>>>>> index 73b930e..9c20b11 100644
> >>>>>>> --- a/meta/recipes-core/systemd/systemd_219.bb
> >>>>>>> +++ b/meta/recipes-core/systemd/systemd_219.bb
> >>>>>>> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> >>>>>>>           file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
> >>>>>>>           file://0010-Make-root-s-home-directory-configurable.patch \
> >>>>>>>           file://0011-systemd-user-avoid-using-system-auth.patch \
> >>>>>>> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> >>>>>>> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> >>>>>>>           file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
> >>>>>>> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> >>>>>>>           file://0014-Revert-rules-remove-firmware-loading-rules.patch \
> >>>>>>>           file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
> >>>>>>>           file://tmpfiles-pam.patch \
> >>>>>>> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> >>>>>>> 
> >>>>>>> S = "${WORKDIR}/git"
> >>>>>>> 
> >>>>>>> +# Appending backport fixes released for version 219-stable
> >>>>>>> +SRC_URI_append = "\
> >>>>>>> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
> >>>>>>> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
> >>>>>>> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
> >>>>>>> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
> >>>>>>> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> >>>>>>> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
> >>>>>>> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
> >>>>>>> +           file://0008-bootchart-fix-default-init-path.patch \
> >>>>>>> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
> >>>>>>> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
> >>>>>>> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
> >>>>>>> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
> >>>>>>> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
> >>>>>>> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
> >>>>>>> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
> >>>>>>> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
> >>>>>>> +           file://0017-core-rework-device-state-logic.patch \
> >>>>>>> +           file://0018-core-fix-return-value-on-OOM.patch \
> >>>>>>> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
> >>>>>>> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
> >>>>>>> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
> >>>>>>> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
> >>>>>>> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> >>>>>>> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
> >>>>>>> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> >>>>>>> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
> >>>>>>> +           "
> >>>>>>> +
> >>>>>>> SRC_URI_append_libc-uclibc = "\
> >>>>>>>            file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
> >>>>>>>           "
> >>>>>>> --
> >>>>>>> 1.9.1
> >>>>>>> 
> >>>>>> 
> >>>>>> 
> >>>>>> --
> >>>>>> _______________________________________________
> >>>>>> Openembedded-core mailing list
> >>>>>> Openembedded-core@lists.openembedded.org
> >>>>>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
> >>>>> 
> >>>>> 
> >>>>> 
> >>>> 
> >>>> 
> >>> 
> >> 
> >> 
> > 
> > 
> 




^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-04-09 12:57               ` Bottazzini, Bruno
@ 2015-04-13 21:21                 ` Bottazzini, Bruno
  2015-04-15 13:23                   ` Bottazzini, Bruno
  0 siblings, 1 reply; 12+ messages in thread
From: Bottazzini, Bruno @ 2015-04-13 21:21 UTC (permalink / raw)
  To: Patches and discussions about the oe-core layer

Ping

On Qui, 2015-04-09 at 09:57 -0300, Bottazzini, Bruno wrote:
> Good! 
> 
> When will this patch be merged with master?
> 
> Thanks and best regards
> 
> On Ter, 2015-04-07 at 12:33 -0700, Khem Raj wrote:
> > this looks ok
> > 
> > > On Apr 7, 2015, at 6:10 AM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
> > > 
> > > Ping
> > > 
> > >> On Qua, 2015-04-01 at 14:14 -0700, Khem Raj wrote:
> > >>> I will try it out. give me a day
> > >>> 
> > >>>> On Apr 1, 2015, at 2:08 PM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
> > >>>> 
> > >>>> Khem,
> > >>>> 
> > >>>> Could you verify this patch and see if this satisfies what you have
> > >>>> pointed previously ?
> > >>>> 
> > >>>> Do you think this patch is ready to go to master ?
> > >>>> 
> > >>>> Regards,
> > >>>> 
> > >>>> On Ter, 2015-03-31 at 17:25 -0300, Otavio Salvador wrote:
> > >>>>> I am not a heavy user of systemd so I prefer other people (Khem?) to
> > >>>>> comment on this ...
> > >>>>> 
> > >>>>> On Tue, Mar 31, 2015 at 5:21 PM, Bottazzini, Bruno
> > >>>>> <bruno.bottazzini@intel.com> wrote:
> > >>>>>> Ping
> > >>>>>> 
> > >>>>>> On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
> > >>>>>>> Adding patches that fix bugs for 219 version.
> > >>>>>>> This will get the same consistency of the stable systemd 219 version.
> > >>>>>>> 
> > >>>>>>> More details:
> > >>>>>>> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
> > >>>>>>> ---
> > >>>>>>> ...remote-fix-certificate-status-memory-leak.patch |  31 +
> > >>>>>>> ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
> > >>>>>>> ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
> > >>>>>>> ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
> > >>>>>>> ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
> > >>>>>>> .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
> > >>>>>>> ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
> > >>>>>>> .../0008-bootchart-fix-default-init-path.patch     |  44 +
> > >>>>>>> ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
> > >>>>>>> ...0-Make-root-s-home-directory-configurable.patch |  89 +-
> > >>>>>>> ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
> > >>>>>>> ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
> > >>>>>>> ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
> > >>>>>>> ...aker-dependencies-between-mount-and-devic.patch |  33 +
> > >>>>>>> ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
> > >>>>>>> ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
> > >>>>>>> ...l-add-some-hints-how-to-override-settings.patch |  39 +
> > >>>>>>> .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
> > >>>>>>> .../0018-core-fix-return-value-on-OOM.patch        |  26 +
> > >>>>>>> ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
> > >>>>>>> ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
> > >>>>>>> ...downgrade-unit-type-not-supported-message.patch |  31 +
> > >>>>>>> ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
> > >>>>>>> ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
> > >>>>>>> ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
> > >>>>>>> ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
> > >>>>>>> ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
> > >>>>>>> meta/recipes-core/systemd/systemd_219.bb           |  33 +-
> > >>>>>>> 28 files changed, 2050 insertions(+), 55 deletions(-)
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> > >>>>>>> 
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..172bea2
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> > >>>>>>> @@ -0,0 +1,31 @@
> > >>>>>>> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Michal Schmidt <mschmidt@redhat.com>
> > >>>>>>> +Date: Tue, 17 Feb 2015 10:33:01 +0100
> > >>>>>>> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
> > >>>>>>> +
> > >>>>>>> +The output of gnutls_certificate_verification_status_print() needs to be
> > >>>>>>> +freed.
> > >>>>>>> +
> > >>>>>>> +Noticed this while staring at verify_cert_authorized() to see what could
> > >>>>>>> +possibly confuse gcc5 on armv7hl to segfault during compilation.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
> > >>>>>>> +---
> > >>>>>>> + src/journal-remote/microhttpd-util.c | 1 +
> > >>>>>>> + 1 file changed, 1 insertion(+)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> > >>>>>>> +index 34d9337..de9c6ab 100644
> > >>>>>>> +--- a/src/journal-remote/microhttpd-util.c
> > >>>>>>> ++++ b/src/journal-remote/microhttpd-util.c
> > >>>>>>> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
> > >>>>>>> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
> > >>>>>>> +
> > >>>>>>> +         log_info("Certificate status: %s", out.data);
> > >>>>>>> ++        gnutls_free(out.data);
> > >>>>>>> +
> > >>>>>>> +         return status == 0 ? 0 : -EPERM;
> > >>>>>>> + }
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..f615876
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> > >>>>>>> @@ -0,0 +1,35 @@
> > >>>>>>> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Michal Schmidt <mschmidt@redhat.com>
> > >>>>>>> +Date: Tue, 17 Feb 2015 10:36:57 +0100
> > >>>>>>> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
> > >>>>>>> +
> > >>>>>>> +Found by Valgrind while testing the previous memory leak fix.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
> > >>>>>>> +---
> > >>>>>>> + src/journal-remote/microhttpd-util.c | 6 +++++-
> > >>>>>>> + 1 file changed, 5 insertions(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> > >>>>>>> +index de9c6ab..a95fff1 100644
> > >>>>>>> +--- a/src/journal-remote/microhttpd-util.c
> > >>>>>>> ++++ b/src/journal-remote/microhttpd-util.c
> > >>>>>>> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
> > >>>>>>> +         return 0;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
> > >>>>>>> ++        gnutls_x509_crt_deinit(*p);
> > >>>>>>> ++}
> > >>>>>>> ++
> > >>>>>>> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
> > >>>>>>> +         const union MHD_ConnectionInfo *ci;
> > >>>>>>> +         gnutls_session_t session;
> > >>>>>>> +-        gnutls_x509_crt_t client_cert;
> > >>>>>>> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
> > >>>>>>> +         _cleanup_free_ char *buf = NULL;
> > >>>>>>> +         int r;
> > >>>>>>> +
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..15fa98c
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> > >>>>>>> @@ -0,0 +1,28 @@
> > >>>>>>> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
> > >>>>>>> +Date: Tue, 17 Feb 2015 12:47:51 +0100
> > >>>>>>> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
> > >>>>>>> +
> > >>>>>>> +parse_acl() returns the error instead of setting errno.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
> > >>>>>>> +---
> > >>>>>>> + src/tmpfiles/tmpfiles.c | 2 +-
> > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> > >>>>>>> +index c948d4d..88ba7e4 100644
> > >>>>>>> +--- a/src/tmpfiles/tmpfiles.c
> > >>>>>>> ++++ b/src/tmpfiles/tmpfiles.c
> > >>>>>>> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
> > >>>>>>> +          * afterwards, so the mask can be added now if necessary. */
> > >>>>>>> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
> > >>>>>>> +         if (r < 0)
> > >>>>>>> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
> > >>>>>>> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
> > >>>>>>> +                                   item->argument);
> > >>>>>>> + #else
> > >>>>>>> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..f43068d
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> > >>>>>>> @@ -0,0 +1,26 @@
> > >>>>>>> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Tom Gundersen <teg@jklm.no>
> > >>>>>>> +Date: Wed, 18 Feb 2015 14:33:50 +0100
> > >>>>>>> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
> > >>>>>>> +---
> > >>>>>>> + src/test/test-utf8.c | 2 +-
> > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
> > >>>>>>> +index befa385..346f852 100644
> > >>>>>>> +--- a/src/test/test-utf8.c
> > >>>>>>> ++++ b/src/test/test-utf8.c
> > >>>>>>> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
> > >>>>>>> +
> > >>>>>>> + static void test_utf16_to_utf8(void) {
> > >>>>>>> +         char *a = NULL;
> > >>>>>>> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
> > >>>>>>> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
> > >>>>>>> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
> > >>>>>>> +
> > >>>>>>> +         a = utf16_to_utf8(utf16, 14);
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..35fe913
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> > >>>>>>> @@ -0,0 +1,131 @@
> > >>>>>>> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>>>>> +Date: Mon, 23 Feb 2015 23:19:54 -0500
> > >>>>>>> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
> > >>>>>>> +
> > >>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
> > >>>>>>> +https://bugs.debian.org/778656
> > >>>>>>> +
> > >>>>>>> +Status quo ante can be restored with:
> > >>>>>>> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
> > >>>>>>> +---
> > >>>>>>> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
> > >>>>>>> + src/shared/acl-util.h |  4 +++
> > >>>>>>> + 2 files changed, 81 insertions(+), 2 deletions(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> > >>>>>>> +index a4ff1ab..cbe09d7 100644
> > >>>>>>> +--- a/src/shared/acl-util.c
> > >>>>>>> ++++ b/src/shared/acl-util.c
> > >>>>>>> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
> > >>>>>>> +         return 0;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> > >>>>>>> ++        acl_tag_t tag_a, tag_b;
> > >>>>>>> ++
> > >>>>>>> ++        if (acl_get_tag_type(a, &tag_a) < 0)
> > >>>>>>> ++                return -errno;
> > >>>>>>> ++
> > >>>>>>> ++        if (acl_get_tag_type(b, &tag_b) < 0)
> > >>>>>>> ++                return -errno;
> > >>>>>>> ++
> > >>>>>>> ++        if (tag_a != tag_b)
> > >>>>>>> ++                return false;
> > >>>>>>> ++
> > >>>>>>> ++        switch (tag_a) {
> > >>>>>>> ++        case ACL_USER_OBJ:
> > >>>>>>> ++        case ACL_GROUP_OBJ:
> > >>>>>>> ++        case ACL_MASK:
> > >>>>>>> ++        case ACL_OTHER:
> > >>>>>>> ++                /* can have only one of those */
> > >>>>>>> ++                return true;
> > >>>>>>> ++        case ACL_USER: {
> > >>>>>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> > >>>>>>> ++
> > >>>>>>> ++                uid_a = acl_get_qualifier(a);
> > >>>>>>> ++                if (!uid_a)
> > >>>>>>> ++                        return -errno;
> > >>>>>>> ++
> > >>>>>>> ++                uid_b = acl_get_qualifier(b);
> > >>>>>>> ++                if (!uid_b)
> > >>>>>>> ++                        return -errno;
> > >>>>>>> ++
> > >>>>>>> ++                return *uid_a == *uid_b;
> > >>>>>>> ++        }
> > >>>>>>> ++        case ACL_GROUP: {
> > >>>>>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> > >>>>>>> ++
> > >>>>>>> ++                gid_a = acl_get_qualifier(a);
> > >>>>>>> ++                if (!gid_a)
> > >>>>>>> ++                        return -errno;
> > >>>>>>> ++
> > >>>>>>> ++                gid_b = acl_get_qualifier(b);
> > >>>>>>> ++                if (!gid_b)
> > >>>>>>> ++                        return -errno;
> > >>>>>>> ++
> > >>>>>>> ++                return *gid_a == *gid_b;
> > >>>>>>> ++        }
> > >>>>>>> ++        default:
> > >>>>>>> ++                assert_not_reached("Unknown acl tag type");
> > >>>>>>> ++        }
> > >>>>>>> ++}
> > >>>>>>> ++
> > >>>>>>> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
> > >>>>>>> ++        acl_entry_t i;
> > >>>>>>> ++        int r;
> > >>>>>>> ++
> > >>>>>>> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
> > >>>>>>> ++             r > 0;
> > >>>>>>> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
> > >>>>>>> ++
> > >>>>>>> ++                r = acl_entry_equal(i, entry);
> > >>>>>>> ++                if (r < 0)
> > >>>>>>> ++                        return r;
> > >>>>>>> ++                if (r > 0) {
> > >>>>>>> ++                        *out = i;
> > >>>>>>> ++                        return 1;
> > >>>>>>> ++                }
> > >>>>>>> ++        }
> > >>>>>>> ++        if (r < 0)
> > >>>>>>> ++                return -errno;
> > >>>>>>> ++        return 0;
> > >>>>>>> ++}
> > >>>>>>> ++
> > >>>>>>> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> > >>>>>>> +         _cleanup_(acl_freep) acl_t old;
> > >>>>>>> +         acl_entry_t i;
> > >>>>>>> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> > >>>>>>> +
> > >>>>>>> +                 acl_entry_t j;
> > >>>>>>> +
> > >>>>>>> +-                if (acl_create_entry(&old, &j) < 0)
> > >>>>>>> +-                        return -errno;
> > >>>>>>> ++                r = find_acl_entry(old, i, &j);
> > >>>>>>> ++                if (r < 0)
> > >>>>>>> ++                        return r;
> > >>>>>>> ++                if (r == 0)
> > >>>>>>> ++                        if (acl_create_entry(&old, &j) < 0)
> > >>>>>>> ++                                return -errno;
> > >>>>>>> +
> > >>>>>>> +                 if (acl_copy_entry(j, i) < 0)
> > >>>>>>> +                         return -errno;
> > >>>>>>> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
> > >>>>>>> +index 90e88ff..fdb9006 100644
> > >>>>>>> +--- a/src/shared/acl-util.h
> > >>>>>>> ++++ b/src/shared/acl-util.h
> > >>>>>>> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
> > >>>>>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
> > >>>>>>> + #define acl_free_charp acl_free
> > >>>>>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
> > >>>>>>> ++#define acl_free_uid_tp acl_free
> > >>>>>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
> > >>>>>>> ++#define acl_free_gid_tp acl_free
> > >>>>>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
> > >>>>>>> +
> > >>>>>>> + #endif
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..fc707bb
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> > >>>>>>> @@ -0,0 +1,32 @@
> > >>>>>>> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Daniel Mack <daniel@zonque.org>
> > >>>>>>> +Date: Tue, 24 Feb 2015 13:26:09 +0100
> > >>>>>>> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
> > >>>>>>> +
> > >>>>>>> +  CC       src/shared/libsystemd_shared_la-time-util.lo
> > >>>>>>> +src/shared/time-util.c: In function 'parse_nsec':
> > >>>>>>> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
> > >>>>>>> +                 if (!*s != 0)
> > >>>>>>> +                         ^
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
> > >>>>>>> +---
> > >>>>>>> + src/shared/time-util.c | 2 +-
> > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
> > >>>>>>> +index 947ac1f..1c36c57 100644
> > >>>>>>> +--- a/src/shared/time-util.c
> > >>>>>>> ++++ b/src/shared/time-util.c
> > >>>>>>> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
> > >>>>>>> +         s = startswith(p, "infinity");
> > >>>>>>> +         if (s) {
> > >>>>>>> +                 s += strspn(s, WHITESPACE);
> > >>>>>>> +-                if (!*s != 0)
> > >>>>>>> ++                if (*s != 0)
> > >>>>>>> +                         return -EINVAL;
> > >>>>>>> +
> > >>>>>>> +                 *nsec = NSEC_INFINITY;
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..161b7b5
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> > >>>>>>> @@ -0,0 +1,36 @@
> > >>>>>>> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Daniel Mack <daniel@zonque.org>
> > >>>>>>> +Date: Tue, 24 Feb 2015 13:27:10 +0100
> > >>>>>>> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
> > >>>>>>> +---
> > >>>>>>> + src/test/test-time.c | 6 ++++++
> > >>>>>>> + 1 file changed, 6 insertions(+)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/test/test-time.c b/src/test/test-time.c
> > >>>>>>> +index 8cfc4cc..3840fff 100644
> > >>>>>>> +--- a/src/test/test-time.c
> > >>>>>>> ++++ b/src/test/test-time.c
> > >>>>>>> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
> > >>>>>>> +         assert_se(u == 2);
> > >>>>>>> +         assert_se(parse_nsec(".7", &u) >= 0);
> > >>>>>>> +         assert_se(u == 0);
> > >>>>>>> ++        assert_se(parse_nsec("infinity", &u) >= 0);
> > >>>>>>> ++        assert_se(u == NSEC_INFINITY);
> > >>>>>>> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
> > >>>>>>> ++        assert_se(u == NSEC_INFINITY);
> > >>>>>>> +
> > >>>>>>> +         assert_se(parse_nsec(" xyz ", &u) < 0);
> > >>>>>>> +         assert_se(parse_nsec("", &u) < 0);
> > >>>>>>> +         assert_se(parse_nsec(" . ", &u) < 0);
> > >>>>>>> +         assert_se(parse_nsec(" 5. ", &u) < 0);
> > >>>>>>> +         assert_se(parse_nsec(".s ", &u) < 0);
> > >>>>>>> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
> > >>>>>>> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..7eaad1e
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> > >>>>>>> @@ -0,0 +1,44 @@
> > >>>>>>> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
> > >>>>>>> +Date: Tue, 24 Feb 2015 14:30:10 +0100
> > >>>>>>> +Subject: [PATCH 08/26] bootchart: fix default init path
> > >>>>>>> +
> > >>>>>>> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
> > >>>>>>> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
> > >>>>>>> +multi-arch systems.
> > >>>>>>> +
> > >>>>>>> +https://launchpad.net/bugs/1423867
> > >>>>>>> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
> > >>>>>>> +---
> > >>>>>>> + Makefile.am               | 1 +
> > >>>>>>> + src/bootchart/bootchart.c | 2 +-
> > >>>>>>> + 2 files changed, 2 insertions(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/Makefile.am b/Makefile.am
> > >>>>>>> +index bf04d31..cc577ce 100644
> > >>>>>>> +--- a/Makefile.am
> > >>>>>>> ++++ b/Makefile.am
> > >>>>>>> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
> > >>>>>>> +     -DKEXEC=\"$(KEXEC)\" \
> > >>>>>>> +     -DLIBDIR=\"$(libdir)\" \
> > >>>>>>> +     -DROOTLIBDIR=\"$(rootlibdir)\" \
> > >>>>>>> ++    -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> > >>>>>>> +     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> > >>>>>>> +     -I $(top_srcdir)/src \
> > >>>>>>> +     -I $(top_builddir)/src/shared \
> > >>>>>>> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
> > >>>>>>> +index 64a384b..175be68 100644
> > >>>>>>> +--- a/src/bootchart/bootchart.c
> > >>>>>>> ++++ b/src/bootchart/bootchart.c
> > >>>>>>> +@@ -76,7 +76,7 @@ int sysfd=-1;
> > >>>>>>> + #define DEFAULT_HZ 25.0
> > >>>>>>> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
> > >>>>>>> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
> > >>>>>>> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
> > >>>>>>> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
> > >>>>>>> + #define DEFAULT_OUTPUT "/run/log"
> > >>>>>>> +
> > >>>>>>> + /* graph defaults */
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..dbffa5b
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> > >>>>>>> @@ -0,0 +1,44 @@
> > >>>>>>> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>>>>> +Date: Tue, 24 Feb 2015 10:10:04 -0500
> > >>>>>>> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
> > >>>>>>> +
> > >>>>>>> +It is not necessary when running as telinit, etc.
> > >>>>>>> +
> > >>>>>>> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
> > >>>>>>> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
> > >>>>>>> +---
> > >>>>>>> + src/systemctl/systemctl.c | 10 +++++-----
> > >>>>>>> + 1 file changed, 5 insertions(+), 5 deletions(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
> > >>>>>>> +index 21cb898..6b93ec8 100644
> > >>>>>>> +--- a/src/systemctl/systemctl.c
> > >>>>>>> ++++ b/src/systemctl/systemctl.c
> > >>>>>>> +@@ -7204,6 +7204,11 @@ found:
> > >>>>>>> +                 }
> > >>>>>>> +         }
> > >>>>>>> +
> > >>>>>>> ++        /* Increase max number of open files to 16K if we can, we
> > >>>>>>> ++         * might needs this when browsing journal files, which might
> > >>>>>>> ++         * be split up into many files. */
> > >>>>>>> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> > >>>>>>> ++
> > >>>>>>> +         return verb->dispatch(bus, argv + optind);
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
> > >>>>>>> +                 goto finish;
> > >>>>>>> +         }
> > >>>>>>> +
> > >>>>>>> +-        /* Increase max number of open files to 16K if we can, we
> > >>>>>>> +-         * might needs this when browsing journal files, which might
> > >>>>>>> +-         * be split up into many files. */
> > >>>>>>> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> > >>>>>>> +-
> > >>>>>>> +         if (!avoid_bus())
> > >>>>>>> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
> > >>>>>>> +
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> > >>>>>>> index 41b9039..ff2871b 100644
> > >>>>>>> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> > >>>>>>> @@ -1,7 +1,7 @@
> > >>>>>>> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
> > >>>>>>> -From: Khem Raj <raj.khem@gmail.com>
> > >>>>>>> -Date: Fri, 20 Feb 2015 05:24:49 +0000
> > >>>>>>> -Subject: [PATCH 10/11] Make root's home directory configurable
> > >>>>>>> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
> > >>>>>>> +Date: Thu, 5 Mar 2015 17:38:12 -0300
> > >>>>>>> +Subject: [PATCH] Make root's home directory configurable
> > >>>>>>> 
> > >>>>>>> OpenEmbedded has a configurable home directory for root. Allow
> > >>>>>>> systemd to be built using its idea of what root's home directory
> > >>>>>>> @@ -9,32 +9,31 @@ should be.
> > >>>>>>> 
> > >>>>>>> Upstream-Status: Pending
> > >>>>>>> 
> > >>>>>>> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
> > >>>>>>> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
> > >>>>>>> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
> > >>>>>>> +compatbile with systemd 219-stable
> > >>>>>>> ---
> > >>>>>>> - Makefile.am                       | 2 ++
> > >>>>>>> - configure.ac                      | 7 +++++++
> > >>>>>>> - src/core/unit-printf.c            | 2 +-
> > >>>>>>> - src/nspawn/nspawn.c               | 4 ++--
> > >>>>>>> - src/shared/util.c                 | 4 ++--
> > >>>>>>> - units/console-shell.service.m4.in | 4 ++--
> > >>>>>>> - units/emergency.service.in        | 4 ++--
> > >>>>>>> - units/rescue.service.in           | 4 ++--
> > >>>>>>> - 8 files changed, 20 insertions(+), 11 deletions(-)
> > >>>>>>> + Makefile.am                | 2 ++
> > >>>>>>> + configure.ac               | 7 +++++++
> > >>>>>>> + src/core/unit-printf.c     | 2 +-
> > >>>>>>> + src/nspawn/nspawn.c        | 5 ++---
> > >>>>>>> + src/shared/util.c          | 4 ++--
> > >>>>>>> + units/emergency.service.in | 4 ++--
> > >>>>>>> + units/rescue.service.in    | 4 ++--
> > >>>>>>> + 7 files changed, 18 insertions(+), 10 deletions(-)
> > >>>>>>> 
> > >>>>>>> diff --git a/Makefile.am b/Makefile.am
> > >>>>>>> -index 0fb3f9f..4623963 100644
> > >>>>>>> +index 93c0509..31ea94d 100644
> > >>>>>>> --- a/Makefile.am
> > >>>>>>> +++ b/Makefile.am
> > >>>>>>> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
> > >>>>>>> -     -DKEXEC=\"$(KEXEC)\" \
> > >>>>>>> -     -DLIBDIR=\"$(libdir)\" \
> > >>>>>>> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
> > >>>>>>>     -DROOTLIBDIR=\"$(rootlibdir)\" \
> > >>>>>>> -+    -DROOTHOMEDIR=\"$(roothomedir)\" \
> > >>>>>>> +     -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> > >>>>>>>     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> > >>>>>>> ++    -DROOTHOMEDIR=\"$(roothomedir)\" \
> > >>>>>>>     -I $(top_srcdir)/src \
> > >>>>>>>     -I $(top_builddir)/src/shared \
> > >>>>>>> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
> > >>>>>>> +     -I $(top_srcdir)/src/shared \
> > >>>>>>> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
> > >>>>>>> substitutions = \
> > >>>>>>>        '|rootlibexecdir=$(rootlibexecdir)|' \
> > >>>>>>>        '|rootbindir=$(rootbindir)|' \
> > >>>>>>> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
> > >>>>>>>        '|SYSTEMCTL=$(rootbindir)/systemctl|' \
> > >>>>>>>        '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
> > >>>>>>> diff --git a/configure.ac b/configure.ac
> > >>>>>>> -index a5b2e6e..55bb7d8 100644
> > >>>>>>> +index 01ee8dc..800a587 100644
> > >>>>>>> --- a/configure.ac
> > >>>>>>> +++ b/configure.ac
> > >>>>>>> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
> > >>>>>>> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
> > >>>>>>>         [],
> > >>>>>>>         [with_rootlibdir=${libdir}])
> > >>>>>>> 
> > >>>>>>> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
> > >>>>>>> AC_ARG_WITH([pamlibdir],
> > >>>>>>>         AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
> > >>>>>>>         [],
> > >>>>>>> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> > >>>>>>> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> > >>>>>>> AC_SUBST([pamconfdir], [$with_pamconfdir])
> > >>>>>>> AC_SUBST([rootprefix], [$with_rootprefix])
> > >>>>>>> AC_SUBST([rootlibdir], [$with_rootlibdir])
> > >>>>>>> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
> > >>>>>>> 
> > >>>>>>> AC_CONFIG_FILES([
> > >>>>>>>         Makefile po/Makefile.in
> > >>>>>>> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
> > >>>>>>> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
> > >>>>>>>         include_prefix:          ${INCLUDE_PREFIX}
> > >>>>>>>         lib dir:                 ${libdir}
> > >>>>>>>         rootlib dir:             ${with_rootlibdir}
> > >>>>>>> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
> > >>>>>>>         SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
> > >>>>>>>         Build Python:            ${PYTHON}
> > >>>>>>> diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
> > >>>>>>> -index 97135db..14d12f1 100644
> > >>>>>>> +index 7736899..ac5f008 100644
> > >>>>>>> --- a/src/core/unit-printf.c
> > >>>>>>> +++ b/src/core/unit-printf.c
> > >>>>>>> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> > >>>>>>> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> > >>>>>>>                  * best of it if we can, but fail if we can't */
> > >>>>>>> 
> > >>>>>>>                 if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
> > >>>>>>> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
> > >>>>>>>                         return -ENOTSUP;
> > >>>>>>> 
> > >>>>>>> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
> > >>>>>>> -index b597edb..0b32673 100644
> > >>>>>>> +index 08bfdcf..b44b4cd 100644
> > >>>>>>> --- a/src/nspawn/nspawn.c
> > >>>>>>> +++ b/src/nspawn/nspawn.c
> > >>>>>>> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
> > >>>>>>> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
> > >>>>>>> +                         r = change_uid_gid(&home);
> > >>>>>>>                         if (r < 0)
> > >>>>>>>                                 _exit(EXIT_FAILURE);
> > >>>>>>> -
> > >>>>>>> +-
> > >>>>>>> -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
> > >>>>>>> +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
> > >>>>>>>                             (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
> > >>>>>>>                             (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
> > >>>>>>>                                 log_oom();
> > >>>>>>> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
> > >>>>>>> -                                 execvp(argv[optind], argv + optind);
> > >>>>>>> - #endif /* HAVE_EXECVPE */
> > >>>>>>> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
> > >>>>>>> +                         } else if (argc > optind)
> > >>>>>>> +                                 execvpe(argv[optind], argv + optind, env_use);
> > >>>>>>>                         else {
> > >>>>>>> -                                chdir(home ? home : "/root");
> > >>>>>>> +                                chdir(home ? home : ROOTHOMEDIR);
> > >>>>>>> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
> > >>>>>>>                                 execle("/bin/sh", "-sh", NULL, env_use);
> > >>>>>>>                         }
> > >>>>>>> diff --git a/src/shared/util.c b/src/shared/util.c
> > >>>>>>> -index cbbe3b1..a0e3cc5 100644
> > >>>>>>> +index 241e752..00adab6 100644
> > >>>>>>> --- a/src/shared/util.c
> > >>>>>>> +++ b/src/shared/util.c
> > >>>>>>> -@@ -4609,7 +4609,7 @@ int get_user_creds(
> > >>>>>>> +@@ -4604,7 +4604,7 @@ int get_user_creds(
> > >>>>>>>                         *gid = 0;
> > >>>>>>> 
> > >>>>>>>                 if (home)
> > >>>>>>> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
> > >>>>>>> 
> > >>>>>>>                 if (shell)
> > >>>>>>>                         *shell = "/bin/sh";
> > >>>>>>> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
> > >>>>>>> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
> > >>>>>>>         /* Hardcode home directory for root to avoid NSS */
> > >>>>>>>         u = getuid();
> > >>>>>>>         if (u == 0) {
> > >>>>>>> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
> > >>>>>>>                 if (!h)
> > >>>>>>>                         return -ENOMEM;
> > >>>>>>> 
> > >>>>>>> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
> > >>>>>>> -index 5c80722..efde5f0 100644
> > >>>>>>> ---- a/units/console-shell.service.m4.in
> > >>>>>>> -+++ b/units/console-shell.service.m4.in
> > >>>>>>> -@@ -15,8 +15,8 @@ After=rc-local.service
> > >>>>>>> - Before=getty.target
> > >>>>>>> -
> > >>>>>>> - [Service]
> > >>>>>>> --Environment=HOME=/root
> > >>>>>>> --WorkingDirectory=/root
> > >>>>>>> -+Environment=HOME=@roothomedir@
> > >>>>>>> -+WorkingDirectory=@roothomedir@
> > >>>>>>> - ExecStart=-@SULOGIN@
> > >>>>>>> - ExecStopPost=-@SYSTEMCTL@ poweroff
> > >>>>>>> - Type=idle
> > >>>>>>> diff --git a/units/emergency.service.in b/units/emergency.service.in
> > >>>>>>> index 2695d7b..7f47b73 100644
> > >>>>>>> --- a/units/emergency.service.in
> > >>>>>>> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
> > >>>>>>> ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
> > >>>>>>> ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
> > >>>>>>> --
> > >>>>>>> -2.1.4
> > >>>>>>> +1.9.1
> > >>>>>>> 
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..1e4a69d
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> > >>>>>>> @@ -0,0 +1,37 @@
> > >>>>>>> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> > >>>>>>> +Date: Tue, 24 Feb 2015 20:40:07 +0100
> > >>>>>>> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
> > >>>>>>> +
> > >>>>>>> +CID#1271344/1271345
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
> > >>>>>>> +---
> > >>>>>>> + src/shared/acl-util.c | 4 ++--
> > >>>>>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> > >>>>>>> +index cbe09d7..e67e9ac 100644
> > >>>>>>> +--- a/src/shared/acl-util.c
> > >>>>>>> ++++ b/src/shared/acl-util.c
> > >>>>>>> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> > >>>>>>> +                 /* can have only one of those */
> > >>>>>>> +                 return true;
> > >>>>>>> +         case ACL_USER: {
> > >>>>>>> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> > >>>>>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
> > >>>>>>> +
> > >>>>>>> +                 uid_a = acl_get_qualifier(a);
> > >>>>>>> +                 if (!uid_a)
> > >>>>>>> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> > >>>>>>> +                 return *uid_a == *uid_b;
> > >>>>>>> +         }
> > >>>>>>> +         case ACL_GROUP: {
> > >>>>>>> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> > >>>>>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
> > >>>>>>> +
> > >>>>>>> +                 gid_a = acl_get_qualifier(a);
> > >>>>>>> +                 if (!gid_a)
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..dca5e20
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> > >>>>>>> @@ -0,0 +1,28 @@
> > >>>>>>> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> > >>>>>>> +Date: Tue, 24 Feb 2015 18:32:31 +0200
> > >>>>>>> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
> > >>>>>>> +
> > >>>>>>> +If we have less samples than expected, systemd-bootchart will crash.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
> > >>>>>>> +---
> > >>>>>>> + src/bootchart/svg.c | 2 +-
> > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
> > >>>>>>> +index e111fa9..144177c 100644
> > >>>>>>> +--- a/src/bootchart/svg.c
> > >>>>>>> ++++ b/src/bootchart/svg.c
> > >>>>>>> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
> > >>>>>>> +
> > >>>>>>> +                 ps->sample = ps->sample->next;
> > >>>>>>> +                 sample_hz = ps->sample;
> > >>>>>>> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
> > >>>>>>> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
> > >>>>>>> +                         sample_hz = sample_hz->next;
> > >>>>>>> +
> > >>>>>>> +                 /* subtract bootchart cpu utilization from total */
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..e0cb193
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> > >>>>>>> @@ -0,0 +1,38 @@
> > >>>>>>> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> > >>>>>>> +Date: Mon, 23 Feb 2015 16:01:31 +0200
> > >>>>>>> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
> > >>>>>>> +
> > >>>>>>> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
> > >>>>>>> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
> > >>>>>>> +syscalls getrandom and memfd_create").
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
> > >>>>>>> +---
> > >>>>>>> + src/shared/missing.h | 10 ++++++++++
> > >>>>>>> + 1 file changed, 10 insertions(+)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/shared/missing.h b/src/shared/missing.h
> > >>>>>>> +index b33a70c..e72631e 100644
> > >>>>>>> +--- a/src/shared/missing.h
> > >>>>>>> ++++ b/src/shared/missing.h
> > >>>>>>> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
> > >>>>>>> + #    define __NR_getrandom 349
> > >>>>>>> + #  elif defined(__powerpc__)
> > >>>>>>> + #    define __NR_getrandom 359
> > >>>>>>> ++#  elif defined _MIPS_SIM
> > >>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
> > >>>>>>> ++#      define __NR_getrandom 4353
> > >>>>>>> ++#    endif
> > >>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
> > >>>>>>> ++#      define __NR_getrandom 6317
> > >>>>>>> ++#    endif
> > >>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
> > >>>>>>> ++#      define __NR_getrandom 5313
> > >>>>>>> ++#    endif
> > >>>>>>> + #  else
> > >>>>>>> + #    warning "__NR_getrandom unknown for your architecture"
> > >>>>>>> + #    define __NR_getrandom 0xffffffff
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..1b842a2
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> > >>>>>>> @@ -0,0 +1,33 @@
> > >>>>>>> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Lennart Poettering <lennart@poettering.net>
> > >>>>>>> +Date: Wed, 25 Feb 2015 22:05:14 +0100
> > >>>>>>> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
> > >>>>>>> + units in --user mode
> > >>>>>>> +
> > >>>>>>> +When running in user mode unmounting of mount units when a device
> > >>>>>>> +vanishes is unlikely to work, and even if it would work is already done
> > >>>>>>> +by PID 1 anyway. HEnce, when creating implicit dependencies between
> > >>>>>>> +mount units and their backing devices, created a Wants= type dependency
> > >>>>>>> +in --user mode, but leave a BindsTo= dependency in --system mode.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
> > >>>>>>> +---
> > >>>>>>> + src/core/unit.c | 2 +-
> > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> > >>>>>>> +index ee8e607..9f1e55e 100644
> > >>>>>>> +--- a/src/core/unit.c
> > >>>>>>> ++++ b/src/core/unit.c
> > >>>>>>> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> > >>>>>>> +         if (r < 0)
> > >>>>>>> +                 return r;
> > >>>>>>> +
> > >>>>>>> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
> > >>>>>>> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
> > >>>>>>> +         if (r < 0)
> > >>>>>>> +                 return r;
> > >>>>>>> +
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..92c4b8f
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> > >>>>>>> @@ -0,0 +1,43 @@
> > >>>>>>> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Colin Walters <walters@verbum.org>
> > >>>>>>> +Date: Tue, 17 Feb 2015 13:47:34 -0500
> > >>>>>>> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
> > >>>>>>> + caused it
> > >>>>>>> +
> > >>>>>>> +I'm trying to track down a relatively recent change in systemd
> > >>>>>>> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
> > >>>>>>> +
> > >>>>>>> +Systemd started to stop sysroot.mount, and this patch should help
> > >>>>>>> +me debug why at least.
> > >>>>>>> +
> > >>>>>>> +While we're here, "break" on the first unit we find that will
> > >>>>>>> +deactivate, as there's no point in further iteration.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
> > >>>>>>> +---
> > >>>>>>> + src/core/unit.c | 4 +++-
> > >>>>>>> + 1 file changed, 3 insertions(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> > >>>>>>> +index 9f1e55e..563f6fe 100644
> > >>>>>>> +--- a/src/core/unit.c
> > >>>>>>> ++++ b/src/core/unit.c
> > >>>>>>> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
> > >>>>>>> +                         continue;
> > >>>>>>> +
> > >>>>>>> +                 stop = true;
> > >>>>>>> ++                break;
> > >>>>>>> +         }
> > >>>>>>> +
> > >>>>>>> +         if (!stop)
> > >>>>>>> +                 return;
> > >>>>>>> +
> > >>>>>>> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
> > >>>>>>> ++        assert(other);
> > >>>>>>> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
> > >>>>>>> +
> > >>>>>>> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
> > >>>>>>> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..46c25bd
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> > >>>>>>> @@ -0,0 +1,30 @@
> > >>>>>>> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>>>>> +Date: Thu, 26 Feb 2015 19:00:11 -0500
> > >>>>>>> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
> > >>>>>>> + debug
> > >>>>>>> +
> > >>>>>>> +Printing it at info level was tedious. We don't do that for any other
> > >>>>>>> +overrides.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
> > >>>>>>> +---
> > >>>>>>> + src/sysctl/sysctl.c | 2 +-
> > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
> > >>>>>>> +index 275a5b7..2415d84 100644
> > >>>>>>> +--- a/src/sysctl/sysctl.c
> > >>>>>>> ++++ b/src/sysctl/sysctl.c
> > >>>>>>> +@@ -176,7 +176,7 @@ found:
> > >>>>>>> +                         if (streq(value, existing))
> > >>>>>>> +                                 continue;
> > >>>>>>> +
> > >>>>>>> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
> > >>>>>>> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
> > >>>>>>> +                         free(hashmap_remove(sysctl_options, p));
> > >>>>>>> +                         free(v);
> > >>>>>>> +                 }
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..87dce1f
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> > >>>>>>> @@ -0,0 +1,39 @@
> > >>>>>>> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>>>>> +Date: Thu, 26 Feb 2015 19:05:51 -0500
> > >>>>>>> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
> > >>>>>>> +
> > >>>>>>> +Also a link to decent documentation for sysrq keys. It is surprising
> > >>>>>>> +hard to find.
> > >>>>>>> +
> > >>>>>>> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
> > >>>>>>> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
> > >>>>>>> +---
> > >>>>>>> + sysctl.d/50-default.conf | 9 ++++++++-
> > >>>>>>> + 1 file changed, 8 insertions(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
> > >>>>>>> +index f189233..def151b 100644
> > >>>>>>> +--- a/sysctl.d/50-default.conf
> > >>>>>>> ++++ b/sysctl.d/50-default.conf
> > >>>>>>> +@@ -5,9 +5,16 @@
> > >>>>>>> + #  the Free Software Foundation; either version 2.1 of the License, or
> > >>>>>>> + #  (at your option) any later version.
> > >>>>>>> +
> > >>>>>>> +-# See sysctl.d(5) and core(5) for for details.
> > >>>>>>> ++# See sysctl.d(5) and core(5) for for documentation.
> > >>>>>>> ++
> > >>>>>>> ++# To override settings in this file, create a local file in /etc
> > >>>>>>> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
> > >>>>>>> ++# there.
> > >>>>>>> +
> > >>>>>>> + # System Request functionality of the kernel (SYNC)
> > >>>>>>> ++#
> > >>>>>>> ++# Use kernel.sysrq = 1 to allow all keys.
> > >>>>>>> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
> > >>>>>>> + kernel.sysrq = 16
> > >>>>>>> +
> > >>>>>>> + # Append the PID to the core filename
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..a3ab3e4
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> > >>>>>>> @@ -0,0 +1,912 @@
> > >>>>>>> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Lennart Poettering <lennart@poettering.net>
> > >>>>>>> +Date: Fri, 27 Feb 2015 21:55:08 +0100
> > >>>>>>> +Subject: [PATCH 17/26] core: rework device state logic
> > >>>>>>> +
> > >>>>>>> +This change introduces a new state "tentative" for device units. Device
> > >>>>>>> +units are considered "plugged" when udev announced them, "dead" when
> > >>>>>>> +they are not available in the kernel, and "tentative" when they are
> > >>>>>>> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
> > >>>>>>> +announced via udev.
> > >>>>>>> +
> > >>>>>>> +This should fix a race when device nodes (like loop devices) are created
> > >>>>>>> +and immediately mounted. Previously, systemd might end up seeing the
> > >>>>>>> +mount unit before the device, and would thus pull down the mount because
> > >>>>>>> +its BindTo dependency on the device would not be fulfilled.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
> > >>>>>>> +---
> > >>>>>>> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
> > >>>>>>> + src/core/device.h |  14 ++-
> > >>>>>>> + src/core/mount.c  |  46 ++++---
> > >>>>>>> + src/core/swap.c   |  32 +++--
> > >>>>>>> + src/core/swap.h   |   4 +-
> > >>>>>>> + src/core/unit.c   |   1 -
> > >>>>>>> + 6 files changed, 285 insertions(+), 180 deletions(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/core/device.c b/src/core/device.c
> > >>>>>>> +index d3deac3..75b9a46 100644
> > >>>>>>> +--- a/src/core/device.c
> > >>>>>>> ++++ b/src/core/device.c
> > >>>>>>> +@@ -36,7 +36,8 @@
> > >>>>>>> +
> > >>>>>>> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
> > >>>>>>> +         [DEVICE_DEAD] = UNIT_INACTIVE,
> > >>>>>>> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
> > >>>>>>> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
> > >>>>>>> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
> > >>>>>>> + };
> > >>>>>>> +
> > >>>>>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
> > >>>>>>> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
> > >>>>>>> +         d->sysfs = NULL;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> ++static int device_set_sysfs(Device *d, const char *sysfs) {
> > >>>>>>> ++        Device *first;
> > >>>>>>> ++        char *copy;
> > >>>>>>> ++        int r;
> > >>>>>>> ++
> > >>>>>>> ++        assert(d);
> > >>>>>>> ++
> > >>>>>>> ++        if (streq_ptr(d->sysfs, sysfs))
> > >>>>>>> ++                return 0;
> > >>>>>>> ++
> > >>>>>>> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
> > >>>>>>> ++        if (r < 0)
> > >>>>>>> ++                return r;
> > >>>>>>> ++
> > >>>>>>> ++        copy = strdup(sysfs);
> > >>>>>>> ++        if (!copy)
> > >>>>>>> ++                return -ENOMEM;
> > >>>>>>> ++
> > >>>>>>> ++        device_unset_sysfs(d);
> > >>>>>>> ++
> > >>>>>>> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
> > >>>>>>> ++        LIST_PREPEND(same_sysfs, first, d);
> > >>>>>>> ++
> > >>>>>>> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
> > >>>>>>> ++        if (r < 0) {
> > >>>>>>> ++                LIST_REMOVE(same_sysfs, first, d);
> > >>>>>>> ++                free(copy);
> > >>>>>>> ++                return r;
> > >>>>>>> ++        }
> > >>>>>>> ++
> > >>>>>>> ++        d->sysfs = copy;
> > >>>>>>> ++
> > >>>>>>> ++        return 0;
> > >>>>>>> ++}
> > >>>>>>> ++
> > >>>>>>> + static void device_init(Unit *u) {
> > >>>>>>> +         Device *d = DEVICE(u);
> > >>>>>>> +
> > >>>>>>> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
> > >>>>>>> +         assert(d);
> > >>>>>>> +         assert(d->state == DEVICE_DEAD);
> > >>>>>>> +
> > >>>>>>> +-        if (d->sysfs)
> > >>>>>>> ++        if (d->found & DEVICE_FOUND_UDEV)
> > >>>>>>> ++                /* If udev says the device is around, it's around */
> > >>>>>>> +                 device_set_state(d, DEVICE_PLUGGED);
> > >>>>>>> ++        else if (d->found != DEVICE_NOT_FOUND)
> > >>>>>>> ++                /* If a device is found in /proc/self/mountinfo or
> > >>>>>>> ++                 * /proc/swaps, it's "tentatively" around. */
> > >>>>>>> ++                device_set_state(d, DEVICE_TENTATIVE);
> > >>>>>>> +
> > >>>>>>> +         return 0;
> > >>>>>>> + }
> > >>>>>>> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
> > >>>>>>> +         return device_state_to_string(DEVICE(u)->state);
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-static int device_add_escaped_name(Unit *u, const char *dn) {
> > >>>>>>> +-        _cleanup_free_ char *e = NULL;
> > >>>>>>> +-        int r;
> > >>>>>>> +-
> > >>>>>>> +-        assert(u);
> > >>>>>>> +-        assert(dn);
> > >>>>>>> +-        assert(dn[0] == '/');
> > >>>>>>> +-
> > >>>>>>> +-        e = unit_name_from_path(dn, ".device");
> > >>>>>>> +-        if (!e)
> > >>>>>>> +-                return -ENOMEM;
> > >>>>>>> +-
> > >>>>>>> +-        r = unit_add_name(u, e);
> > >>>>>>> +-        if (r < 0 && r != -EEXIST)
> > >>>>>>> +-                return r;
> > >>>>>>> +-
> > >>>>>>> +-        return 0;
> > >>>>>>> +-}
> > >>>>>>> +-
> > >>>>>>> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
> > >>>>>>> +-        _cleanup_free_ char *e = NULL;
> > >>>>>>> +-        Unit *u;
> > >>>>>>> +-
> > >>>>>>> +-        assert(m);
> > >>>>>>> +-        assert(dn);
> > >>>>>>> +-        assert(dn[0] == '/');
> > >>>>>>> +-        assert(_u);
> > >>>>>>> +-
> > >>>>>>> +-        e = unit_name_from_path(dn, ".device");
> > >>>>>>> +-        if (!e)
> > >>>>>>> +-                return -ENOMEM;
> > >>>>>>> +-
> > >>>>>>> +-        u = manager_get_unit(m, e);
> > >>>>>>> +-        if (u) {
> > >>>>>>> +-                *_u = u;
> > >>>>>>> +-                return 1;
> > >>>>>>> +-        }
> > >>>>>>> +-
> > >>>>>>> +-        return 0;
> > >>>>>>> +-}
> > >>>>>>> +-
> > >>>>>>> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
> > >>>>>>> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
> > >>>>>>> +         const char *model;
> > >>>>>>> ++        int r;
> > >>>>>>> +
> > >>>>>>> +         assert(u);
> > >>>>>>> +         assert(dev);
> > >>>>>>> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
> > >>>>>>> +
> > >>>>>>> +                         j = strjoin(model, " ", label, NULL);
> > >>>>>>> +                         if (j)
> > >>>>>>> +-                                return unit_set_description(u, j);
> > >>>>>>> +-                }
> > >>>>>>> ++                                r = unit_set_description(u, j);
> > >>>>>>> ++                } else
> > >>>>>>> ++                        r = unit_set_description(u, model);
> > >>>>>>> ++        } else
> > >>>>>>> ++                r = unit_set_description(u, path);
> > >>>>>>> +
> > >>>>>>> +-                return unit_set_description(u, model);
> > >>>>>>> +-        }
> > >>>>>>> ++        if (r < 0)
> > >>>>>>> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
> > >>>>>>> +
> > >>>>>>> +-        return unit_set_description(u, path);
> > >>>>>>> ++        return r;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> > >>>>>>> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> > >>>>>>> +
> > >>>>>>> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
> > >>>>>>> +                 if (!n)
> > >>>>>>> +-                        return -ENOMEM;
> > >>>>>>> ++                        return log_oom();
> > >>>>>>> +
> > >>>>>>> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
> > >>>>>>> +                 if (r < 0)
> > >>>>>>> +-                        return r;
> > >>>>>>> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
> > >>>>>>> +         }
> > >>>>>>> +         if (!isempty(state))
> > >>>>>>> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
> > >>>>>>> +-                                 property, strna(udev_device_get_syspath(dev)));
> > >>>>>>> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
> > >>>>>>> +
> > >>>>>>> +         return 0;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> > >>>>>>> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> > >>>>>>> ++        _cleanup_free_ char *e = NULL;
> > >>>>>>> +         const char *sysfs;
> > >>>>>>> +         Unit *u = NULL;
> > >>>>>>> +         bool delete;
> > >>>>>>> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > >>>>>>> +         if (!sysfs)
> > >>>>>>> +                 return 0;
> > >>>>>>> +
> > >>>>>>> +-        r = device_find_escape_name(m, path, &u);
> > >>>>>>> +-        if (r < 0)
> > >>>>>>> +-                return r;
> > >>>>>>> ++        e = unit_name_from_path(path, ".device");
> > >>>>>>> ++        if (!e)
> > >>>>>>> ++                return log_oom();
> > >>>>>>> ++
> > >>>>>>> ++        u = manager_get_unit(m, e);
> > >>>>>>> +
> > >>>>>>> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
> > >>>>>>> ++        if (u &&
> > >>>>>>> ++            DEVICE(u)->sysfs &&
> > >>>>>>> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
> > >>>>>>> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
> > >>>>>>> +                 return -EEXIST;
> > >>>>>>> ++        }
> > >>>>>>> +
> > >>>>>>> +         if (!u) {
> > >>>>>>> +                 delete = true;
> > >>>>>>> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > >>>>>>> +                 if (!u)
> > >>>>>>> +                         return log_oom();
> > >>>>>>> +
> > >>>>>>> +-                r = device_add_escaped_name(u, path);
> > >>>>>>> ++                r = unit_add_name(u, e);
> > >>>>>>> +                 if (r < 0)
> > >>>>>>> +                         goto fail;
> > >>>>>>> +
> > >>>>>>> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > >>>>>>> +          * actually been seen yet ->sysfs will not be
> > >>>>>>> +          * initialized. Hence initialize it if necessary. */
> > >>>>>>> +
> > >>>>>>> +-        if (!DEVICE(u)->sysfs) {
> > >>>>>>> +-                Device *first;
> > >>>>>>> +-
> > >>>>>>> +-                DEVICE(u)->sysfs = strdup(sysfs);
> > >>>>>>> +-                if (!DEVICE(u)->sysfs) {
> > >>>>>>> +-                        r = -ENOMEM;
> > >>>>>>> +-                        goto fail;
> > >>>>>>> +-                }
> > >>>>>>> +-
> > >>>>>>> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
> > >>>>>>> +-                if (r < 0)
> > >>>>>>> +-                        goto fail;
> > >>>>>>> +-
> > >>>>>>> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
> > >>>>>>> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
> > >>>>>>> +-
> > >>>>>>> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
> > >>>>>>> +-                if (r < 0)
> > >>>>>>> +-                        goto fail;
> > >>>>>>> +-        }
> > >>>>>>> +-
> > >>>>>>> +-        device_make_description(u, dev, path);
> > >>>>>>> ++        r = device_set_sysfs(DEVICE(u), sysfs);
> > >>>>>>> ++        if (r < 0)
> > >>>>>>> ++                goto fail;
> > >>>>>>> +
> > >>>>>>> +-        if (main) {
> > >>>>>>> +-                /* The additional systemd udev properties we only
> > >>>>>>> +-                 * interpret for the main object */
> > >>>>>>> ++        (void) device_update_description(u, dev, path);
> > >>>>>>> +
> > >>>>>>> +-                r = device_add_udev_wants(u, dev);
> > >>>>>>> +-                if (r < 0)
> > >>>>>>> +-                        goto fail;
> > >>>>>>> +-        }
> > >>>>>>> ++        /* The additional systemd udev properties we only interpret
> > >>>>>>> ++         * for the main object */
> > >>>>>>> ++        if (main)
> > >>>>>>> ++                (void) device_add_udev_wants(u, dev);
> > >>>>>>> +
> > >>>>>>> +         /* Note that this won't dispatch the load queue, the caller
> > >>>>>>> +          * has to do that if needed and appropriate */
> > >>>>>>> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > >>>>>>> +         return 0;
> > >>>>>>> +
> > >>>>>>> + fail:
> > >>>>>>> +-        log_warning_errno(r, "Failed to load device unit: %m");
> > >>>>>>> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
> > >>>>>>> +
> > >>>>>>> +         if (delete && u)
> > >>>>>>> +                 unit_free(u);
> > >>>>>>> +@@ -342,7 +331,7 @@ fail:
> > >>>>>>> +         return r;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>>>>> ++static int device_process_new(Manager *m, struct udev_device *dev) {
> > >>>>>>> +         const char *sysfs, *dn, *alias;
> > >>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> > >>>>>>> +         int r;
> > >>>>>>> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>>>>> +                 return 0;
> > >>>>>>> +
> > >>>>>>> +         /* Add the main unit named after the sysfs path */
> > >>>>>>> +-        r = device_update_unit(m, dev, sysfs, true);
> > >>>>>>> ++        r = device_setup_unit(m, dev, sysfs, true);
> > >>>>>>> +         if (r < 0)
> > >>>>>>> +                 return r;
> > >>>>>>> +
> > >>>>>>> +         /* Add an additional unit for the device node */
> > >>>>>>> +         dn = udev_device_get_devnode(dev);
> > >>>>>>> +         if (dn)
> > >>>>>>> +-                device_update_unit(m, dev, dn, false);
> > >>>>>>> ++                (void) device_setup_unit(m, dev, dn, false);
> > >>>>>>> +
> > >>>>>>> +         /* Add additional units for all symlinks */
> > >>>>>>> +         first = udev_device_get_devlinks_list_entry(dev);
> > >>>>>>> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>>>>> +                             st.st_rdev != udev_device_get_devnum(dev))
> > >>>>>>> +                                 continue;
> > >>>>>>> +
> > >>>>>>> +-                device_update_unit(m, dev, p, false);
> > >>>>>>> ++                (void) device_setup_unit(m, dev, p, false);
> > >>>>>>> +         }
> > >>>>>>> +
> > >>>>>>> +         /* Add additional units for all explicitly configured
> > >>>>>>> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>>>>> +                         e[l] = 0;
> > >>>>>>> +
> > >>>>>>> +                         if (path_is_absolute(e))
> > >>>>>>> +-                                device_update_unit(m, dev, e, false);
> > >>>>>>> ++                                (void) device_setup_unit(m, dev, e, false);
> > >>>>>>> +                         else
> > >>>>>>> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
> > >>>>>>> +                 }
> > >>>>>>> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>>>>> +         return 0;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
> > >>>>>>> +-        const char *sysfs;
> > >>>>>>> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
> > >>>>>>> ++        DeviceFound n;
> > >>>>>>> ++
> > >>>>>>> ++        assert(d);
> > >>>>>>> ++
> > >>>>>>> ++        n = add ? (d->found | found) : (d->found & ~found);
> > >>>>>>> ++        if (n == d->found)
> > >>>>>>> ++                return;
> > >>>>>>> ++
> > >>>>>>> ++        d->found = n;
> > >>>>>>> ++
> > >>>>>>> ++        if (now) {
> > >>>>>>> ++                if (d->found & DEVICE_FOUND_UDEV)
> > >>>>>>> ++                        device_set_state(d, DEVICE_PLUGGED);
> > >>>>>>> ++                else if (d->found != DEVICE_NOT_FOUND)
> > >>>>>>> ++                        device_set_state(d, DEVICE_TENTATIVE);
> > >>>>>>> ++                else
> > >>>>>>> ++                        device_set_state(d, DEVICE_DEAD);
> > >>>>>>> ++        }
> > >>>>>>> ++}
> > >>>>>>> ++
> > >>>>>>> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
> > >>>>>>> +         Device *d, *l;
> > >>>>>>> +
> > >>>>>>> +         assert(m);
> > >>>>>>> +-        assert(dev);
> > >>>>>>> ++        assert(sysfs);
> > >>>>>>> +
> > >>>>>>> +-        sysfs = udev_device_get_syspath(dev);
> > >>>>>>> +-        if (!sysfs)
> > >>>>>>> +-                return;
> > >>>>>>> ++        if (found == DEVICE_NOT_FOUND)
> > >>>>>>> ++                return 0;
> > >>>>>>> +
> > >>>>>>> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
> > >>>>>>> +         LIST_FOREACH(same_sysfs, d, l)
> > >>>>>>> +-                device_set_state(d, DEVICE_PLUGGED);
> > >>>>>>> ++                device_update_found_one(d, add, found, now);
> > >>>>>>> ++
> > >>>>>>> ++        return 0;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
> > >>>>>>> +-        const char *sysfs;
> > >>>>>>> +-        Device *d;
> > >>>>>>> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
> > >>>>>>> ++        _cleanup_free_ char *e = NULL;
> > >>>>>>> ++        Unit *u;
> > >>>>>>> +
> > >>>>>>> +         assert(m);
> > >>>>>>> +-        assert(dev);
> > >>>>>>> ++        assert(path);
> > >>>>>>> +
> > >>>>>>> +-        sysfs = udev_device_get_syspath(dev);
> > >>>>>>> +-        if (!sysfs)
> > >>>>>>> +-                return -ENOMEM;
> > >>>>>>> ++        if (found == DEVICE_NOT_FOUND)
> > >>>>>>> ++                return 0;
> > >>>>>>> +
> > >>>>>>> +-        /* Remove all units of this sysfs path */
> > >>>>>>> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
> > >>>>>>> +-                device_unset_sysfs(d);
> > >>>>>>> +-                device_set_state(d, DEVICE_DEAD);
> > >>>>>>> +-        }
> > >>>>>>> ++        e = unit_name_from_path(path, ".device");
> > >>>>>>> ++        if (!e)
> > >>>>>>> ++                return log_oom();
> > >>>>>>> +
> > >>>>>>> ++        u = manager_get_unit(m, e);
> > >>>>>>> ++        if (!u)
> > >>>>>>> ++                return 0;
> > >>>>>>> ++
> > >>>>>>> ++        device_update_found_one(DEVICE(u), add, found, now);
> > >>>>>>> +         return 0;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
> > >>>>>>> +         return parse_boolean(ready) != 0;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-static int device_process_new_path(Manager *m, const char *path) {
> > >>>>>>> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > >>>>>>> +-
> > >>>>>>> +-        assert(m);
> > >>>>>>> +-        assert(path);
> > >>>>>>> +-
> > >>>>>>> +-        dev = udev_device_new_from_syspath(m->udev, path);
> > >>>>>>> +-        if (!dev)
> > >>>>>>> +-                return log_oom();
> > >>>>>>> +-
> > >>>>>>> +-        if (!device_is_ready(dev))
> > >>>>>>> +-                return 0;
> > >>>>>>> +-
> > >>>>>>> +-        return device_process_new_device(m, dev);
> > >>>>>>> +-}
> > >>>>>>> +-
> > >>>>>>> + static Unit *device_following(Unit *u) {
> > >>>>>>> +         Device *d = DEVICE(u);
> > >>>>>>> +         Device *other, *first = NULL;
> > >>>>>>> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
> > >>>>>>> +                 goto fail;
> > >>>>>>> +
> > >>>>>>> +         first = udev_enumerate_get_list_entry(e);
> > >>>>>>> +-        udev_list_entry_foreach(item, first)
> > >>>>>>> +-                device_process_new_path(m, udev_list_entry_get_name(item));
> > >>>>>>> ++        udev_list_entry_foreach(item, first) {
> > >>>>>>> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > >>>>>>> ++                const char *sysfs;
> > >>>>>>> ++
> > >>>>>>> ++                sysfs = udev_list_entry_get_name(item);
> > >>>>>>> ++
> > >>>>>>> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
> > >>>>>>> ++                if (!dev) {
> > >>>>>>> ++                        log_oom();
> > >>>>>>> ++                        continue;
> > >>>>>>> ++                }
> > >>>>>>> ++
> > >>>>>>> ++                if (!device_is_ready(dev))
> > >>>>>>> ++                        continue;
> > >>>>>>> ++
> > >>>>>>> ++                (void) device_process_new(m, dev);
> > >>>>>>> ++
> > >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
> > >>>>>>> ++        }
> > >>>>>>> +
> > >>>>>>> +         return 0;
> > >>>>>>> +
> > >>>>>>> + fail:
> > >>>>>>> ++        log_error_errno(r, "Failed to enumerate devices: %m");
> > >>>>>>> ++
> > >>>>>>> +         device_shutdown(m);
> > >>>>>>> +         return r;
> > >>>>>>> + }
> > >>>>>>> +@@ -619,7 +634,7 @@ fail:
> > >>>>>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
> > >>>>>>> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > >>>>>>> +         Manager *m = userdata;
> > >>>>>>> +-        const char *action;
> > >>>>>>> ++        const char *action, *sysfs;
> > >>>>>>> +         int r;
> > >>>>>>> +
> > >>>>>>> +         assert(m);
> > >>>>>>> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> > >>>>>>> +         if (!dev)
> > >>>>>>> +                 return 0;
> > >>>>>>> +
> > >>>>>>> ++        sysfs = udev_device_get_syspath(dev);
> > >>>>>>> ++        if (!sysfs) {
> > >>>>>>> ++                log_error("Failed to get udev sys path.");
> > >>>>>>> ++                return 0;
> > >>>>>>> ++        }
> > >>>>>>> ++
> > >>>>>>> +         action = udev_device_get_action(dev);
> > >>>>>>> +         if (!action) {
> > >>>>>>> +                 log_error("Failed to get udev action string.");
> > >>>>>>> +                 return 0;
> > >>>>>>> +         }
> > >>>>>>> +
> > >>>>>>> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
> > >>>>>>> +-                r = device_process_removed_device(m, dev);
> > >>>>>>> +-                if (r < 0)
> > >>>>>>> +-                        log_error_errno(r, "Failed to process device remove event: %m");
> > >>>>>>> +-
> > >>>>>>> +-                r = swap_process_removed_device(m, dev);
> > >>>>>>> ++        if (streq(action, "remove"))  {
> > >>>>>>> ++                r = swap_process_device_remove(m, dev);
> > >>>>>>> +                 if (r < 0)
> > >>>>>>> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
> > >>>>>>> +
> > >>>>>>> +-        } else {
> > >>>>>>> +-                r = device_process_new_device(m, dev);
> > >>>>>>> +-                if (r < 0)
> > >>>>>>> +-                        log_error_errno(r, "Failed to process device new event: %m");
> > >>>>>>> ++                /* If we get notified that a device was removed by
> > >>>>>>> ++                 * udev, then it's completely gone, hence unset all
> > >>>>>>> ++                 * found bits */
> > >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
> > >>>>>>> +
> > >>>>>>> +-                r = swap_process_new_device(m, dev);
> > >>>>>>> ++        } else if (device_is_ready(dev)) {
> > >>>>>>> ++
> > >>>>>>> ++                (void) device_process_new(m, dev);
> > >>>>>>> ++
> > >>>>>>> ++                r = swap_process_device_new(m, dev);
> > >>>>>>> +                 if (r < 0)
> > >>>>>>> +                         log_error_errno(r, "Failed to process swap device new event: %m");
> > >>>>>>> +
> > >>>>>>> +                 manager_dispatch_load_queue(m);
> > >>>>>>> +
> > >>>>>>> +-                device_set_path_plugged(m, dev);
> > >>>>>>> ++                /* The device is found now, set the udev found bit */
> > >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
> > >>>>>>> ++
> > >>>>>>> ++        } else {
> > >>>>>>> ++                /* The device is nominally around, but not ready for
> > >>>>>>> ++                 * us. Hence unset the udev bit, but leave the rest
> > >>>>>>> ++                 * around. */
> > >>>>>>> ++
> > >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
> > >>>>>>> +         }
> > >>>>>>> +
> > >>>>>>> +         return 0;
> > >>>>>>> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
> > >>>>>>> +         return read_only <= 0;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
> > >>>>>>> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > >>>>>>> ++        struct stat st;
> > >>>>>>> ++
> > >>>>>>> ++        assert(m);
> > >>>>>>> ++        assert(node);
> > >>>>>>> ++
> > >>>>>>> ++        /* This is called whenever we find a device referenced in
> > >>>>>>> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
> > >>>>>>> ++         * mounted/enabled at a time where udev has not finished
> > >>>>>>> ++         * probing it yet, and we thus haven't learned about it
> > >>>>>>> ++         * yet. In this case we will set the device unit to
> > >>>>>>> ++         * "tentative" state. */
> > >>>>>>> ++
> > >>>>>>> ++        if (add) {
> > >>>>>>> ++                if (!path_startswith(node, "/dev"))
> > >>>>>>> ++                        return 0;
> > >>>>>>> ++
> > >>>>>>> ++                if (stat(node, &st) < 0) {
> > >>>>>>> ++                        if (errno == ENOENT)
> > >>>>>>> ++                                return 0;
> > >>>>>>> ++
> > >>>>>>> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
> > >>>>>>> ++                }
> > >>>>>>> ++
> > >>>>>>> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
> > >>>>>>> ++                        return 0;
> > >>>>>>> ++
> > >>>>>>> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
> > >>>>>>> ++                if (!dev) {
> > >>>>>>> ++                        if (errno == ENOENT)
> > >>>>>>> ++                                return 0;
> > >>>>>>> ++
> > >>>>>>> ++                        return log_oom();
> > >>>>>>> ++                }
> > >>>>>>> ++
> > >>>>>>> ++                /* If the device is known in the kernel and newly
> > >>>>>>> ++                 * appeared, then we'll create a device unit for it,
> > >>>>>>> ++                 * under the name referenced in /proc/swaps or
> > >>>>>>> ++                 * /proc/self/mountinfo. */
> > >>>>>>> ++
> > >>>>>>> ++                (void) device_setup_unit(m, dev, node, false);
> > >>>>>>> ++        }
> > >>>>>>> ++
> > >>>>>>> ++        /* Update the device unit's state, should it exist */
> > >>>>>>> ++        return device_update_found_by_name(m, node, add, found, now);
> > >>>>>>> ++}
> > >>>>>>> ++
> > >>>>>>> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
> > >>>>>>> +         [DEVICE_DEAD] = "dead",
> > >>>>>>> +-        [DEVICE_PLUGGED] = "plugged"
> > >>>>>>> ++        [DEVICE_TENTATIVE] = "tentative",
> > >>>>>>> ++        [DEVICE_PLUGGED] = "plugged",
> > >>>>>>> + };
> > >>>>>>> +
> > >>>>>>> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
> > >>>>>>> +diff --git a/src/core/device.h b/src/core/device.h
> > >>>>>>> +index bb7ae07..0609b20 100644
> > >>>>>>> +--- a/src/core/device.h
> > >>>>>>> ++++ b/src/core/device.h
> > >>>>>>> +@@ -29,20 +29,28 @@ typedef struct Device Device;
> > >>>>>>> +  * simplifies the state engine greatly */
> > >>>>>>> + typedef enum DeviceState {
> > >>>>>>> +         DEVICE_DEAD,
> > >>>>>>> +-        DEVICE_PLUGGED,
> > >>>>>>> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
> > >>>>>>> ++        DEVICE_PLUGGED,   /* announced by udev */
> > >>>>>>> +         _DEVICE_STATE_MAX,
> > >>>>>>> +         _DEVICE_STATE_INVALID = -1
> > >>>>>>> + } DeviceState;
> > >>>>>>> +
> > >>>>>>> ++typedef enum DeviceFound {
> > >>>>>>> ++        DEVICE_NOT_FOUND = 0,
> > >>>>>>> ++        DEVICE_FOUND_UDEV = 1,
> > >>>>>>> ++        DEVICE_FOUND_MOUNT = 2,
> > >>>>>>> ++        DEVICE_FOUND_SWAP = 4,
> > >>>>>>> ++} DeviceFound;
> > >>>>>>> ++
> > >>>>>>> + struct Device {
> > >>>>>>> +         Unit meta;
> > >>>>>>> +
> > >>>>>>> +         char *sysfs;
> > >>>>>>> ++        DeviceFound found;
> > >>>>>>> +
> > >>>>>>> +         /* In order to be able to distinguish dependencies on
> > >>>>>>> +         different device nodes we might end up creating multiple
> > >>>>>>> +         devices for the same sysfs path. We chain them up here. */
> > >>>>>>> +-
> > >>>>>>> +         LIST_FIELDS(struct Device, same_sysfs);
> > >>>>>>> +
> > >>>>>>> +         DeviceState state;
> > >>>>>>> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
> > >>>>>>> +
> > >>>>>>> + const char* device_state_to_string(DeviceState i) _const_;
> > >>>>>>> + DeviceState device_state_from_string(const char *s) _pure_;
> > >>>>>>> ++
> > >>>>>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
> > >>>>>>> +diff --git a/src/core/mount.c b/src/core/mount.c
> > >>>>>>> +index f3977e6..c971330 100644
> > >>>>>>> +--- a/src/core/mount.c
> > >>>>>>> ++++ b/src/core/mount.c
> > >>>>>>> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
> > >>>>>>> +         return 0;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-static int mount_add_one(
> > >>>>>>> ++static int mount_setup_unit(
> > >>>>>>> +                 Manager *m,
> > >>>>>>> +                 const char *what,
> > >>>>>>> +                 const char *where,
> > >>>>>>> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
> > >>>>>>> +
> > >>>>>>> +                 u = unit_new(m, sizeof(Mount));
> > >>>>>>> +                 if (!u)
> > >>>>>>> +-                        return -ENOMEM;
> > >>>>>>> ++                        return log_oom();
> > >>>>>>> +
> > >>>>>>> +                 r = unit_add_name(u, e);
> > >>>>>>> +                 if (r < 0)
> > >>>>>>> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
> > >>>>>>> +         return 0;
> > >>>>>>> +
> > >>>>>>> + fail:
> > >>>>>>> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
> > >>>>>>> ++
> > >>>>>>> +         if (delete && u)
> > >>>>>>> +                 unit_free(u);
> > >>>>>>> +
> > >>>>>>> +@@ -1554,33 +1556,36 @@ fail:
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> > >>>>>>> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
> > >>>>>>> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
> > >>>>>>> +-        struct libmnt_fs *fs;
> > >>>>>>> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
> > >>>>>>> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
> > >>>>>>> +         int r = 0;
> > >>>>>>> +
> > >>>>>>> +         assert(m);
> > >>>>>>> +
> > >>>>>>> +-        tb = mnt_new_table();
> > >>>>>>> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
> > >>>>>>> +-        if (!tb || !itr)
> > >>>>>>> ++        t = mnt_new_table();
> > >>>>>>> ++        if (!t)
> > >>>>>>> +                 return log_oom();
> > >>>>>>> +
> > >>>>>>> +-        r = mnt_table_parse_mtab(tb, NULL);
> > >>>>>>> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
> > >>>>>>> ++        if (!i)
> > >>>>>>> ++                return log_oom();
> > >>>>>>> ++
> > >>>>>>> ++        r = mnt_table_parse_mtab(t, NULL);
> > >>>>>>> +         if (r < 0)
> > >>>>>>> +-                return r;
> > >>>>>>> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
> > >>>>>>> +
> > >>>>>>> +         r = 0;
> > >>>>>>> +         for (;;) {
> > >>>>>>> +                 const char *device, *path, *options, *fstype;
> > >>>>>>> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
> > >>>>>>> ++                struct libmnt_fs *fs;
> > >>>>>>> +                 int k;
> > >>>>>>> +
> > >>>>>>> +-                k = mnt_table_next_fs(tb, itr, &fs);
> > >>>>>>> ++                k = mnt_table_next_fs(t, i, &fs);
> > >>>>>>> +                 if (k == 1)
> > >>>>>>> +                         break;
> > >>>>>>> +-                else if (k < 0)
> > >>>>>>> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
> > >>>>>>> ++                if (k < 0)
> > >>>>>>> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
> > >>>>>>> +
> > >>>>>>> +                 device = mnt_fs_get_source(fs);
> > >>>>>>> +                 path = mnt_fs_get_target(fs);
> > >>>>>>> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> > >>>>>>> +                 fstype = mnt_fs_get_fstype(fs);
> > >>>>>>> +
> > >>>>>>> +                 d = cunescape(device);
> > >>>>>>> ++                if (!d)
> > >>>>>>> ++                        return log_oom();
> > >>>>>>> ++
> > >>>>>>> +                 p = cunescape(path);
> > >>>>>>> +-                if (!d || !p)
> > >>>>>>> ++                if (!p)
> > >>>>>>> +                         return log_oom();
> > >>>>>>> +
> > >>>>>>> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
> > >>>>>>> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
> > >>>>>>> ++
> > >>>>>>> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
> > >>>>>>> +                 if (r == 0 && k < 0)
> > >>>>>>> +                         r = k;
> > >>>>>>> +         }
> > >>>>>>> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> > >>>>>>> +
> > >>>>>>> +         r = mount_load_proc_self_mountinfo(m, true);
> > >>>>>>> +         if (r < 0) {
> > >>>>>>> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
> > >>>>>>> +-
> > >>>>>>> +                 /* Reset flags, just in case, for later calls */
> > >>>>>>> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
> > >>>>>>> +                         Mount *mount = MOUNT(u);
> > >>>>>>> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> > >>>>>>> +                                 break;
> > >>>>>>> +                         }
> > >>>>>>> +
> > >>>>>>> ++                        if (mount->parameters_proc_self_mountinfo.what)
> > >>>>>>> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
> > >>>>>>> ++
> > >>>>>>> ++
> > >>>>>>> +                 } else if (mount->just_mounted || mount->just_changed) {
> > >>>>>>> +
> > >>>>>>> +                         /* New or changed mount entry */
> > >>>>>>> +diff --git a/src/core/swap.c b/src/core/swap.c
> > >>>>>>> +index 6997921..5c19af5 100644
> > >>>>>>> +--- a/src/core/swap.c
> > >>>>>>> ++++ b/src/core/swap.c
> > >>>>>>> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
> > >>>>>>> +         return swap_verify(s);
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-static int swap_add_one(
> > >>>>>>> ++static int swap_setup_unit(
> > >>>>>>> +                 Manager *m,
> > >>>>>>> +                 const char *what,
> > >>>>>>> +                 const char *what_proc_swaps,
> > >>>>>>> +@@ -363,8 +363,10 @@ static int swap_add_one(
> > >>>>>>> +
> > >>>>>>> +         if (u &&
> > >>>>>>> +             SWAP(u)->from_proc_swaps &&
> > >>>>>>> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
> > >>>>>>> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
> > >>>>>>> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
> > >>>>>>> +                 return -EEXIST;
> > >>>>>>> ++        }
> > >>>>>>> +
> > >>>>>>> +         if (!u) {
> > >>>>>>> +                 delete = true;
> > >>>>>>> +@@ -379,7 +381,7 @@ static int swap_add_one(
> > >>>>>>> +
> > >>>>>>> +                 SWAP(u)->what = strdup(what);
> > >>>>>>> +                 if (!SWAP(u)->what) {
> > >>>>>>> +-                        r = log_oom();
> > >>>>>>> ++                        r = -ENOMEM;
> > >>>>>>> +                         goto fail;
> > >>>>>>> +                 }
> > >>>>>>> +
> > >>>>>>> +@@ -407,7 +409,6 @@ static int swap_add_one(
> > >>>>>>> +         p->priority = priority;
> > >>>>>>> +
> > >>>>>>> +         unit_add_to_dbus_queue(u);
> > >>>>>>> +-
> > >>>>>>> +         return 0;
> > >>>>>>> +
> > >>>>>>> + fail:
> > >>>>>>> +@@ -419,7 +420,7 @@ fail:
> > >>>>>>> +         return r;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
> > >>>>>>> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
> > >>>>>>> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
> > >>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> > >>>>>>> +         const char *dn;
> > >>>>>>> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> > >>>>>>> +
> > >>>>>>> +         assert(m);
> > >>>>>>> +
> > >>>>>>> +-        r = swap_add_one(m, device, device, prio, set_flags);
> > >>>>>>> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
> > >>>>>>> +         if (r < 0)
> > >>>>>>> +                 return r;
> > >>>>>>> +
> > >>>>>>> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> > >>>>>>> +         /* Add the main device node */
> > >>>>>>> +         dn = udev_device_get_devnode(d);
> > >>>>>>> +         if (dn && !streq(dn, device))
> > >>>>>>> +-                swap_add_one(m, dn, device, prio, set_flags);
> > >>>>>>> ++                swap_setup_unit(m, dn, device, prio, set_flags);
> > >>>>>>> +
> > >>>>>>> +         /* Add additional units for all symlinks */
> > >>>>>>> +         first = udev_device_get_devlinks_list_entry(d);
> > >>>>>>> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> > >>>>>>> +                             st.st_rdev != udev_device_get_devnum(d))
> > >>>>>>> +                                 continue;
> > >>>>>>> +
> > >>>>>>> +-                swap_add_one(m, p, device, prio, set_flags);
> > >>>>>>> ++                swap_setup_unit(m, p, device, prio, set_flags);
> > >>>>>>> +         }
> > >>>>>>> +
> > >>>>>>> +         return r;
> > >>>>>>> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
> > >>>>>>> +                         if (k == EOF)
> > >>>>>>> +                                 break;
> > >>>>>>> +
> > >>>>>>> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
> > >>>>>>> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
> > >>>>>>> +                         continue;
> > >>>>>>> +                 }
> > >>>>>>> +
> > >>>>>>> +                 d = cunescape(dev);
> > >>>>>>> +                 if (!d)
> > >>>>>>> +-                        return -ENOMEM;
> > >>>>>>> ++                        return log_oom();
> > >>>>>>> ++
> > >>>>>>> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
> > >>>>>>> +
> > >>>>>>> +-                k = swap_process_new_swap(m, d, prio, set_flags);
> > >>>>>>> ++                k = swap_process_new(m, d, prio, set_flags);
> > >>>>>>> +                 if (k < 0)
> > >>>>>>> +                         r = k;
> > >>>>>>> +         }
> > >>>>>>> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
> > >>>>>>> +                                 break;
> > >>>>>>> +                         }
> > >>>>>>> +
> > >>>>>>> ++                        if (swap->what)
> > >>>>>>> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
> > >>>>>>> ++
> > >>>>>>> +                 } else if (swap->just_activated) {
> > >>>>>>> +
> > >>>>>>> +                         /* New swap entry */
> > >>>>>>> +@@ -1298,7 +1304,7 @@ fail:
> > >>>>>>> +         return r;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>>>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
> > >>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> > >>>>>>> +         _cleanup_free_ char *e = NULL;
> > >>>>>>> +         const char *dn;
> > >>>>>>> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
> > >>>>>>> +         return r;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
> > >>>>>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
> > >>>>>>> +         const char *dn;
> > >>>>>>> +         int r = 0;
> > >>>>>>> +         Swap *s;
> > >>>>>>> +diff --git a/src/core/swap.h b/src/core/swap.h
> > >>>>>>> +index 73e64d8..914a2db 100644
> > >>>>>>> +--- a/src/core/swap.h
> > >>>>>>> ++++ b/src/core/swap.h
> > >>>>>>> +@@ -116,8 +116,8 @@ struct Swap {
> > >>>>>>> +
> > >>>>>>> + extern const UnitVTable swap_vtable;
> > >>>>>>> +
> > >>>>>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
> > >>>>>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
> > >>>>>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
> > >>>>>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
> > >>>>>>> +
> > >>>>>>> + const char* swap_state_to_string(SwapState i) _const_;
> > >>>>>>> + SwapState swap_state_from_string(const char *s) _pure_;
> > >>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> > >>>>>>> +index 563f6fe..a6558ee 100644
> > >>>>>>> +--- a/src/core/unit.c
> > >>>>>>> ++++ b/src/core/unit.c
> > >>>>>>> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> > >>>>>>> +                 return -ENOMEM;
> > >>>>>>> +
> > >>>>>>> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
> > >>>>>>> +-
> > >>>>>>> +         if (r < 0)
> > >>>>>>> +                 return r;
> > >>>>>>> +
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..d614085
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> > >>>>>>> @@ -0,0 +1,26 @@
> > >>>>>>> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> > >>>>>>> +Date: Sat, 28 Feb 2015 23:39:55 +0100
> > >>>>>>> +Subject: [PATCH 18/26] core: fix return value on OOM
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
> > >>>>>>> +---
> > >>>>>>> + src/core/device.c | 2 ++
> > >>>>>>> + 1 file changed, 2 insertions(+)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/core/device.c b/src/core/device.c
> > >>>>>>> +index 75b9a46..1cc103c 100644
> > >>>>>>> +--- a/src/core/device.c
> > >>>>>>> ++++ b/src/core/device.c
> > >>>>>>> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
> > >>>>>>> +                         j = strjoin(model, " ", label, NULL);
> > >>>>>>> +                         if (j)
> > >>>>>>> +                                 r = unit_set_description(u, j);
> > >>>>>>> ++                        else
> > >>>>>>> ++                                r = -ENOMEM;
> > >>>>>>> +                 } else
> > >>>>>>> +                         r = unit_set_description(u, model);
> > >>>>>>> +         } else
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..d94da60
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> > >>>>>>> @@ -0,0 +1,33 @@
> > >>>>>>> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
> > >>>>>>> +Date: Thu, 19 Feb 2015 20:47:28 +0100
> > >>>>>>> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
> > >>>>>>> + bus on dbus1
> > >>>>>>> +
> > >>>>>>> +This fixes "machinectl login" on systems configured with --disable-kdbus.
> > >>>>>>> +
> > >>>>>>> +The error was:
> > >>>>>>> +machinectl login foo
> > >>>>>>> +Failed to get machine PTY: Input/output error
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
> > >>>>>>> +---
> > >>>>>>> + src/machine/machine-dbus.c | 2 +-
> > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
> > >>>>>>> +index b46f0a8..b0f0f66 100644
> > >>>>>>> +--- a/src/machine/machine-dbus.c
> > >>>>>>> ++++ b/src/machine/machine-dbus.c
> > >>>>>>> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
> > >>>>>>> + #ifdef ENABLE_KDBUS
> > >>>>>>> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
> > >>>>>>> + #else
> > >>>>>>> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
> > >>>>>>> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
> > >>>>>>> + #endif
> > >>>>>>> +         if (!container_bus->address)
> > >>>>>>> +                 return -ENOMEM;
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..fcc2adf
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> > >>>>>>> @@ -0,0 +1,25 @@
> > >>>>>>> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> > >>>>>>> +Date: Fri, 20 Feb 2015 15:35:11 -0300
> > >>>>>>> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
> > >>>>>>> +---
> > >>>>>>> + src/shared/util.c | 1 +
> > >>>>>>> + 1 file changed, 1 insertion(+)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/shared/util.c b/src/shared/util.c
> > >>>>>>> +index ba035ca..f24b5b4 100644
> > >>>>>>> +--- a/src/shared/util.c
> > >>>>>>> ++++ b/src/shared/util.c
> > >>>>>>> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
> > >>>>>>> +
> > >>>>>>> + bool fstype_is_network(const char *fstype) {
> > >>>>>>> +         static const char table[] =
> > >>>>>>> ++                "afs\0"
> > >>>>>>> +                 "cifs\0"
> > >>>>>>> +                 "smbfs\0"
> > >>>>>>> +                 "sshfs\0"
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..02e279d
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> > >>>>>>> @@ -0,0 +1,31 @@
> > >>>>>>> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
> > >>>>>>> +Date: Fri, 20 Feb 2015 10:53:28 +0100
> > >>>>>>> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
> > >>>>>>> +
> > >>>>>>> +Otherwise every daemon reload prints out warnings like:
> > >>>>>>> +
> > >>>>>>> +systemd[1]: Unit type .busname is not supported on this system.
> > >>>>>>> +systemd[1]: Unit type .swap is not supported on this system.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
> > >>>>>>> +---
> > >>>>>>> + src/core/manager.c | 2 +-
> > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/core/manager.c b/src/core/manager.c
> > >>>>>>> +index 4775219..bc9b7ec 100644
> > >>>>>>> +--- a/src/core/manager.c
> > >>>>>>> ++++ b/src/core/manager.c
> > >>>>>>> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
> > >>>>>>> +                 int q;
> > >>>>>>> +
> > >>>>>>> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
> > >>>>>>> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> > >>>>>>> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> > >>>>>>> +                         continue;
> > >>>>>>> +                 }
> > >>>>>>> +
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..f5afd09
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> > >>>>>>> @@ -0,0 +1,97 @@
> > >>>>>>> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>>>>> +Date: Mon, 2 Mar 2015 10:34:51 -0500
> > >>>>>>> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
> > >>>>>>> +
> > >>>>>>> +Binary fields were not processed properly, and resulting journal files
> > >>>>>>> +were non-conforming, resulting in an error ("Invalid field.") when reading.
> > >>>>>>> +
> > >>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
> > >>>>>>> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
> > >>>>>>> +---
> > >>>>>>> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
> > >>>>>>> + src/journal-remote/journal-remote-parse.h |  4 +++-
> > >>>>>>> + 2 files changed, 21 insertions(+), 14 deletions(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
> > >>>>>>> +index d9dea8d..afded7e 100644
> > >>>>>>> +--- a/src/journal-remote/journal-remote-parse.c
> > >>>>>>> ++++ b/src/journal-remote/journal-remote-parse.c
> > >>>>>>> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
> > >>>>>>> +                    LLLLLLLL0011223344...\n
> > >>>>>>> +                 */
> > >>>>>>> +                 sep = memchr(line, '=', n);
> > >>>>>>> +-                if (sep)
> > >>>>>>> ++                if (sep) {
> > >>>>>>> +                         /* chomp newline */
> > >>>>>>> +                         n--;
> > >>>>>>> +-                else
> > >>>>>>> ++
> > >>>>>>> ++                        r = iovw_put(&source->iovw, line, n);
> > >>>>>>> ++                        if (r < 0)
> > >>>>>>> ++                                return r;
> > >>>>>>> ++                } else {
> > >>>>>>> +                         /* replace \n with = */
> > >>>>>>> +                         line[n-1] = '=';
> > >>>>>>> +-                log_trace("Received: %.*s", (int) n, line);
> > >>>>>>> +
> > >>>>>>> +-                r = iovw_put(&source->iovw, line, n);
> > >>>>>>> +-                if (r < 0) {
> > >>>>>>> +-                        log_error("Failed to put line in iovect");
> > >>>>>>> +-                        return r;
> > >>>>>>> ++                        source->field_len = n;
> > >>>>>>> ++                        source->state = STATE_DATA_START;
> > >>>>>>> ++
> > >>>>>>> ++                        /* we cannot put the field in iovec until we have all data */
> > >>>>>>> +                 }
> > >>>>>>> +
> > >>>>>>> +-                if (!sep)
> > >>>>>>> +-                        source->state = STATE_DATA_START;
> > >>>>>>> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
> > >>>>>>> ++
> > >>>>>>> +                 return 0; /* continue */
> > >>>>>>> +         }
> > >>>>>>> +
> > >>>>>>> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
> > >>>>>>> +
> > >>>>>>> +         case STATE_DATA: {
> > >>>>>>> +                 void *data;
> > >>>>>>> ++                char *field;
> > >>>>>>> +
> > >>>>>>> +                 assert(source->data_size > 0);
> > >>>>>>> +
> > >>>>>>> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
> > >>>>>>> +
> > >>>>>>> +                 assert(data);
> > >>>>>>> +
> > >>>>>>> +-                r = iovw_put(&source->iovw, data, source->data_size);
> > >>>>>>> +-                if (r < 0) {
> > >>>>>>> +-                        log_error("failed to put binary buffer in iovect");
> > >>>>>>> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
> > >>>>>>> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
> > >>>>>>> ++
> > >>>>>>> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
> > >>>>>>> ++                if (r < 0)
> > >>>>>>> +                         return r;
> > >>>>>>> +-                }
> > >>>>>>> +
> > >>>>>>> +                 source->state = STATE_DATA_FINISH;
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
> > >>>>>>> +index 8499f4e..22db550 100644
> > >>>>>>> +--- a/src/journal-remote/journal-remote-parse.h
> > >>>>>>> ++++ b/src/journal-remote/journal-remote-parse.h
> > >>>>>>> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
> > >>>>>>> +         size_t offset;     /* offset to the beginning of live data in the buffer */
> > >>>>>>> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
> > >>>>>>> +         size_t filled;     /* total number of bytes in the buffer */
> > >>>>>>> +-        size_t data_size;  /* size of the binary data chunk being processed */
> > >>>>>>> ++
> > >>>>>>> ++        size_t field_len;  /* used for binary fields: the field name length */
> > >>>>>>> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
> > >>>>>>> +
> > >>>>>>> +         struct iovec_wrapper iovw;
> > >>>>>>> +
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..79e565b
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> > >>>>>>> @@ -0,0 +1,37 @@
> > >>>>>>> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> > >>>>>>> +Date: Sun, 1 Mar 2015 21:13:10 -0300
> > >>>>>>> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
> > >>>>>>> +
> > >>>>>>> +Logs constantly show
> > >>>>>>> +
> > >>>>>>> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
> > >>>>>>> +
> > >>>>>>> +This is because ext4 does not support FS_NOCOW_FL.
> > >>>>>>> +
> > >>>>>>> +[zj: fold into one conditional as suggested on the ML and
> > >>>>>>> +     fix (preexisting) r/errno confusion in error message.]
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
> > >>>>>>> +---
> > >>>>>>> + src/journal/journal-file.c | 4 ++--
> > >>>>>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
> > >>>>>>> +index 2845e05..0f28718 100644
> > >>>>>>> +--- a/src/journal/journal-file.c
> > >>>>>>> ++++ b/src/journal/journal-file.c
> > >>>>>>> +@@ -2611,8 +2611,8 @@ int journal_file_open(
> > >>>>>>> +                  * shouldn't be too bad, given that we do our own
> > >>>>>>> +                  * checksumming). */
> > >>>>>>> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
> > >>>>>>> +-                if (r < 0)
> > >>>>>>> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
> > >>>>>>> ++                if (r < 0 && r != -ENOTTY)
> > >>>>>>> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
> > >>>>>>> +
> > >>>>>>> +                 /* Let's attach the creation time to the journal file,
> > >>>>>>> +                  * so that the vacuuming code knows the age of this
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..0cf9a0a
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> > >>>>>>> @@ -0,0 +1,53 @@
> > >>>>>>> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Lennart Poettering <lennart@poettering.net>
> > >>>>>>> +Date: Mon, 2 Mar 2015 20:55:38 +0100
> > >>>>>>> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
> > >>>>>>> + happy
> > >>>>>>> +
> > >>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
> > >>>>>>> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
> > >>>>>>> +---
> > >>>>>>> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
> > >>>>>>> + 1 file changed, 5 insertions(+), 7 deletions(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
> > >>>>>>> +index 028c2a7..22a3a53 100644
> > >>>>>>> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
> > >>>>>>> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
> > >>>>>>> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> > >>>>>>> +                 .msg_iovlen = 1,
> > >>>>>>> +                 .msg_name = &sockaddr,
> > >>>>>>> +         };
> > >>>>>>> +-        union {
> > >>>>>>> +-                struct cmsghdr cmsghdr;
> > >>>>>>> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
> > >>>>>>> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
> > >>>>>>> +-        } control;
> > >>>>>>> ++        struct cmsghdr *control;
> > >>>>>>> +         _cleanup_close_ int fd = -1;
> > >>>>>>> +         struct cmsghdr *cmsg = NULL;
> > >>>>>>> +         const char *e;
> > >>>>>>> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> > >>>>>>> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
> > >>>>>>> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
> > >>>>>>> +
> > >>>>>>> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
> > >>>>>>> ++
> > >>>>>>> +         if (n_fds > 0) {
> > >>>>>>> +-                msghdr.msg_control = &control;
> > >>>>>>> ++                msghdr.msg_control = control;
> > >>>>>>> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
> > >>>>>>> +
> > >>>>>>> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
> > >>>>>>> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> > >>>>>>> +                 try_without_ucred = true;
> > >>>>>>> +                 controllen_without_ucred = msghdr.msg_controllen;
> > >>>>>>> +
> > >>>>>>> +-                msghdr.msg_control = &control;
> > >>>>>>> ++                msghdr.msg_control = control;
> > >>>>>>> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
> > >>>>>>> +
> > >>>>>>> +                 if (cmsg)
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..6912489
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> > >>>>>>> @@ -0,0 +1,84 @@
> > >>>>>>> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
> > >>>>>>> +Date: Tue, 3 Mar 2015 00:35:08 +0100
> > >>>>>>> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
> > >>>>>>> + filesystems
> > >>>>>>> +
> > >>>>>>> +A warning is printed if ACLs cannot be retrieved for any reason other
> > >>>>>>> +than -ENOSYS. For -ENOSYS, debug log is printed.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
> > >>>>>>> +---
> > >>>>>>> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
> > >>>>>>> + 1 file changed, 20 insertions(+), 16 deletions(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> > >>>>>>> +index 88ba7e4..187997e 100644
> > >>>>>>> +--- a/src/tmpfiles/tmpfiles.c
> > >>>>>>> ++++ b/src/tmpfiles/tmpfiles.c
> > >>>>>>> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> > >>>>>>> +         int r;
> > >>>>>>> +         _cleanup_(acl_free_charpp) char *t = NULL;
> > >>>>>>> +
> > >>>>>>> ++        /* Returns 0 for success, positive error if already warned,
> > >>>>>>> ++         * negative error otherwise. */
> > >>>>>>> ++
> > >>>>>>> +         if (modify) {
> > >>>>>>> +                 r = acls_for_file(path, type, acl, &dup);
> > >>>>>>> +                 if (r < 0)
> > >>>>>>> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> > >>>>>>> +
> > >>>>>>> +         r = acl_set_file(path, type, dup);
> > >>>>>>> +         if (r < 0)
> > >>>>>>> +-                return log_error_errno(-errno,
> > >>>>>>> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
> > >>>>>>> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
> > >>>>>>> +-                                       strna(t), path);
> > >>>>>>> ++                return -log_error_errno(errno,
> > >>>>>>> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
> > >>>>>>> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
> > >>>>>>> ++                                        strna(t), path);
> > >>>>>>> ++
> > >>>>>>> +         return 0;
> > >>>>>>> + }
> > >>>>>>> + #endif
> > >>>>>>> +
> > >>>>>>> + static int path_set_acls(Item *item, const char *path) {
> > >>>>>>> ++        int r = 0;
> > >>>>>>> + #ifdef HAVE_ACL
> > >>>>>>> +-        int r;
> > >>>>>>> +-
> > >>>>>>> +         assert(item);
> > >>>>>>> +         assert(path);
> > >>>>>>> +
> > >>>>>>> +-        if (item->acl_access) {
> > >>>>>>> ++        if (item->acl_access)
> > >>>>>>> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
> > >>>>>>> +-                if (r < 0)
> > >>>>>>> +-                        return r;
> > >>>>>>> +-        }
> > >>>>>>> +
> > >>>>>>> +-        if (item->acl_default) {
> > >>>>>>> ++        if (r == 0 && item->acl_default)
> > >>>>>>> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
> > >>>>>>> +-                if (r < 0)
> > >>>>>>> +-                        return r;
> > >>>>>>> +-        }
> > >>>>>>> +-#endif
> > >>>>>>> +
> > >>>>>>> +-        return 0;
> > >>>>>>> ++        if (r > 0)
> > >>>>>>> ++                return -r; /* already warned */
> > >>>>>>> ++        else if (r == -ENOTSUP) {
> > >>>>>>> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
> > >>>>>>> ++                return 0;
> > >>>>>>> ++        } else if (r < 0)
> > >>>>>>> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
> > >>>>>>> ++#endif
> > >>>>>>> ++        return r;
> > >>>>>>> + }
> > >>>>>>> +
> > >>>>>>> + static int write_one_file(Item *i, const char *path) {
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> > >>>>>>> new file mode 100644
> > >>>>>>> index 0000000..a49a369
> > >>>>>>> --- /dev/null
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> > >>>>>>> @@ -0,0 +1,30 @@
> > >>>>>>> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
> > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > >>>>>>> +Date: Tue, 3 Mar 2015 19:07:28 -0500
> > >>>>>>> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
> > >>>>>>> + missing
> > >>>>>>> +
> > >>>>>>> +On s390 (at least) /sys/class/power_supply is not present. We should
> > >>>>>>> +treat this like if this directory was empty, and not an error.
> > >>>>>>> +
> > >>>>>>> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
> > >>>>>>> +---
> > >>>>>>> + src/shared/util.c | 2 +-
> > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>> +
> > >>>>>>> +diff --git a/src/shared/util.c b/src/shared/util.c
> > >>>>>>> +index f24b5b4..8548723 100644
> > >>>>>>> +--- a/src/shared/util.c
> > >>>>>>> ++++ b/src/shared/util.c
> > >>>>>>> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
> > >>>>>>> +
> > >>>>>>> +         d = opendir("/sys/class/power_supply");
> > >>>>>>> +         if (!d)
> > >>>>>>> +-                return -errno;
> > >>>>>>> ++                return errno == ENOENT ? true : -errno;
> > >>>>>>> +
> > >>>>>>> +         for (;;) {
> > >>>>>>> +                 struct dirent *de;
> > >>>>>>> +--
> > >>>>>>> +1.9.1
> > >>>>>>> +
> > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
> > >>>>>>> index 73b930e..9c20b11 100644
> > >>>>>>> --- a/meta/recipes-core/systemd/systemd_219.bb
> > >>>>>>> +++ b/meta/recipes-core/systemd/systemd_219.bb
> > >>>>>>> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> > >>>>>>>           file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
> > >>>>>>>           file://0010-Make-root-s-home-directory-configurable.patch \
> > >>>>>>>           file://0011-systemd-user-avoid-using-system-auth.patch \
> > >>>>>>> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> > >>>>>>> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> > >>>>>>>           file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
> > >>>>>>> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> > >>>>>>>           file://0014-Revert-rules-remove-firmware-loading-rules.patch \
> > >>>>>>>           file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
> > >>>>>>>           file://tmpfiles-pam.patch \
> > >>>>>>> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> > >>>>>>> 
> > >>>>>>> S = "${WORKDIR}/git"
> > >>>>>>> 
> > >>>>>>> +# Appending backport fixes released for version 219-stable
> > >>>>>>> +SRC_URI_append = "\
> > >>>>>>> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
> > >>>>>>> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
> > >>>>>>> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
> > >>>>>>> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
> > >>>>>>> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> > >>>>>>> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
> > >>>>>>> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
> > >>>>>>> +           file://0008-bootchart-fix-default-init-path.patch \
> > >>>>>>> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
> > >>>>>>> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
> > >>>>>>> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
> > >>>>>>> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
> > >>>>>>> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
> > >>>>>>> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
> > >>>>>>> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
> > >>>>>>> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
> > >>>>>>> +           file://0017-core-rework-device-state-logic.patch \
> > >>>>>>> +           file://0018-core-fix-return-value-on-OOM.patch \
> > >>>>>>> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
> > >>>>>>> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
> > >>>>>>> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
> > >>>>>>> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
> > >>>>>>> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> > >>>>>>> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
> > >>>>>>> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> > >>>>>>> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
> > >>>>>>> +           "
> > >>>>>>> +
> > >>>>>>> SRC_URI_append_libc-uclibc = "\
> > >>>>>>>            file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
> > >>>>>>>           "
> > >>>>>>> --
> > >>>>>>> 1.9.1
> > >>>>>>> 
> > >>>>>> 
> > >>>>>> 
> > >>>>>> --
> > >>>>>> _______________________________________________
> > >>>>>> Openembedded-core mailing list
> > >>>>>> Openembedded-core@lists.openembedded.org
> > >>>>>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
> > >>>>> 
> > >>>>> 
> > >>>>> 
> > >>>> 
> > >>>> 
> > >>> 
> > >> 
> > >> 
> > > 
> > > 
> > 
> 
> 




^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] systemd: v219 with stable fixes
  2015-04-13 21:21                 ` Bottazzini, Bruno
@ 2015-04-15 13:23                   ` Bottazzini, Bruno
  0 siblings, 0 replies; 12+ messages in thread
From: Bottazzini, Bruno @ 2015-04-15 13:23 UTC (permalink / raw)
  To: Patches and discussions about the oe-core layer

Ping

On Seg, 2015-04-13 at 18:21 -0300, Bottazzini, Bruno wrote:
> Ping
> 
> On Qui, 2015-04-09 at 09:57 -0300, Bottazzini, Bruno wrote:
> > Good! 
> > 
> > When will this patch be merged with master?
> > 
> > Thanks and best regards
> > 
> > On Ter, 2015-04-07 at 12:33 -0700, Khem Raj wrote:
> > > this looks ok
> > > 
> > > > On Apr 7, 2015, at 6:10 AM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
> > > > 
> > > > Ping
> > > > 
> > > >> On Qua, 2015-04-01 at 14:14 -0700, Khem Raj wrote:
> > > >>> I will try it out. give me a day
> > > >>> 
> > > >>>> On Apr 1, 2015, at 2:08 PM, Bottazzini, Bruno <bruno.bottazzini@intel.com> wrote:
> > > >>>> 
> > > >>>> Khem,
> > > >>>> 
> > > >>>> Could you verify this patch and see if this satisfies what you have
> > > >>>> pointed previously ?
> > > >>>> 
> > > >>>> Do you think this patch is ready to go to master ?
> > > >>>> 
> > > >>>> Regards,
> > > >>>> 
> > > >>>> On Ter, 2015-03-31 at 17:25 -0300, Otavio Salvador wrote:
> > > >>>>> I am not a heavy user of systemd so I prefer other people (Khem?) to
> > > >>>>> comment on this ...
> > > >>>>> 
> > > >>>>> On Tue, Mar 31, 2015 at 5:21 PM, Bottazzini, Bruno
> > > >>>>> <bruno.bottazzini@intel.com> wrote:
> > > >>>>>> Ping
> > > >>>>>> 
> > > >>>>>> On Seg, 2015-03-30 at 15:13 -0300, Bruno Bottazzini wrote:
> > > >>>>>>> Adding patches that fix bugs for 219 version.
> > > >>>>>>> This will get the same consistency of the stable systemd 219 version.
> > > >>>>>>> 
> > > >>>>>>> More details:
> > > >>>>>>> http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v219-stable
> > > >>>>>>> ---
> > > >>>>>>> ...remote-fix-certificate-status-memory-leak.patch |  31 +
> > > >>>>>>> ...ournal-remote-fix-client_cert-memory-leak.patch |  35 +
> > > >>>>>>> ...0003-tmpfiles-Fix-parse_acl-error-message.patch |  28 +
> > > >>>>>>> ...-test-utf8-fix-utf16-tests-on-BE-machines.patch |  26 +
> > > >>>>>>> ...iles-avoid-creating-duplicate-acl-entries.patch | 131 +++
> > > >>>>>>> .../0006-shared-time-util-fix-gcc5-warning.patch   |  32 +
> > > >>>>>>> ...time-test-infinity-parsing-in-nanoseconds.patch |  36 +
> > > >>>>>>> .../0008-bootchart-fix-default-init-path.patch     |  44 +
> > > >>>>>>> ...emctl-bump-NOFILE-only-for-systemctl_main.patch |  44 +
> > > >>>>>>> ...0-Make-root-s-home-directory-configurable.patch |  89 +-
> > > >>>>>>> ...-util-avoid-freeing-uninitialized-pointer.patch |  37 +
> > > >>>>>>> ...11-bootchart-svg-fix-checking-of-list-end.patch |  28 +
> > > >>>>>>> ...md-add-getrandom-syscall-numbers-for-MIPS.patch |  38 +
> > > >>>>>>> ...aker-dependencies-between-mount-and-devic.patch |  33 +
> > > >>>>>>> ...topping-due-to-BindsTo-log-which-unit-cau.patch |  43 +
> > > >>>>>>> ...grade-message-about-sysctl-overrides-to-d.patch |  30 +
> > > >>>>>>> ...l-add-some-hints-how-to-override-settings.patch |  39 +
> > > >>>>>>> .../0017-core-rework-device-state-logic.patch      | 912 +++++++++++++++++++++
> > > >>>>>>> .../0018-core-fix-return-value-on-OOM.patch        |  26 +
> > > >>>>>>> ...e-x-machine-unix-prefix-for-the-container.patch |  33 +
> > > >>>>>>> ...0-shared-AFS-is-also-a-network-filesystem.patch |  25 +
> > > >>>>>>> ...downgrade-unit-type-not-supported-message.patch |  31 +
> > > >>>>>>> ...ournal-remote-fix-saving-of-binary-fields.patch |  97 +++
> > > >>>>>>> ...ix-Inappropriate-ioctl-for-device-on-ext4.patch |  37 +
> > > >>>>>>> ...eplace-VLA-with-alloca-to-make-llvm-happy.patch |  53 ++
> > > >>>>>>> ...ietly-ignore-ACLs-on-unsupported-filesyst.patch |  84 ++
> > > >>>>>>> ...-assume-ac-when-sys-class-power_supply-is.patch |  30 +
> > > >>>>>>> meta/recipes-core/systemd/systemd_219.bb           |  33 +-
> > > >>>>>>> 28 files changed, 2050 insertions(+), 55 deletions(-)
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> > > >>>>>>> create mode 100644 meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> > > >>>>>>> 
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..172bea2
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0001-journal-remote-fix-certificate-status-memory-leak.patch
> > > >>>>>>> @@ -0,0 +1,31 @@
> > > >>>>>>> +From 7057db8b36594bb03c611cab711cd992ad4de31e Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Michal Schmidt <mschmidt@redhat.com>
> > > >>>>>>> +Date: Tue, 17 Feb 2015 10:33:01 +0100
> > > >>>>>>> +Subject: [PATCH 01/26] journal-remote: fix certificate status memory leak
> > > >>>>>>> +
> > > >>>>>>> +The output of gnutls_certificate_verification_status_print() needs to be
> > > >>>>>>> +freed.
> > > >>>>>>> +
> > > >>>>>>> +Noticed this while staring at verify_cert_authorized() to see what could
> > > >>>>>>> +possibly confuse gcc5 on armv7hl to segfault during compilation.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 9c3cf9693ac5c0a332ba376f99e6adea28b1bb0d)
> > > >>>>>>> +---
> > > >>>>>>> + src/journal-remote/microhttpd-util.c | 1 +
> > > >>>>>>> + 1 file changed, 1 insertion(+)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> > > >>>>>>> +index 34d9337..de9c6ab 100644
> > > >>>>>>> +--- a/src/journal-remote/microhttpd-util.c
> > > >>>>>>> ++++ b/src/journal-remote/microhttpd-util.c
> > > >>>>>>> +@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) {
> > > >>>>>>> +                 return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m");
> > > >>>>>>> +
> > > >>>>>>> +         log_info("Certificate status: %s", out.data);
> > > >>>>>>> ++        gnutls_free(out.data);
> > > >>>>>>> +
> > > >>>>>>> +         return status == 0 ? 0 : -EPERM;
> > > >>>>>>> + }
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..f615876
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0002-journal-remote-fix-client_cert-memory-leak.patch
> > > >>>>>>> @@ -0,0 +1,35 @@
> > > >>>>>>> +From 5852d2efbfb888dfb0adddb25afac0814d3ebcbb Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Michal Schmidt <mschmidt@redhat.com>
> > > >>>>>>> +Date: Tue, 17 Feb 2015 10:36:57 +0100
> > > >>>>>>> +Subject: [PATCH 02/26] journal-remote: fix client_cert memory leak
> > > >>>>>>> +
> > > >>>>>>> +Found by Valgrind while testing the previous memory leak fix.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 32c3d7144cf9a5c8c03761d7f198142ca0f5f7b8)
> > > >>>>>>> +---
> > > >>>>>>> + src/journal-remote/microhttpd-util.c | 6 +++++-
> > > >>>>>>> + 1 file changed, 5 insertions(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c
> > > >>>>>>> +index de9c6ab..a95fff1 100644
> > > >>>>>>> +--- a/src/journal-remote/microhttpd-util.c
> > > >>>>>>> ++++ b/src/journal-remote/microhttpd-util.c
> > > >>>>>>> +@@ -239,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) {
> > > >>>>>>> +         return 0;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> ++static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) {
> > > >>>>>>> ++        gnutls_x509_crt_deinit(*p);
> > > >>>>>>> ++}
> > > >>>>>>> ++
> > > >>>>>>> + int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) {
> > > >>>>>>> +         const union MHD_ConnectionInfo *ci;
> > > >>>>>>> +         gnutls_session_t session;
> > > >>>>>>> +-        gnutls_x509_crt_t client_cert;
> > > >>>>>>> ++        _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL;
> > > >>>>>>> +         _cleanup_free_ char *buf = NULL;
> > > >>>>>>> +         int r;
> > > >>>>>>> +
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..15fa98c
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0003-tmpfiles-Fix-parse_acl-error-message.patch
> > > >>>>>>> @@ -0,0 +1,28 @@
> > > >>>>>>> +From ea960d3fc09c1e3745791d3433094678fd7ccd50 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
> > > >>>>>>> +Date: Tue, 17 Feb 2015 12:47:51 +0100
> > > >>>>>>> +Subject: [PATCH 03/26] tmpfiles: Fix parse_acl error message
> > > >>>>>>> +
> > > >>>>>>> +parse_acl() returns the error instead of setting errno.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 484adfd914504cd7e95867cea20ca7af71b888f2)
> > > >>>>>>> +---
> > > >>>>>>> + src/tmpfiles/tmpfiles.c | 2 +-
> > > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> > > >>>>>>> +index c948d4d..88ba7e4 100644
> > > >>>>>>> +--- a/src/tmpfiles/tmpfiles.c
> > > >>>>>>> ++++ b/src/tmpfiles/tmpfiles.c
> > > >>>>>>> +@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) {
> > > >>>>>>> +          * afterwards, so the mask can be added now if necessary. */
> > > >>>>>>> +         r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force);
> > > >>>>>>> +         if (r < 0)
> > > >>>>>>> +-                log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring",
> > > >>>>>>> ++                log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring",
> > > >>>>>>> +                                   item->argument);
> > > >>>>>>> + #else
> > > >>>>>>> +         log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring");
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..f43068d
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0004-test-utf8-fix-utf16-tests-on-BE-machines.patch
> > > >>>>>>> @@ -0,0 +1,26 @@
> > > >>>>>>> +From 8df2bb91718bf2ccc89c41f0dd19cd0bc8da1357 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Tom Gundersen <teg@jklm.no>
> > > >>>>>>> +Date: Wed, 18 Feb 2015 14:33:50 +0100
> > > >>>>>>> +Subject: [PATCH 04/26] test: utf8 - fix utf16 tests on BE machines
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 502184de0f95d3a124d4d4c77ae7a88747a0fac2)
> > > >>>>>>> +---
> > > >>>>>>> + src/test/test-utf8.c | 2 +-
> > > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
> > > >>>>>>> +index befa385..346f852 100644
> > > >>>>>>> +--- a/src/test/test-utf8.c
> > > >>>>>>> ++++ b/src/test/test-utf8.c
> > > >>>>>>> +@@ -95,7 +95,7 @@ static void test_utf8_escaping_printable(void) {
> > > >>>>>>> +
> > > >>>>>>> + static void test_utf16_to_utf8(void) {
> > > >>>>>>> +         char *a = NULL;
> > > >>>>>>> +-        const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 };
> > > >>>>>>> ++        const uint16_t utf16[] = { htole16('a'), htole16(0xd800), htole16('b'), htole16(0xdc00), htole16('c'), htole16(0xd801), htole16(0xdc37) };
> > > >>>>>>> +         const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 };
> > > >>>>>>> +
> > > >>>>>>> +         a = utf16_to_utf8(utf16, 14);
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..35fe913
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch
> > > >>>>>>> @@ -0,0 +1,131 @@
> > > >>>>>>> +From c429758054ee77383ca6d7323ecdd4163d3a3718 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > > >>>>>>> +Date: Mon, 23 Feb 2015 23:19:54 -0500
> > > >>>>>>> +Subject: [PATCH 05/26] tmpfiles: avoid creating duplicate acl entries
> > > >>>>>>> +
> > > >>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89202
> > > >>>>>>> +https://bugs.debian.org/778656
> > > >>>>>>> +
> > > >>>>>>> +Status quo ante can be restored with:
> > > >>>>>>> +  getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id`
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 1c73f3bc29111a00738569c9d40a989b161a0624)
> > > >>>>>>> +---
> > > >>>>>>> + src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--
> > > >>>>>>> + src/shared/acl-util.h |  4 +++
> > > >>>>>>> + 2 files changed, 81 insertions(+), 2 deletions(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> > > >>>>>>> +index a4ff1ab..cbe09d7 100644
> > > >>>>>>> +--- a/src/shared/acl-util.c
> > > >>>>>>> ++++ b/src/shared/acl-util.c
> > > >>>>>>> +@@ -282,6 +282,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
> > > >>>>>>> +         return 0;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> ++static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> > > >>>>>>> ++        acl_tag_t tag_a, tag_b;
> > > >>>>>>> ++
> > > >>>>>>> ++        if (acl_get_tag_type(a, &tag_a) < 0)
> > > >>>>>>> ++                return -errno;
> > > >>>>>>> ++
> > > >>>>>>> ++        if (acl_get_tag_type(b, &tag_b) < 0)
> > > >>>>>>> ++                return -errno;
> > > >>>>>>> ++
> > > >>>>>>> ++        if (tag_a != tag_b)
> > > >>>>>>> ++                return false;
> > > >>>>>>> ++
> > > >>>>>>> ++        switch (tag_a) {
> > > >>>>>>> ++        case ACL_USER_OBJ:
> > > >>>>>>> ++        case ACL_GROUP_OBJ:
> > > >>>>>>> ++        case ACL_MASK:
> > > >>>>>>> ++        case ACL_OTHER:
> > > >>>>>>> ++                /* can have only one of those */
> > > >>>>>>> ++                return true;
> > > >>>>>>> ++        case ACL_USER: {
> > > >>>>>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> > > >>>>>>> ++
> > > >>>>>>> ++                uid_a = acl_get_qualifier(a);
> > > >>>>>>> ++                if (!uid_a)
> > > >>>>>>> ++                        return -errno;
> > > >>>>>>> ++
> > > >>>>>>> ++                uid_b = acl_get_qualifier(b);
> > > >>>>>>> ++                if (!uid_b)
> > > >>>>>>> ++                        return -errno;
> > > >>>>>>> ++
> > > >>>>>>> ++                return *uid_a == *uid_b;
> > > >>>>>>> ++        }
> > > >>>>>>> ++        case ACL_GROUP: {
> > > >>>>>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> > > >>>>>>> ++
> > > >>>>>>> ++                gid_a = acl_get_qualifier(a);
> > > >>>>>>> ++                if (!gid_a)
> > > >>>>>>> ++                        return -errno;
> > > >>>>>>> ++
> > > >>>>>>> ++                gid_b = acl_get_qualifier(b);
> > > >>>>>>> ++                if (!gid_b)
> > > >>>>>>> ++                        return -errno;
> > > >>>>>>> ++
> > > >>>>>>> ++                return *gid_a == *gid_b;
> > > >>>>>>> ++        }
> > > >>>>>>> ++        default:
> > > >>>>>>> ++                assert_not_reached("Unknown acl tag type");
> > > >>>>>>> ++        }
> > > >>>>>>> ++}
> > > >>>>>>> ++
> > > >>>>>>> ++static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) {
> > > >>>>>>> ++        acl_entry_t i;
> > > >>>>>>> ++        int r;
> > > >>>>>>> ++
> > > >>>>>>> ++        for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i);
> > > >>>>>>> ++             r > 0;
> > > >>>>>>> ++             r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) {
> > > >>>>>>> ++
> > > >>>>>>> ++                r = acl_entry_equal(i, entry);
> > > >>>>>>> ++                if (r < 0)
> > > >>>>>>> ++                        return r;
> > > >>>>>>> ++                if (r > 0) {
> > > >>>>>>> ++                        *out = i;
> > > >>>>>>> ++                        return 1;
> > > >>>>>>> ++                }
> > > >>>>>>> ++        }
> > > >>>>>>> ++        if (r < 0)
> > > >>>>>>> ++                return -errno;
> > > >>>>>>> ++        return 0;
> > > >>>>>>> ++}
> > > >>>>>>> ++
> > > >>>>>>> + int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> > > >>>>>>> +         _cleanup_(acl_freep) acl_t old;
> > > >>>>>>> +         acl_entry_t i;
> > > >>>>>>> +@@ -297,8 +368,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
> > > >>>>>>> +
> > > >>>>>>> +                 acl_entry_t j;
> > > >>>>>>> +
> > > >>>>>>> +-                if (acl_create_entry(&old, &j) < 0)
> > > >>>>>>> +-                        return -errno;
> > > >>>>>>> ++                r = find_acl_entry(old, i, &j);
> > > >>>>>>> ++                if (r < 0)
> > > >>>>>>> ++                        return r;
> > > >>>>>>> ++                if (r == 0)
> > > >>>>>>> ++                        if (acl_create_entry(&old, &j) < 0)
> > > >>>>>>> ++                                return -errno;
> > > >>>>>>> +
> > > >>>>>>> +                 if (acl_copy_entry(j, i) < 0)
> > > >>>>>>> +                         return -errno;
> > > >>>>>>> +diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h
> > > >>>>>>> +index 90e88ff..fdb9006 100644
> > > >>>>>>> +--- a/src/shared/acl-util.h
> > > >>>>>>> ++++ b/src/shared/acl-util.h
> > > >>>>>>> +@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl);
> > > >>>>>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free);
> > > >>>>>>> + #define acl_free_charp acl_free
> > > >>>>>>> + DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp);
> > > >>>>>>> ++#define acl_free_uid_tp acl_free
> > > >>>>>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp);
> > > >>>>>>> ++#define acl_free_gid_tp acl_free
> > > >>>>>>> ++DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp);
> > > >>>>>>> +
> > > >>>>>>> + #endif
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..fc707bb
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0006-shared-time-util-fix-gcc5-warning.patch
> > > >>>>>>> @@ -0,0 +1,32 @@
> > > >>>>>>> +From 57da343cebcd77d168d5648825698e4edbb56d2c Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Daniel Mack <daniel@zonque.org>
> > > >>>>>>> +Date: Tue, 24 Feb 2015 13:26:09 +0100
> > > >>>>>>> +Subject: [PATCH 06/26] shared/time-util: fix gcc5 warning
> > > >>>>>>> +
> > > >>>>>>> +  CC       src/shared/libsystemd_shared_la-time-util.lo
> > > >>>>>>> +src/shared/time-util.c: In function 'parse_nsec':
> > > >>>>>>> +src/shared/time-util.c:789:25: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
> > > >>>>>>> +                 if (!*s != 0)
> > > >>>>>>> +                         ^
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 8e8933ca0f06bae19cb6db601e83b33f8ac80f2a)
> > > >>>>>>> +---
> > > >>>>>>> + src/shared/time-util.c | 2 +-
> > > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/shared/time-util.c b/src/shared/time-util.c
> > > >>>>>>> +index 947ac1f..1c36c57 100644
> > > >>>>>>> +--- a/src/shared/time-util.c
> > > >>>>>>> ++++ b/src/shared/time-util.c
> > > >>>>>>> +@@ -786,7 +786,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
> > > >>>>>>> +         s = startswith(p, "infinity");
> > > >>>>>>> +         if (s) {
> > > >>>>>>> +                 s += strspn(s, WHITESPACE);
> > > >>>>>>> +-                if (!*s != 0)
> > > >>>>>>> ++                if (*s != 0)
> > > >>>>>>> +                         return -EINVAL;
> > > >>>>>>> +
> > > >>>>>>> +                 *nsec = NSEC_INFINITY;
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..161b7b5
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0007-test-time-test-infinity-parsing-in-nanoseconds.patch
> > > >>>>>>> @@ -0,0 +1,36 @@
> > > >>>>>>> +From 5248b6bbaf09c74cd152257132cba9358549446a Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Daniel Mack <daniel@zonque.org>
> > > >>>>>>> +Date: Tue, 24 Feb 2015 13:27:10 +0100
> > > >>>>>>> +Subject: [PATCH 07/26] test-time: test "infinity" parsing in nanoseconds
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit fdd30a1530810b659345c565e97beef06b7af2fd)
> > > >>>>>>> +---
> > > >>>>>>> + src/test/test-time.c | 6 ++++++
> > > >>>>>>> + 1 file changed, 6 insertions(+)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/test/test-time.c b/src/test/test-time.c
> > > >>>>>>> +index 8cfc4cc..3840fff 100644
> > > >>>>>>> +--- a/src/test/test-time.c
> > > >>>>>>> ++++ b/src/test/test-time.c
> > > >>>>>>> +@@ -78,12 +78,18 @@ static void test_parse_nsec(void) {
> > > >>>>>>> +         assert_se(u == 2);
> > > >>>>>>> +         assert_se(parse_nsec(".7", &u) >= 0);
> > > >>>>>>> +         assert_se(u == 0);
> > > >>>>>>> ++        assert_se(parse_nsec("infinity", &u) >= 0);
> > > >>>>>>> ++        assert_se(u == NSEC_INFINITY);
> > > >>>>>>> ++        assert_se(parse_nsec(" infinity ", &u) >= 0);
> > > >>>>>>> ++        assert_se(u == NSEC_INFINITY);
> > > >>>>>>> +
> > > >>>>>>> +         assert_se(parse_nsec(" xyz ", &u) < 0);
> > > >>>>>>> +         assert_se(parse_nsec("", &u) < 0);
> > > >>>>>>> +         assert_se(parse_nsec(" . ", &u) < 0);
> > > >>>>>>> +         assert_se(parse_nsec(" 5. ", &u) < 0);
> > > >>>>>>> +         assert_se(parse_nsec(".s ", &u) < 0);
> > > >>>>>>> ++        assert_se(parse_nsec(" infinity .7", &u) < 0);
> > > >>>>>>> ++        assert_se(parse_nsec(".3 infinity", &u) < 0);
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> + static void test_format_timespan_one(usec_t x, usec_t accuracy) {
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..7eaad1e
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0008-bootchart-fix-default-init-path.patch
> > > >>>>>>> @@ -0,0 +1,44 @@
> > > >>>>>>> +From 588e3fe64330854d44f09b376a132c6384ac2499 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Martin Pitt <martin.pitt@ubuntu.com>
> > > >>>>>>> +Date: Tue, 24 Feb 2015 14:30:10 +0100
> > > >>>>>>> +Subject: [PATCH 08/26] bootchart: fix default init path
> > > >>>>>>> +
> > > >>>>>>> +Commit 6e1bf7ab99 used the wrong directory; we need rootlibexecdir, not
> > > >>>>>>> +rootlibdir, as the latter is something like /lib/x86_64-linux-gnu/ on
> > > >>>>>>> +multi-arch systems.
> > > >>>>>>> +
> > > >>>>>>> +https://launchpad.net/bugs/1423867
> > > >>>>>>> +(cherry picked from commit a804d849b3c2199bc25d1d4e65fc119fa4d7d0e2)
> > > >>>>>>> +---
> > > >>>>>>> + Makefile.am               | 1 +
> > > >>>>>>> + src/bootchart/bootchart.c | 2 +-
> > > >>>>>>> + 2 files changed, 2 insertions(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/Makefile.am b/Makefile.am
> > > >>>>>>> +index bf04d31..cc577ce 100644
> > > >>>>>>> +--- a/Makefile.am
> > > >>>>>>> ++++ b/Makefile.am
> > > >>>>>>> +@@ -198,6 +198,7 @@ AM_CPPFLAGS = \
> > > >>>>>>> +     -DKEXEC=\"$(KEXEC)\" \
> > > >>>>>>> +     -DLIBDIR=\"$(libdir)\" \
> > > >>>>>>> +     -DROOTLIBDIR=\"$(rootlibdir)\" \
> > > >>>>>>> ++    -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> > > >>>>>>> +     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> > > >>>>>>> +     -I $(top_srcdir)/src \
> > > >>>>>>> +     -I $(top_builddir)/src/shared \
> > > >>>>>>> +diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
> > > >>>>>>> +index 64a384b..175be68 100644
> > > >>>>>>> +--- a/src/bootchart/bootchart.c
> > > >>>>>>> ++++ b/src/bootchart/bootchart.c
> > > >>>>>>> +@@ -76,7 +76,7 @@ int sysfd=-1;
> > > >>>>>>> + #define DEFAULT_HZ 25.0
> > > >>>>>>> + #define DEFAULT_SCALE_X 100.0 /* 100px = 1sec */
> > > >>>>>>> + #define DEFAULT_SCALE_Y 20.0  /* 16px = 1 process bar */
> > > >>>>>>> +-#define DEFAULT_INIT ROOTLIBDIR "/systemd/systemd"
> > > >>>>>>> ++#define DEFAULT_INIT ROOTLIBEXECDIR "/systemd"
> > > >>>>>>> + #define DEFAULT_OUTPUT "/run/log"
> > > >>>>>>> +
> > > >>>>>>> + /* graph defaults */
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..dbffa5b
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch
> > > >>>>>>> @@ -0,0 +1,44 @@
> > > >>>>>>> +From 1df0ddca3ae405537ceb87eccdb76324f276706f Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > > >>>>>>> +Date: Tue, 24 Feb 2015 10:10:04 -0500
> > > >>>>>>> +Subject: [PATCH 09/26] systemctl: bump NOFILE only for systemctl_main
> > > >>>>>>> +
> > > >>>>>>> +It is not necessary when running as telinit, etc.
> > > >>>>>>> +
> > > >>>>>>> +https://bugzilla.redhat.com/show_bug.cgi?id=1184712
> > > >>>>>>> +(cherry picked from commit 95d383ee47db488f182048cfd6846f2e6b859f2b)
> > > >>>>>>> +---
> > > >>>>>>> + src/systemctl/systemctl.c | 10 +++++-----
> > > >>>>>>> + 1 file changed, 5 insertions(+), 5 deletions(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
> > > >>>>>>> +index 21cb898..6b93ec8 100644
> > > >>>>>>> +--- a/src/systemctl/systemctl.c
> > > >>>>>>> ++++ b/src/systemctl/systemctl.c
> > > >>>>>>> +@@ -7204,6 +7204,11 @@ found:
> > > >>>>>>> +                 }
> > > >>>>>>> +         }
> > > >>>>>>> +
> > > >>>>>>> ++        /* Increase max number of open files to 16K if we can, we
> > > >>>>>>> ++         * might needs this when browsing journal files, which might
> > > >>>>>>> ++         * be split up into many files. */
> > > >>>>>>> ++        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> > > >>>>>>> ++
> > > >>>>>>> +         return verb->dispatch(bus, argv + optind);
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +@@ -7453,11 +7458,6 @@ int main(int argc, char*argv[]) {
> > > >>>>>>> +                 goto finish;
> > > >>>>>>> +         }
> > > >>>>>>> +
> > > >>>>>>> +-        /* Increase max number of open files to 16K if we can, we
> > > >>>>>>> +-         * might needs this when browsing journal files, which might
> > > >>>>>>> +-         * be split up into many files. */
> > > >>>>>>> +-        setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(16384));
> > > >>>>>>> +-
> > > >>>>>>> +         if (!avoid_bus())
> > > >>>>>>> +                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_scope != UNIT_FILE_SYSTEM, &bus);
> > > >>>>>>> +
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> > > >>>>>>> index 41b9039..ff2871b 100644
> > > >>>>>>> --- a/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch
> > > >>>>>>> @@ -1,7 +1,7 @@
> > > >>>>>>> -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001
> > > >>>>>>> -From: Khem Raj <raj.khem@gmail.com>
> > > >>>>>>> -Date: Fri, 20 Feb 2015 05:24:49 +0000
> > > >>>>>>> -Subject: [PATCH 10/11] Make root's home directory configurable
> > > >>>>>>> +From dd843247b6c769a3983462f7e616dc43226974a0 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Bruno Bottazzini <bruno.bottazzini@intel.com>
> > > >>>>>>> +Date: Thu, 5 Mar 2015 17:38:12 -0300
> > > >>>>>>> +Subject: [PATCH] Make root's home directory configurable
> > > >>>>>>> 
> > > >>>>>>> OpenEmbedded has a configurable home directory for root. Allow
> > > >>>>>>> systemd to be built using its idea of what root's home directory
> > > >>>>>>> @@ -9,32 +9,31 @@ should be.
> > > >>>>>>> 
> > > >>>>>>> Upstream-Status: Pending
> > > >>>>>>> 
> > > >>>>>>> -Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
> > > >>>>>>> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
> > > >>>>>>> +Patch made by Khem Raj <raj.khem@gmail.com> updated to be
> > > >>>>>>> +compatbile with systemd 219-stable
> > > >>>>>>> ---
> > > >>>>>>> - Makefile.am                       | 2 ++
> > > >>>>>>> - configure.ac                      | 7 +++++++
> > > >>>>>>> - src/core/unit-printf.c            | 2 +-
> > > >>>>>>> - src/nspawn/nspawn.c               | 4 ++--
> > > >>>>>>> - src/shared/util.c                 | 4 ++--
> > > >>>>>>> - units/console-shell.service.m4.in | 4 ++--
> > > >>>>>>> - units/emergency.service.in        | 4 ++--
> > > >>>>>>> - units/rescue.service.in           | 4 ++--
> > > >>>>>>> - 8 files changed, 20 insertions(+), 11 deletions(-)
> > > >>>>>>> + Makefile.am                | 2 ++
> > > >>>>>>> + configure.ac               | 7 +++++++
> > > >>>>>>> + src/core/unit-printf.c     | 2 +-
> > > >>>>>>> + src/nspawn/nspawn.c        | 5 ++---
> > > >>>>>>> + src/shared/util.c          | 4 ++--
> > > >>>>>>> + units/emergency.service.in | 4 ++--
> > > >>>>>>> + units/rescue.service.in    | 4 ++--
> > > >>>>>>> + 7 files changed, 18 insertions(+), 10 deletions(-)
> > > >>>>>>> 
> > > >>>>>>> diff --git a/Makefile.am b/Makefile.am
> > > >>>>>>> -index 0fb3f9f..4623963 100644
> > > >>>>>>> +index 93c0509..31ea94d 100644
> > > >>>>>>> --- a/Makefile.am
> > > >>>>>>> +++ b/Makefile.am
> > > >>>>>>> -@@ -199,6 +199,7 @@ AM_CPPFLAGS = \
> > > >>>>>>> -     -DKEXEC=\"$(KEXEC)\" \
> > > >>>>>>> -     -DLIBDIR=\"$(libdir)\" \
> > > >>>>>>> +@@ -201,6 +201,7 @@ AM_CPPFLAGS = \
> > > >>>>>>>     -DROOTLIBDIR=\"$(rootlibdir)\" \
> > > >>>>>>> -+    -DROOTHOMEDIR=\"$(roothomedir)\" \
> > > >>>>>>> +     -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
> > > >>>>>>>     -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
> > > >>>>>>> ++    -DROOTHOMEDIR=\"$(roothomedir)\" \
> > > >>>>>>>     -I $(top_srcdir)/src \
> > > >>>>>>>     -I $(top_builddir)/src/shared \
> > > >>>>>>> -@@ -6342,6 +6343,7 @@ EXTRA_DIST += \
> > > >>>>>>> +     -I $(top_srcdir)/src/shared \
> > > >>>>>>> +@@ -6350,6 +6351,7 @@ EXTRA_DIST += \
> > > >>>>>>> substitutions = \
> > > >>>>>>>        '|rootlibexecdir=$(rootlibexecdir)|' \
> > > >>>>>>>        '|rootbindir=$(rootbindir)|' \
> > > >>>>>>> @@ -43,10 +42,10 @@ index 0fb3f9f..4623963 100644
> > > >>>>>>>        '|SYSTEMCTL=$(rootbindir)/systemctl|' \
> > > >>>>>>>        '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \
> > > >>>>>>> diff --git a/configure.ac b/configure.ac
> > > >>>>>>> -index a5b2e6e..55bb7d8 100644
> > > >>>>>>> +index 01ee8dc..800a587 100644
> > > >>>>>>> --- a/configure.ac
> > > >>>>>>> +++ b/configure.ac
> > > >>>>>>> -@@ -1428,6 +1428,11 @@ AC_ARG_WITH([rootlibdir],
> > > >>>>>>> +@@ -1410,6 +1410,11 @@ AC_ARG_WITH([rootlibdir],
> > > >>>>>>>         [],
> > > >>>>>>>         [with_rootlibdir=${libdir}])
> > > >>>>>>> 
> > > >>>>>>> @@ -58,7 +57,7 @@ index a5b2e6e..55bb7d8 100644
> > > >>>>>>> AC_ARG_WITH([pamlibdir],
> > > >>>>>>>         AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
> > > >>>>>>>         [],
> > > >>>>>>> -@@ -1518,6 +1523,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> > > >>>>>>> +@@ -1500,6 +1505,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir])
> > > >>>>>>> AC_SUBST([pamconfdir], [$with_pamconfdir])
> > > >>>>>>> AC_SUBST([rootprefix], [$with_rootprefix])
> > > >>>>>>> AC_SUBST([rootlibdir], [$with_rootlibdir])
> > > >>>>>>> @@ -66,7 +65,7 @@ index a5b2e6e..55bb7d8 100644
> > > >>>>>>> 
> > > >>>>>>> AC_CONFIG_FILES([
> > > >>>>>>>         Makefile po/Makefile.in
> > > >>>>>>> -@@ -1617,6 +1623,7 @@ AC_MSG_RESULT([
> > > >>>>>>> +@@ -1599,6 +1605,7 @@ AC_MSG_RESULT([
> > > >>>>>>>         include_prefix:          ${INCLUDE_PREFIX}
> > > >>>>>>>         lib dir:                 ${libdir}
> > > >>>>>>>         rootlib dir:             ${with_rootlibdir}
> > > >>>>>>> @@ -75,10 +74,10 @@ index a5b2e6e..55bb7d8 100644
> > > >>>>>>>         SysV rc?.d directories:  ${SYSTEM_SYSVRCND_PATH}
> > > >>>>>>>         Build Python:            ${PYTHON}
> > > >>>>>>> diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
> > > >>>>>>> -index 97135db..14d12f1 100644
> > > >>>>>>> +index 7736899..ac5f008 100644
> > > >>>>>>> --- a/src/core/unit-printf.c
> > > >>>>>>> +++ b/src/core/unit-printf.c
> > > >>>>>>> -@@ -259,7 +259,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> > > >>>>>>> +@@ -256,7 +256,7 @@ static int specifier_user_home(char specifier, void *data, void *userdata, char
> > > >>>>>>>                  * best of it if we can, but fail if we can't */
> > > >>>>>>> 
> > > >>>>>>>                 if (!c->user || streq(c->user, "root") || streq(c->user, "0"))
> > > >>>>>>> @@ -88,21 +87,22 @@ index 97135db..14d12f1 100644
> > > >>>>>>>                         return -ENOTSUP;
> > > >>>>>>> 
> > > >>>>>>> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
> > > >>>>>>> -index b597edb..0b32673 100644
> > > >>>>>>> +index 08bfdcf..b44b4cd 100644
> > > >>>>>>> --- a/src/nspawn/nspawn.c
> > > >>>>>>> +++ b/src/nspawn/nspawn.c
> > > >>>>>>> -@@ -4192,7 +4192,7 @@ int main(int argc, char *argv[]) {
> > > >>>>>>> +@@ -4180,8 +4180,7 @@ int main(int argc, char *argv[]) {
> > > >>>>>>> +                         r = change_uid_gid(&home);
> > > >>>>>>>                         if (r < 0)
> > > >>>>>>>                                 _exit(EXIT_FAILURE);
> > > >>>>>>> -
> > > >>>>>>> +-
> > > >>>>>>> -                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
> > > >>>>>>> +                        if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) ||
> > > >>>>>>>                             (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
> > > >>>>>>>                             (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
> > > >>>>>>>                                 log_oom();
> > > >>>>>>> -@@ -4266,7 +4266,7 @@ int main(int argc, char *argv[]) {
> > > >>>>>>> -                                 execvp(argv[optind], argv + optind);
> > > >>>>>>> - #endif /* HAVE_EXECVPE */
> > > >>>>>>> +@@ -4250,7 +4249,7 @@ int main(int argc, char *argv[]) {
> > > >>>>>>> +                         } else if (argc > optind)
> > > >>>>>>> +                                 execvpe(argv[optind], argv + optind, env_use);
> > > >>>>>>>                         else {
> > > >>>>>>> -                                chdir(home ? home : "/root");
> > > >>>>>>> +                                chdir(home ? home : ROOTHOMEDIR);
> > > >>>>>>> @@ -110,10 +110,10 @@ index b597edb..0b32673 100644
> > > >>>>>>>                                 execle("/bin/sh", "-sh", NULL, env_use);
> > > >>>>>>>                         }
> > > >>>>>>> diff --git a/src/shared/util.c b/src/shared/util.c
> > > >>>>>>> -index cbbe3b1..a0e3cc5 100644
> > > >>>>>>> +index 241e752..00adab6 100644
> > > >>>>>>> --- a/src/shared/util.c
> > > >>>>>>> +++ b/src/shared/util.c
> > > >>>>>>> -@@ -4609,7 +4609,7 @@ int get_user_creds(
> > > >>>>>>> +@@ -4604,7 +4604,7 @@ int get_user_creds(
> > > >>>>>>>                         *gid = 0;
> > > >>>>>>> 
> > > >>>>>>>                 if (home)
> > > >>>>>>> @@ -122,7 +122,7 @@ index cbbe3b1..a0e3cc5 100644
> > > >>>>>>> 
> > > >>>>>>>                 if (shell)
> > > >>>>>>>                         *shell = "/bin/sh";
> > > >>>>>>> -@@ -5611,7 +5611,7 @@ int get_home_dir(char **_h) {
> > > >>>>>>> +@@ -5606,7 +5606,7 @@ int get_home_dir(char **_h) {
> > > >>>>>>>         /* Hardcode home directory for root to avoid NSS */
> > > >>>>>>>         u = getuid();
> > > >>>>>>>         if (u == 0) {
> > > >>>>>>> @@ -131,21 +131,6 @@ index cbbe3b1..a0e3cc5 100644
> > > >>>>>>>                 if (!h)
> > > >>>>>>>                         return -ENOMEM;
> > > >>>>>>> 
> > > >>>>>>> -diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
> > > >>>>>>> -index 5c80722..efde5f0 100644
> > > >>>>>>> ---- a/units/console-shell.service.m4.in
> > > >>>>>>> -+++ b/units/console-shell.service.m4.in
> > > >>>>>>> -@@ -15,8 +15,8 @@ After=rc-local.service
> > > >>>>>>> - Before=getty.target
> > > >>>>>>> -
> > > >>>>>>> - [Service]
> > > >>>>>>> --Environment=HOME=/root
> > > >>>>>>> --WorkingDirectory=/root
> > > >>>>>>> -+Environment=HOME=@roothomedir@
> > > >>>>>>> -+WorkingDirectory=@roothomedir@
> > > >>>>>>> - ExecStart=-@SULOGIN@
> > > >>>>>>> - ExecStopPost=-@SYSTEMCTL@ poweroff
> > > >>>>>>> - Type=idle
> > > >>>>>>> diff --git a/units/emergency.service.in b/units/emergency.service.in
> > > >>>>>>> index 2695d7b..7f47b73 100644
> > > >>>>>>> --- a/units/emergency.service.in
> > > >>>>>>> @@ -177,5 +162,5 @@ index de73fee..47f3593 100644
> > > >>>>>>> ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
> > > >>>>>>> ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default"
> > > >>>>>>> --
> > > >>>>>>> -2.1.4
> > > >>>>>>> +1.9.1
> > > >>>>>>> 
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..1e4a69d
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0010-acl-util-avoid-freeing-uninitialized-pointer.patch
> > > >>>>>>> @@ -0,0 +1,37 @@
> > > >>>>>>> +From f17b6474aaca077482a68aedc1de9d654ab21bad Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> > > >>>>>>> +Date: Tue, 24 Feb 2015 20:40:07 +0100
> > > >>>>>>> +Subject: [PATCH 10/26] acl-util: avoid freeing uninitialized pointer
> > > >>>>>>> +
> > > >>>>>>> +CID#1271344/1271345
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 76dcbc4992e895a377aad26f8c4a0dcd71002396)
> > > >>>>>>> +---
> > > >>>>>>> + src/shared/acl-util.c | 4 ++--
> > > >>>>>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c
> > > >>>>>>> +index cbe09d7..e67e9ac 100644
> > > >>>>>>> +--- a/src/shared/acl-util.c
> > > >>>>>>> ++++ b/src/shared/acl-util.c
> > > >>>>>>> +@@ -302,7 +302,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> > > >>>>>>> +                 /* can have only one of those */
> > > >>>>>>> +                 return true;
> > > >>>>>>> +         case ACL_USER: {
> > > >>>>>>> +-                _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b;
> > > >>>>>>> ++                _cleanup_(acl_free_uid_tpp) uid_t *uid_a = NULL, *uid_b = NULL;
> > > >>>>>>> +
> > > >>>>>>> +                 uid_a = acl_get_qualifier(a);
> > > >>>>>>> +                 if (!uid_a)
> > > >>>>>>> +@@ -315,7 +315,7 @@ static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
> > > >>>>>>> +                 return *uid_a == *uid_b;
> > > >>>>>>> +         }
> > > >>>>>>> +         case ACL_GROUP: {
> > > >>>>>>> +-                _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b;
> > > >>>>>>> ++                _cleanup_(acl_free_gid_tpp) gid_t *gid_a = NULL, *gid_b = NULL;
> > > >>>>>>> +
> > > >>>>>>> +                 gid_a = acl_get_qualifier(a);
> > > >>>>>>> +                 if (!gid_a)
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..dca5e20
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0011-bootchart-svg-fix-checking-of-list-end.patch
> > > >>>>>>> @@ -0,0 +1,28 @@
> > > >>>>>>> +From 668529dde3ecf35e24f39eaf3a3044099e4d5273 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> > > >>>>>>> +Date: Tue, 24 Feb 2015 18:32:31 +0200
> > > >>>>>>> +Subject: [PATCH 11/26] bootchart: svg: fix checking of list end
> > > >>>>>>> +
> > > >>>>>>> +If we have less samples than expected, systemd-bootchart will crash.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit c1682f17a0c966988e865c649e565dae41abf32d)
> > > >>>>>>> +---
> > > >>>>>>> + src/bootchart/svg.c | 2 +-
> > > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
> > > >>>>>>> +index e111fa9..144177c 100644
> > > >>>>>>> +--- a/src/bootchart/svg.c
> > > >>>>>>> ++++ b/src/bootchart/svg.c
> > > >>>>>>> +@@ -1170,7 +1170,7 @@ static void svg_ps_bars(void) {
> > > >>>>>>> +
> > > >>>>>>> +                 ps->sample = ps->sample->next;
> > > >>>>>>> +                 sample_hz = ps->sample;
> > > >>>>>>> +-                for (ii=0;((ii<(int)arg_hz/2)&&(ps->sample->next));ii++)
> > > >>>>>>> ++                for (ii=0;((ii<(int)arg_hz/2)&&(sample_hz->next));ii++)
> > > >>>>>>> +                         sample_hz = sample_hz->next;
> > > >>>>>>> +
> > > >>>>>>> +                 /* subtract bootchart cpu utilization from total */
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..e0cb193
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch
> > > >>>>>>> @@ -0,0 +1,38 @@
> > > >>>>>>> +From 5b49f6072e901336680708267c3d48a54c5410ae Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Aaro Koskinen <aaro.koskinen@nokia.com>
> > > >>>>>>> +Date: Mon, 23 Feb 2015 16:01:31 +0200
> > > >>>>>>> +Subject: [PATCH 12/26] systemd: add getrandom syscall numbers for MIPS
> > > >>>>>>> +
> > > >>>>>>> +Add getrandom syscall numbers for MIPS. Based on Linux 3.17 kernel
> > > >>>>>>> +(commit 42944521af97a3b25516f15f3149aec3779656dc, "MIPS: Wire up new
> > > >>>>>>> +syscalls getrandom and memfd_create").
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 3bec6d4690d2a7f08dc27b8221299c1db94978c4)
> > > >>>>>>> +---
> > > >>>>>>> + src/shared/missing.h | 10 ++++++++++
> > > >>>>>>> + 1 file changed, 10 insertions(+)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/shared/missing.h b/src/shared/missing.h
> > > >>>>>>> +index b33a70c..e72631e 100644
> > > >>>>>>> +--- a/src/shared/missing.h
> > > >>>>>>> ++++ b/src/shared/missing.h
> > > >>>>>>> +@@ -179,6 +179,16 @@ static inline int memfd_create(const char *name, unsigned int flags) {
> > > >>>>>>> + #    define __NR_getrandom 349
> > > >>>>>>> + #  elif defined(__powerpc__)
> > > >>>>>>> + #    define __NR_getrandom 359
> > > >>>>>>> ++#  elif defined _MIPS_SIM
> > > >>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI32
> > > >>>>>>> ++#      define __NR_getrandom 4353
> > > >>>>>>> ++#    endif
> > > >>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_NABI32
> > > >>>>>>> ++#      define __NR_getrandom 6317
> > > >>>>>>> ++#    endif
> > > >>>>>>> ++#    if _MIPS_SIM == _MIPS_SIM_ABI64
> > > >>>>>>> ++#      define __NR_getrandom 5313
> > > >>>>>>> ++#    endif
> > > >>>>>>> + #  else
> > > >>>>>>> + #    warning "__NR_getrandom unknown for your architecture"
> > > >>>>>>> + #    define __NR_getrandom 0xffffffff
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..1b842a2
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0013-unit-use-weaker-dependencies-between-mount-and-devic.patch
> > > >>>>>>> @@ -0,0 +1,33 @@
> > > >>>>>>> +From fc9805756d5c0088a3a67705bbf6bea30d0d35e5 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Lennart Poettering <lennart@poettering.net>
> > > >>>>>>> +Date: Wed, 25 Feb 2015 22:05:14 +0100
> > > >>>>>>> +Subject: [PATCH 13/26] unit: use weaker dependencies between mount and device
> > > >>>>>>> + units in --user mode
> > > >>>>>>> +
> > > >>>>>>> +When running in user mode unmounting of mount units when a device
> > > >>>>>>> +vanishes is unlikely to work, and even if it would work is already done
> > > >>>>>>> +by PID 1 anyway. HEnce, when creating implicit dependencies between
> > > >>>>>>> +mount units and their backing devices, created a Wants= type dependency
> > > >>>>>>> +in --user mode, but leave a BindsTo= dependency in --system mode.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 5bd4b173605142c7be493aa4d958ebaef21f421d)
> > > >>>>>>> +---
> > > >>>>>>> + src/core/unit.c | 2 +-
> > > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> > > >>>>>>> +index ee8e607..9f1e55e 100644
> > > >>>>>>> +--- a/src/core/unit.c
> > > >>>>>>> ++++ b/src/core/unit.c
> > > >>>>>>> +@@ -2845,7 +2845,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> > > >>>>>>> +         if (r < 0)
> > > >>>>>>> +                 return r;
> > > >>>>>>> +
> > > >>>>>>> +-        r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
> > > >>>>>>> ++        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
> > > >>>>>>> +         if (r < 0)
> > > >>>>>>> +                 return r;
> > > >>>>>>> +
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..92c4b8f
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch
> > > >>>>>>> @@ -0,0 +1,43 @@
> > > >>>>>>> +From ca0cf2741ef9db81141f4444ab58dd3552c8fb1f Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Colin Walters <walters@verbum.org>
> > > >>>>>>> +Date: Tue, 17 Feb 2015 13:47:34 -0500
> > > >>>>>>> +Subject: [PATCH 14/26] unit: When stopping due to BindsTo=, log which unit
> > > >>>>>>> + caused it
> > > >>>>>>> +
> > > >>>>>>> +I'm trying to track down a relatively recent change in systemd
> > > >>>>>>> +which broke OSTree; see https://bugzilla.gnome.org/show_bug.cgi?id=743891
> > > >>>>>>> +
> > > >>>>>>> +Systemd started to stop sysroot.mount, and this patch should help
> > > >>>>>>> +me debug why at least.
> > > >>>>>>> +
> > > >>>>>>> +While we're here, "break" on the first unit we find that will
> > > >>>>>>> +deactivate, as there's no point in further iteration.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 98f738b62047229af4a929d7996e2ab04253b02c)
> > > >>>>>>> +---
> > > >>>>>>> + src/core/unit.c | 4 +++-
> > > >>>>>>> + 1 file changed, 3 insertions(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> > > >>>>>>> +index 9f1e55e..563f6fe 100644
> > > >>>>>>> +--- a/src/core/unit.c
> > > >>>>>>> ++++ b/src/core/unit.c
> > > >>>>>>> +@@ -1648,12 +1648,14 @@ static void unit_check_binds_to(Unit *u) {
> > > >>>>>>> +                         continue;
> > > >>>>>>> +
> > > >>>>>>> +                 stop = true;
> > > >>>>>>> ++                break;
> > > >>>>>>> +         }
> > > >>>>>>> +
> > > >>>>>>> +         if (!stop)
> > > >>>>>>> +                 return;
> > > >>>>>>> +
> > > >>>>>>> +-        log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id);
> > > >>>>>>> ++        assert(other);
> > > >>>>>>> ++        log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id);
> > > >>>>>>> +
> > > >>>>>>> +         /* A unit we need to run is gone. Sniff. Let's stop this. */
> > > >>>>>>> +         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..46c25bd
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch
> > > >>>>>>> @@ -0,0 +1,30 @@
> > > >>>>>>> +From 2439dc6083d27271ee942559f0f73c99fa9e2b4e Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > > >>>>>>> +Date: Thu, 26 Feb 2015 19:00:11 -0500
> > > >>>>>>> +Subject: [PATCH 15/26] sysctl: downgrade message about sysctl overrides to
> > > >>>>>>> + debug
> > > >>>>>>> +
> > > >>>>>>> +Printing it at info level was tedious. We don't do that for any other
> > > >>>>>>> +overrides.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 7933e4266f8124e3fca71f67757abd44155fa1cb)
> > > >>>>>>> +---
> > > >>>>>>> + src/sysctl/sysctl.c | 2 +-
> > > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
> > > >>>>>>> +index 275a5b7..2415d84 100644
> > > >>>>>>> +--- a/src/sysctl/sysctl.c
> > > >>>>>>> ++++ b/src/sysctl/sysctl.c
> > > >>>>>>> +@@ -176,7 +176,7 @@ found:
> > > >>>>>>> +                         if (streq(value, existing))
> > > >>>>>>> +                                 continue;
> > > >>>>>>> +
> > > >>>>>>> +-                        log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
> > > >>>>>>> ++                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
> > > >>>>>>> +                         free(hashmap_remove(sysctl_options, p));
> > > >>>>>>> +                         free(v);
> > > >>>>>>> +                 }
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..87dce1f
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0016-sysctl-add-some-hints-how-to-override-settings.patch
> > > >>>>>>> @@ -0,0 +1,39 @@
> > > >>>>>>> +From af6a96a36415400482ad504392ea93c6a0e2ed43 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > > >>>>>>> +Date: Thu, 26 Feb 2015 19:05:51 -0500
> > > >>>>>>> +Subject: [PATCH 16/26] sysctl: add some hints how to override settings
> > > >>>>>>> +
> > > >>>>>>> +Also a link to decent documentation for sysrq keys. It is surprising
> > > >>>>>>> +hard to find.
> > > >>>>>>> +
> > > >>>>>>> +https://lists.fedoraproject.org/pipermail/devel/2015-February/208412.html
> > > >>>>>>> +(cherry picked from commit 16b65d7f463e91f6299dfa7b83d4b5fbeb109d1c)
> > > >>>>>>> +---
> > > >>>>>>> + sysctl.d/50-default.conf | 9 ++++++++-
> > > >>>>>>> + 1 file changed, 8 insertions(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
> > > >>>>>>> +index f189233..def151b 100644
> > > >>>>>>> +--- a/sysctl.d/50-default.conf
> > > >>>>>>> ++++ b/sysctl.d/50-default.conf
> > > >>>>>>> +@@ -5,9 +5,16 @@
> > > >>>>>>> + #  the Free Software Foundation; either version 2.1 of the License, or
> > > >>>>>>> + #  (at your option) any later version.
> > > >>>>>>> +
> > > >>>>>>> +-# See sysctl.d(5) and core(5) for for details.
> > > >>>>>>> ++# See sysctl.d(5) and core(5) for for documentation.
> > > >>>>>>> ++
> > > >>>>>>> ++# To override settings in this file, create a local file in /etc
> > > >>>>>>> ++# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
> > > >>>>>>> ++# there.
> > > >>>>>>> +
> > > >>>>>>> + # System Request functionality of the kernel (SYNC)
> > > >>>>>>> ++#
> > > >>>>>>> ++# Use kernel.sysrq = 1 to allow all keys.
> > > >>>>>>> ++# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
> > > >>>>>>> + kernel.sysrq = 16
> > > >>>>>>> +
> > > >>>>>>> + # Append the PID to the core filename
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..a3ab3e4
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0017-core-rework-device-state-logic.patch
> > > >>>>>>> @@ -0,0 +1,912 @@
> > > >>>>>>> +From 5b788e932fe918fb022bc20c3a15eb59e0fad53a Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Lennart Poettering <lennart@poettering.net>
> > > >>>>>>> +Date: Fri, 27 Feb 2015 21:55:08 +0100
> > > >>>>>>> +Subject: [PATCH 17/26] core: rework device state logic
> > > >>>>>>> +
> > > >>>>>>> +This change introduces a new state "tentative" for device units. Device
> > > >>>>>>> +units are considered "plugged" when udev announced them, "dead" when
> > > >>>>>>> +they are not available in the kernel, and "tentative" when they are
> > > >>>>>>> +referenced in /proc/self/mountinfo or /proc/swaps but not (yet)
> > > >>>>>>> +announced via udev.
> > > >>>>>>> +
> > > >>>>>>> +This should fix a race when device nodes (like loop devices) are created
> > > >>>>>>> +and immediately mounted. Previously, systemd might end up seeing the
> > > >>>>>>> +mount unit before the device, and would thus pull down the mount because
> > > >>>>>>> +its BindTo dependency on the device would not be fulfilled.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 628c89cc68ab96fce2de7ebba5933725d147aecc)
> > > >>>>>>> +---
> > > >>>>>>> + src/core/device.c | 368 +++++++++++++++++++++++++++++++++---------------------
> > > >>>>>>> + src/core/device.h |  14 ++-
> > > >>>>>>> + src/core/mount.c  |  46 ++++---
> > > >>>>>>> + src/core/swap.c   |  32 +++--
> > > >>>>>>> + src/core/swap.h   |   4 +-
> > > >>>>>>> + src/core/unit.c   |   1 -
> > > >>>>>>> + 6 files changed, 285 insertions(+), 180 deletions(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/core/device.c b/src/core/device.c
> > > >>>>>>> +index d3deac3..75b9a46 100644
> > > >>>>>>> +--- a/src/core/device.c
> > > >>>>>>> ++++ b/src/core/device.c
> > > >>>>>>> +@@ -36,7 +36,8 @@
> > > >>>>>>> +
> > > >>>>>>> + static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
> > > >>>>>>> +         [DEVICE_DEAD] = UNIT_INACTIVE,
> > > >>>>>>> +-        [DEVICE_PLUGGED] = UNIT_ACTIVE
> > > >>>>>>> ++        [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
> > > >>>>>>> ++        [DEVICE_PLUGGED] = UNIT_ACTIVE,
> > > >>>>>>> + };
> > > >>>>>>> +
> > > >>>>>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
> > > >>>>>>> +@@ -65,6 +66,41 @@ static void device_unset_sysfs(Device *d) {
> > > >>>>>>> +         d->sysfs = NULL;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> ++static int device_set_sysfs(Device *d, const char *sysfs) {
> > > >>>>>>> ++        Device *first;
> > > >>>>>>> ++        char *copy;
> > > >>>>>>> ++        int r;
> > > >>>>>>> ++
> > > >>>>>>> ++        assert(d);
> > > >>>>>>> ++
> > > >>>>>>> ++        if (streq_ptr(d->sysfs, sysfs))
> > > >>>>>>> ++                return 0;
> > > >>>>>>> ++
> > > >>>>>>> ++        r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops);
> > > >>>>>>> ++        if (r < 0)
> > > >>>>>>> ++                return r;
> > > >>>>>>> ++
> > > >>>>>>> ++        copy = strdup(sysfs);
> > > >>>>>>> ++        if (!copy)
> > > >>>>>>> ++                return -ENOMEM;
> > > >>>>>>> ++
> > > >>>>>>> ++        device_unset_sysfs(d);
> > > >>>>>>> ++
> > > >>>>>>> ++        first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
> > > >>>>>>> ++        LIST_PREPEND(same_sysfs, first, d);
> > > >>>>>>> ++
> > > >>>>>>> ++        r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
> > > >>>>>>> ++        if (r < 0) {
> > > >>>>>>> ++                LIST_REMOVE(same_sysfs, first, d);
> > > >>>>>>> ++                free(copy);
> > > >>>>>>> ++                return r;
> > > >>>>>>> ++        }
> > > >>>>>>> ++
> > > >>>>>>> ++        d->sysfs = copy;
> > > >>>>>>> ++
> > > >>>>>>> ++        return 0;
> > > >>>>>>> ++}
> > > >>>>>>> ++
> > > >>>>>>> + static void device_init(Unit *u) {
> > > >>>>>>> +         Device *d = DEVICE(u);
> > > >>>>>>> +
> > > >>>>>>> +@@ -112,8 +148,13 @@ static int device_coldplug(Unit *u) {
> > > >>>>>>> +         assert(d);
> > > >>>>>>> +         assert(d->state == DEVICE_DEAD);
> > > >>>>>>> +
> > > >>>>>>> +-        if (d->sysfs)
> > > >>>>>>> ++        if (d->found & DEVICE_FOUND_UDEV)
> > > >>>>>>> ++                /* If udev says the device is around, it's around */
> > > >>>>>>> +                 device_set_state(d, DEVICE_PLUGGED);
> > > >>>>>>> ++        else if (d->found != DEVICE_NOT_FOUND)
> > > >>>>>>> ++                /* If a device is found in /proc/self/mountinfo or
> > > >>>>>>> ++                 * /proc/swaps, it's "tentatively" around. */
> > > >>>>>>> ++                device_set_state(d, DEVICE_TENTATIVE);
> > > >>>>>>> +
> > > >>>>>>> +         return 0;
> > > >>>>>>> + }
> > > >>>>>>> +@@ -142,49 +183,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) {
> > > >>>>>>> +         return device_state_to_string(DEVICE(u)->state);
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-static int device_add_escaped_name(Unit *u, const char *dn) {
> > > >>>>>>> +-        _cleanup_free_ char *e = NULL;
> > > >>>>>>> +-        int r;
> > > >>>>>>> +-
> > > >>>>>>> +-        assert(u);
> > > >>>>>>> +-        assert(dn);
> > > >>>>>>> +-        assert(dn[0] == '/');
> > > >>>>>>> +-
> > > >>>>>>> +-        e = unit_name_from_path(dn, ".device");
> > > >>>>>>> +-        if (!e)
> > > >>>>>>> +-                return -ENOMEM;
> > > >>>>>>> +-
> > > >>>>>>> +-        r = unit_add_name(u, e);
> > > >>>>>>> +-        if (r < 0 && r != -EEXIST)
> > > >>>>>>> +-                return r;
> > > >>>>>>> +-
> > > >>>>>>> +-        return 0;
> > > >>>>>>> +-}
> > > >>>>>>> +-
> > > >>>>>>> +-static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
> > > >>>>>>> +-        _cleanup_free_ char *e = NULL;
> > > >>>>>>> +-        Unit *u;
> > > >>>>>>> +-
> > > >>>>>>> +-        assert(m);
> > > >>>>>>> +-        assert(dn);
> > > >>>>>>> +-        assert(dn[0] == '/');
> > > >>>>>>> +-        assert(_u);
> > > >>>>>>> +-
> > > >>>>>>> +-        e = unit_name_from_path(dn, ".device");
> > > >>>>>>> +-        if (!e)
> > > >>>>>>> +-                return -ENOMEM;
> > > >>>>>>> +-
> > > >>>>>>> +-        u = manager_get_unit(m, e);
> > > >>>>>>> +-        if (u) {
> > > >>>>>>> +-                *_u = u;
> > > >>>>>>> +-                return 1;
> > > >>>>>>> +-        }
> > > >>>>>>> +-
> > > >>>>>>> +-        return 0;
> > > >>>>>>> +-}
> > > >>>>>>> +-
> > > >>>>>>> +-static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
> > > >>>>>>> ++static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
> > > >>>>>>> +         const char *model;
> > > >>>>>>> ++        int r;
> > > >>>>>>> +
> > > >>>>>>> +         assert(u);
> > > >>>>>>> +         assert(dev);
> > > >>>>>>> +@@ -209,13 +210,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char
> > > >>>>>>> +
> > > >>>>>>> +                         j = strjoin(model, " ", label, NULL);
> > > >>>>>>> +                         if (j)
> > > >>>>>>> +-                                return unit_set_description(u, j);
> > > >>>>>>> +-                }
> > > >>>>>>> ++                                r = unit_set_description(u, j);
> > > >>>>>>> ++                } else
> > > >>>>>>> ++                        r = unit_set_description(u, model);
> > > >>>>>>> ++        } else
> > > >>>>>>> ++                r = unit_set_description(u, path);
> > > >>>>>>> +
> > > >>>>>>> +-                return unit_set_description(u, model);
> > > >>>>>>> +-        }
> > > >>>>>>> ++        if (r < 0)
> > > >>>>>>> ++                log_unit_error_errno(u->id, r, "Failed to set device description: %m");
> > > >>>>>>> +
> > > >>>>>>> +-        return unit_set_description(u, path);
> > > >>>>>>> ++        return r;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> + static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> > > >>>>>>> +@@ -242,20 +246,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
> > > >>>>>>> +
> > > >>>>>>> +                 n = unit_name_mangle(e, MANGLE_NOGLOB);
> > > >>>>>>> +                 if (!n)
> > > >>>>>>> +-                        return -ENOMEM;
> > > >>>>>>> ++                        return log_oom();
> > > >>>>>>> +
> > > >>>>>>> +                 r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
> > > >>>>>>> +                 if (r < 0)
> > > >>>>>>> +-                        return r;
> > > >>>>>>> ++                        return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m");
> > > >>>>>>> +         }
> > > >>>>>>> +         if (!isempty(state))
> > > >>>>>>> +-                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
> > > >>>>>>> +-                                 property, strna(udev_device_get_syspath(dev)));
> > > >>>>>>> ++                log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
> > > >>>>>>> +
> > > >>>>>>> +         return 0;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> > > >>>>>>> ++static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
> > > >>>>>>> ++        _cleanup_free_ char *e = NULL;
> > > >>>>>>> +         const char *sysfs;
> > > >>>>>>> +         Unit *u = NULL;
> > > >>>>>>> +         bool delete;
> > > >>>>>>> +@@ -269,12 +273,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > > >>>>>>> +         if (!sysfs)
> > > >>>>>>> +                 return 0;
> > > >>>>>>> +
> > > >>>>>>> +-        r = device_find_escape_name(m, path, &u);
> > > >>>>>>> +-        if (r < 0)
> > > >>>>>>> +-                return r;
> > > >>>>>>> ++        e = unit_name_from_path(path, ".device");
> > > >>>>>>> ++        if (!e)
> > > >>>>>>> ++                return log_oom();
> > > >>>>>>> ++
> > > >>>>>>> ++        u = manager_get_unit(m, e);
> > > >>>>>>> +
> > > >>>>>>> +-        if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
> > > >>>>>>> ++        if (u &&
> > > >>>>>>> ++            DEVICE(u)->sysfs &&
> > > >>>>>>> ++            !path_equal(DEVICE(u)->sysfs, sysfs)) {
> > > >>>>>>> ++                log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
> > > >>>>>>> +                 return -EEXIST;
> > > >>>>>>> ++        }
> > > >>>>>>> +
> > > >>>>>>> +         if (!u) {
> > > >>>>>>> +                 delete = true;
> > > >>>>>>> +@@ -283,7 +293,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > > >>>>>>> +                 if (!u)
> > > >>>>>>> +                         return log_oom();
> > > >>>>>>> +
> > > >>>>>>> +-                r = device_add_escaped_name(u, path);
> > > >>>>>>> ++                r = unit_add_name(u, e);
> > > >>>>>>> +                 if (r < 0)
> > > >>>>>>> +                         goto fail;
> > > >>>>>>> +
> > > >>>>>>> +@@ -295,37 +305,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > > >>>>>>> +          * actually been seen yet ->sysfs will not be
> > > >>>>>>> +          * initialized. Hence initialize it if necessary. */
> > > >>>>>>> +
> > > >>>>>>> +-        if (!DEVICE(u)->sysfs) {
> > > >>>>>>> +-                Device *first;
> > > >>>>>>> +-
> > > >>>>>>> +-                DEVICE(u)->sysfs = strdup(sysfs);
> > > >>>>>>> +-                if (!DEVICE(u)->sysfs) {
> > > >>>>>>> +-                        r = -ENOMEM;
> > > >>>>>>> +-                        goto fail;
> > > >>>>>>> +-                }
> > > >>>>>>> +-
> > > >>>>>>> +-                r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
> > > >>>>>>> +-                if (r < 0)
> > > >>>>>>> +-                        goto fail;
> > > >>>>>>> +-
> > > >>>>>>> +-                first = hashmap_get(m->devices_by_sysfs, sysfs);
> > > >>>>>>> +-                LIST_PREPEND(same_sysfs, first, DEVICE(u));
> > > >>>>>>> +-
> > > >>>>>>> +-                r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
> > > >>>>>>> +-                if (r < 0)
> > > >>>>>>> +-                        goto fail;
> > > >>>>>>> +-        }
> > > >>>>>>> +-
> > > >>>>>>> +-        device_make_description(u, dev, path);
> > > >>>>>>> ++        r = device_set_sysfs(DEVICE(u), sysfs);
> > > >>>>>>> ++        if (r < 0)
> > > >>>>>>> ++                goto fail;
> > > >>>>>>> +
> > > >>>>>>> +-        if (main) {
> > > >>>>>>> +-                /* The additional systemd udev properties we only
> > > >>>>>>> +-                 * interpret for the main object */
> > > >>>>>>> ++        (void) device_update_description(u, dev, path);
> > > >>>>>>> +
> > > >>>>>>> +-                r = device_add_udev_wants(u, dev);
> > > >>>>>>> +-                if (r < 0)
> > > >>>>>>> +-                        goto fail;
> > > >>>>>>> +-        }
> > > >>>>>>> ++        /* The additional systemd udev properties we only interpret
> > > >>>>>>> ++         * for the main object */
> > > >>>>>>> ++        if (main)
> > > >>>>>>> ++                (void) device_add_udev_wants(u, dev);
> > > >>>>>>> +
> > > >>>>>>> +         /* Note that this won't dispatch the load queue, the caller
> > > >>>>>>> +          * has to do that if needed and appropriate */
> > > >>>>>>> +@@ -334,7 +323,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
> > > >>>>>>> +         return 0;
> > > >>>>>>> +
> > > >>>>>>> + fail:
> > > >>>>>>> +-        log_warning_errno(r, "Failed to load device unit: %m");
> > > >>>>>>> ++        log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m");
> > > >>>>>>> +
> > > >>>>>>> +         if (delete && u)
> > > >>>>>>> +                 unit_free(u);
> > > >>>>>>> +@@ -342,7 +331,7 @@ fail:
> > > >>>>>>> +         return r;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > > >>>>>>> ++static int device_process_new(Manager *m, struct udev_device *dev) {
> > > >>>>>>> +         const char *sysfs, *dn, *alias;
> > > >>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> > > >>>>>>> +         int r;
> > > >>>>>>> +@@ -354,14 +343,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > > >>>>>>> +                 return 0;
> > > >>>>>>> +
> > > >>>>>>> +         /* Add the main unit named after the sysfs path */
> > > >>>>>>> +-        r = device_update_unit(m, dev, sysfs, true);
> > > >>>>>>> ++        r = device_setup_unit(m, dev, sysfs, true);
> > > >>>>>>> +         if (r < 0)
> > > >>>>>>> +                 return r;
> > > >>>>>>> +
> > > >>>>>>> +         /* Add an additional unit for the device node */
> > > >>>>>>> +         dn = udev_device_get_devnode(dev);
> > > >>>>>>> +         if (dn)
> > > >>>>>>> +-                device_update_unit(m, dev, dn, false);
> > > >>>>>>> ++                (void) device_setup_unit(m, dev, dn, false);
> > > >>>>>>> +
> > > >>>>>>> +         /* Add additional units for all symlinks */
> > > >>>>>>> +         first = udev_device_get_devlinks_list_entry(dev);
> > > >>>>>>> +@@ -388,7 +377,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > > >>>>>>> +                             st.st_rdev != udev_device_get_devnum(dev))
> > > >>>>>>> +                                 continue;
> > > >>>>>>> +
> > > >>>>>>> +-                device_update_unit(m, dev, p, false);
> > > >>>>>>> ++                (void) device_setup_unit(m, dev, p, false);
> > > >>>>>>> +         }
> > > >>>>>>> +
> > > >>>>>>> +         /* Add additional units for all explicitly configured
> > > >>>>>>> +@@ -405,7 +394,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > > >>>>>>> +                         e[l] = 0;
> > > >>>>>>> +
> > > >>>>>>> +                         if (path_is_absolute(e))
> > > >>>>>>> +-                                device_update_unit(m, dev, e, false);
> > > >>>>>>> ++                                (void) device_setup_unit(m, dev, e, false);
> > > >>>>>>> +                         else
> > > >>>>>>> +                                 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
> > > >>>>>>> +                 }
> > > >>>>>>> +@@ -416,39 +405,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) {
> > > >>>>>>> +         return 0;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-static void device_set_path_plugged(Manager *m, struct udev_device *dev) {
> > > >>>>>>> +-        const char *sysfs;
> > > >>>>>>> ++static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
> > > >>>>>>> ++        DeviceFound n;
> > > >>>>>>> ++
> > > >>>>>>> ++        assert(d);
> > > >>>>>>> ++
> > > >>>>>>> ++        n = add ? (d->found | found) : (d->found & ~found);
> > > >>>>>>> ++        if (n == d->found)
> > > >>>>>>> ++                return;
> > > >>>>>>> ++
> > > >>>>>>> ++        d->found = n;
> > > >>>>>>> ++
> > > >>>>>>> ++        if (now) {
> > > >>>>>>> ++                if (d->found & DEVICE_FOUND_UDEV)
> > > >>>>>>> ++                        device_set_state(d, DEVICE_PLUGGED);
> > > >>>>>>> ++                else if (d->found != DEVICE_NOT_FOUND)
> > > >>>>>>> ++                        device_set_state(d, DEVICE_TENTATIVE);
> > > >>>>>>> ++                else
> > > >>>>>>> ++                        device_set_state(d, DEVICE_DEAD);
> > > >>>>>>> ++        }
> > > >>>>>>> ++}
> > > >>>>>>> ++
> > > >>>>>>> ++static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
> > > >>>>>>> +         Device *d, *l;
> > > >>>>>>> +
> > > >>>>>>> +         assert(m);
> > > >>>>>>> +-        assert(dev);
> > > >>>>>>> ++        assert(sysfs);
> > > >>>>>>> +
> > > >>>>>>> +-        sysfs = udev_device_get_syspath(dev);
> > > >>>>>>> +-        if (!sysfs)
> > > >>>>>>> +-                return;
> > > >>>>>>> ++        if (found == DEVICE_NOT_FOUND)
> > > >>>>>>> ++                return 0;
> > > >>>>>>> +
> > > >>>>>>> +         l = hashmap_get(m->devices_by_sysfs, sysfs);
> > > >>>>>>> +         LIST_FOREACH(same_sysfs, d, l)
> > > >>>>>>> +-                device_set_state(d, DEVICE_PLUGGED);
> > > >>>>>>> ++                device_update_found_one(d, add, found, now);
> > > >>>>>>> ++
> > > >>>>>>> ++        return 0;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-static int device_process_removed_device(Manager *m, struct udev_device *dev) {
> > > >>>>>>> +-        const char *sysfs;
> > > >>>>>>> +-        Device *d;
> > > >>>>>>> ++static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
> > > >>>>>>> ++        _cleanup_free_ char *e = NULL;
> > > >>>>>>> ++        Unit *u;
> > > >>>>>>> +
> > > >>>>>>> +         assert(m);
> > > >>>>>>> +-        assert(dev);
> > > >>>>>>> ++        assert(path);
> > > >>>>>>> +
> > > >>>>>>> +-        sysfs = udev_device_get_syspath(dev);
> > > >>>>>>> +-        if (!sysfs)
> > > >>>>>>> +-                return -ENOMEM;
> > > >>>>>>> ++        if (found == DEVICE_NOT_FOUND)
> > > >>>>>>> ++                return 0;
> > > >>>>>>> +
> > > >>>>>>> +-        /* Remove all units of this sysfs path */
> > > >>>>>>> +-        while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) {
> > > >>>>>>> +-                device_unset_sysfs(d);
> > > >>>>>>> +-                device_set_state(d, DEVICE_DEAD);
> > > >>>>>>> +-        }
> > > >>>>>>> ++        e = unit_name_from_path(path, ".device");
> > > >>>>>>> ++        if (!e)
> > > >>>>>>> ++                return log_oom();
> > > >>>>>>> +
> > > >>>>>>> ++        u = manager_get_unit(m, e);
> > > >>>>>>> ++        if (!u)
> > > >>>>>>> ++                return 0;
> > > >>>>>>> ++
> > > >>>>>>> ++        device_update_found_one(DEVICE(u), add, found, now);
> > > >>>>>>> +         return 0;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +@@ -464,22 +476,6 @@ static bool device_is_ready(struct udev_device *dev) {
> > > >>>>>>> +         return parse_boolean(ready) != 0;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-static int device_process_new_path(Manager *m, const char *path) {
> > > >>>>>>> +-        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > > >>>>>>> +-
> > > >>>>>>> +-        assert(m);
> > > >>>>>>> +-        assert(path);
> > > >>>>>>> +-
> > > >>>>>>> +-        dev = udev_device_new_from_syspath(m->udev, path);
> > > >>>>>>> +-        if (!dev)
> > > >>>>>>> +-                return log_oom();
> > > >>>>>>> +-
> > > >>>>>>> +-        if (!device_is_ready(dev))
> > > >>>>>>> +-                return 0;
> > > >>>>>>> +-
> > > >>>>>>> +-        return device_process_new_device(m, dev);
> > > >>>>>>> +-}
> > > >>>>>>> +-
> > > >>>>>>> + static Unit *device_following(Unit *u) {
> > > >>>>>>> +         Device *d = DEVICE(u);
> > > >>>>>>> +         Device *other, *first = NULL;
> > > >>>>>>> +@@ -606,12 +602,31 @@ static int device_enumerate(Manager *m) {
> > > >>>>>>> +                 goto fail;
> > > >>>>>>> +
> > > >>>>>>> +         first = udev_enumerate_get_list_entry(e);
> > > >>>>>>> +-        udev_list_entry_foreach(item, first)
> > > >>>>>>> +-                device_process_new_path(m, udev_list_entry_get_name(item));
> > > >>>>>>> ++        udev_list_entry_foreach(item, first) {
> > > >>>>>>> ++                _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > > >>>>>>> ++                const char *sysfs;
> > > >>>>>>> ++
> > > >>>>>>> ++                sysfs = udev_list_entry_get_name(item);
> > > >>>>>>> ++
> > > >>>>>>> ++                dev = udev_device_new_from_syspath(m->udev, sysfs);
> > > >>>>>>> ++                if (!dev) {
> > > >>>>>>> ++                        log_oom();
> > > >>>>>>> ++                        continue;
> > > >>>>>>> ++                }
> > > >>>>>>> ++
> > > >>>>>>> ++                if (!device_is_ready(dev))
> > > >>>>>>> ++                        continue;
> > > >>>>>>> ++
> > > >>>>>>> ++                (void) device_process_new(m, dev);
> > > >>>>>>> ++
> > > >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
> > > >>>>>>> ++        }
> > > >>>>>>> +
> > > >>>>>>> +         return 0;
> > > >>>>>>> +
> > > >>>>>>> + fail:
> > > >>>>>>> ++        log_error_errno(r, "Failed to enumerate devices: %m");
> > > >>>>>>> ++
> > > >>>>>>> +         device_shutdown(m);
> > > >>>>>>> +         return r;
> > > >>>>>>> + }
> > > >>>>>>> +@@ -619,7 +634,7 @@ fail:
> > > >>>>>>> + static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
> > > >>>>>>> +         _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > > >>>>>>> +         Manager *m = userdata;
> > > >>>>>>> +-        const char *action;
> > > >>>>>>> ++        const char *action, *sysfs;
> > > >>>>>>> +         int r;
> > > >>>>>>> +
> > > >>>>>>> +         assert(m);
> > > >>>>>>> +@@ -641,33 +656,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> > > >>>>>>> +         if (!dev)
> > > >>>>>>> +                 return 0;
> > > >>>>>>> +
> > > >>>>>>> ++        sysfs = udev_device_get_syspath(dev);
> > > >>>>>>> ++        if (!sysfs) {
> > > >>>>>>> ++                log_error("Failed to get udev sys path.");
> > > >>>>>>> ++                return 0;
> > > >>>>>>> ++        }
> > > >>>>>>> ++
> > > >>>>>>> +         action = udev_device_get_action(dev);
> > > >>>>>>> +         if (!action) {
> > > >>>>>>> +                 log_error("Failed to get udev action string.");
> > > >>>>>>> +                 return 0;
> > > >>>>>>> +         }
> > > >>>>>>> +
> > > >>>>>>> +-        if (streq(action, "remove") || !device_is_ready(dev))  {
> > > >>>>>>> +-                r = device_process_removed_device(m, dev);
> > > >>>>>>> +-                if (r < 0)
> > > >>>>>>> +-                        log_error_errno(r, "Failed to process device remove event: %m");
> > > >>>>>>> +-
> > > >>>>>>> +-                r = swap_process_removed_device(m, dev);
> > > >>>>>>> ++        if (streq(action, "remove"))  {
> > > >>>>>>> ++                r = swap_process_device_remove(m, dev);
> > > >>>>>>> +                 if (r < 0)
> > > >>>>>>> +                         log_error_errno(r, "Failed to process swap device remove event: %m");
> > > >>>>>>> +
> > > >>>>>>> +-        } else {
> > > >>>>>>> +-                r = device_process_new_device(m, dev);
> > > >>>>>>> +-                if (r < 0)
> > > >>>>>>> +-                        log_error_errno(r, "Failed to process device new event: %m");
> > > >>>>>>> ++                /* If we get notified that a device was removed by
> > > >>>>>>> ++                 * udev, then it's completely gone, hence unset all
> > > >>>>>>> ++                 * found bits */
> > > >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
> > > >>>>>>> +
> > > >>>>>>> +-                r = swap_process_new_device(m, dev);
> > > >>>>>>> ++        } else if (device_is_ready(dev)) {
> > > >>>>>>> ++
> > > >>>>>>> ++                (void) device_process_new(m, dev);
> > > >>>>>>> ++
> > > >>>>>>> ++                r = swap_process_device_new(m, dev);
> > > >>>>>>> +                 if (r < 0)
> > > >>>>>>> +                         log_error_errno(r, "Failed to process swap device new event: %m");
> > > >>>>>>> +
> > > >>>>>>> +                 manager_dispatch_load_queue(m);
> > > >>>>>>> +
> > > >>>>>>> +-                device_set_path_plugged(m, dev);
> > > >>>>>>> ++                /* The device is found now, set the udev found bit */
> > > >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
> > > >>>>>>> ++
> > > >>>>>>> ++        } else {
> > > >>>>>>> ++                /* The device is nominally around, but not ready for
> > > >>>>>>> ++                 * us. Hence unset the udev bit, but leave the rest
> > > >>>>>>> ++                 * around. */
> > > >>>>>>> ++
> > > >>>>>>> ++                device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
> > > >>>>>>> +         }
> > > >>>>>>> +
> > > >>>>>>> +         return 0;
> > > >>>>>>> +@@ -686,9 +715,58 @@ static bool device_supported(Manager *m) {
> > > >>>>>>> +         return read_only <= 0;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
> > > >>>>>>> ++        _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
> > > >>>>>>> ++        struct stat st;
> > > >>>>>>> ++
> > > >>>>>>> ++        assert(m);
> > > >>>>>>> ++        assert(node);
> > > >>>>>>> ++
> > > >>>>>>> ++        /* This is called whenever we find a device referenced in
> > > >>>>>>> ++         * /proc/swaps or /proc/self/mounts. Such a device might be
> > > >>>>>>> ++         * mounted/enabled at a time where udev has not finished
> > > >>>>>>> ++         * probing it yet, and we thus haven't learned about it
> > > >>>>>>> ++         * yet. In this case we will set the device unit to
> > > >>>>>>> ++         * "tentative" state. */
> > > >>>>>>> ++
> > > >>>>>>> ++        if (add) {
> > > >>>>>>> ++                if (!path_startswith(node, "/dev"))
> > > >>>>>>> ++                        return 0;
> > > >>>>>>> ++
> > > >>>>>>> ++                if (stat(node, &st) < 0) {
> > > >>>>>>> ++                        if (errno == ENOENT)
> > > >>>>>>> ++                                return 0;
> > > >>>>>>> ++
> > > >>>>>>> ++                        return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
> > > >>>>>>> ++                }
> > > >>>>>>> ++
> > > >>>>>>> ++                if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
> > > >>>>>>> ++                        return 0;
> > > >>>>>>> ++
> > > >>>>>>> ++                dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
> > > >>>>>>> ++                if (!dev) {
> > > >>>>>>> ++                        if (errno == ENOENT)
> > > >>>>>>> ++                                return 0;
> > > >>>>>>> ++
> > > >>>>>>> ++                        return log_oom();
> > > >>>>>>> ++                }
> > > >>>>>>> ++
> > > >>>>>>> ++                /* If the device is known in the kernel and newly
> > > >>>>>>> ++                 * appeared, then we'll create a device unit for it,
> > > >>>>>>> ++                 * under the name referenced in /proc/swaps or
> > > >>>>>>> ++                 * /proc/self/mountinfo. */
> > > >>>>>>> ++
> > > >>>>>>> ++                (void) device_setup_unit(m, dev, node, false);
> > > >>>>>>> ++        }
> > > >>>>>>> ++
> > > >>>>>>> ++        /* Update the device unit's state, should it exist */
> > > >>>>>>> ++        return device_update_found_by_name(m, node, add, found, now);
> > > >>>>>>> ++}
> > > >>>>>>> ++
> > > >>>>>>> + static const char* const device_state_table[_DEVICE_STATE_MAX] = {
> > > >>>>>>> +         [DEVICE_DEAD] = "dead",
> > > >>>>>>> +-        [DEVICE_PLUGGED] = "plugged"
> > > >>>>>>> ++        [DEVICE_TENTATIVE] = "tentative",
> > > >>>>>>> ++        [DEVICE_PLUGGED] = "plugged",
> > > >>>>>>> + };
> > > >>>>>>> +
> > > >>>>>>> + DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
> > > >>>>>>> +diff --git a/src/core/device.h b/src/core/device.h
> > > >>>>>>> +index bb7ae07..0609b20 100644
> > > >>>>>>> +--- a/src/core/device.h
> > > >>>>>>> ++++ b/src/core/device.h
> > > >>>>>>> +@@ -29,20 +29,28 @@ typedef struct Device Device;
> > > >>>>>>> +  * simplifies the state engine greatly */
> > > >>>>>>> + typedef enum DeviceState {
> > > >>>>>>> +         DEVICE_DEAD,
> > > >>>>>>> +-        DEVICE_PLUGGED,
> > > >>>>>>> ++        DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
> > > >>>>>>> ++        DEVICE_PLUGGED,   /* announced by udev */
> > > >>>>>>> +         _DEVICE_STATE_MAX,
> > > >>>>>>> +         _DEVICE_STATE_INVALID = -1
> > > >>>>>>> + } DeviceState;
> > > >>>>>>> +
> > > >>>>>>> ++typedef enum DeviceFound {
> > > >>>>>>> ++        DEVICE_NOT_FOUND = 0,
> > > >>>>>>> ++        DEVICE_FOUND_UDEV = 1,
> > > >>>>>>> ++        DEVICE_FOUND_MOUNT = 2,
> > > >>>>>>> ++        DEVICE_FOUND_SWAP = 4,
> > > >>>>>>> ++} DeviceFound;
> > > >>>>>>> ++
> > > >>>>>>> + struct Device {
> > > >>>>>>> +         Unit meta;
> > > >>>>>>> +
> > > >>>>>>> +         char *sysfs;
> > > >>>>>>> ++        DeviceFound found;
> > > >>>>>>> +
> > > >>>>>>> +         /* In order to be able to distinguish dependencies on
> > > >>>>>>> +         different device nodes we might end up creating multiple
> > > >>>>>>> +         devices for the same sysfs path. We chain them up here. */
> > > >>>>>>> +-
> > > >>>>>>> +         LIST_FIELDS(struct Device, same_sysfs);
> > > >>>>>>> +
> > > >>>>>>> +         DeviceState state;
> > > >>>>>>> +@@ -52,3 +60,5 @@ extern const UnitVTable device_vtable;
> > > >>>>>>> +
> > > >>>>>>> + const char* device_state_to_string(DeviceState i) _const_;
> > > >>>>>>> + DeviceState device_state_from_string(const char *s) _pure_;
> > > >>>>>>> ++
> > > >>>>>>> ++int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
> > > >>>>>>> +diff --git a/src/core/mount.c b/src/core/mount.c
> > > >>>>>>> +index f3977e6..c971330 100644
> > > >>>>>>> +--- a/src/core/mount.c
> > > >>>>>>> ++++ b/src/core/mount.c
> > > >>>>>>> +@@ -1391,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
> > > >>>>>>> +         return 0;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-static int mount_add_one(
> > > >>>>>>> ++static int mount_setup_unit(
> > > >>>>>>> +                 Manager *m,
> > > >>>>>>> +                 const char *what,
> > > >>>>>>> +                 const char *where,
> > > >>>>>>> +@@ -1434,7 +1434,7 @@ static int mount_add_one(
> > > >>>>>>> +
> > > >>>>>>> +                 u = unit_new(m, sizeof(Mount));
> > > >>>>>>> +                 if (!u)
> > > >>>>>>> +-                        return -ENOMEM;
> > > >>>>>>> ++                        return log_oom();
> > > >>>>>>> +
> > > >>>>>>> +                 r = unit_add_name(u, e);
> > > >>>>>>> +                 if (r < 0)
> > > >>>>>>> +@@ -1547,6 +1547,8 @@ static int mount_add_one(
> > > >>>>>>> +         return 0;
> > > >>>>>>> +
> > > >>>>>>> + fail:
> > > >>>>>>> ++        log_warning_errno(r, "Failed to set up mount unit: %m");
> > > >>>>>>> ++
> > > >>>>>>> +         if (delete && u)
> > > >>>>>>> +                 unit_free(u);
> > > >>>>>>> +
> > > >>>>>>> +@@ -1554,33 +1556,36 @@ fail:
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> > > >>>>>>> +-        _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL;
> > > >>>>>>> +-        _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL;
> > > >>>>>>> +-        struct libmnt_fs *fs;
> > > >>>>>>> ++        _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
> > > >>>>>>> ++        _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
> > > >>>>>>> +         int r = 0;
> > > >>>>>>> +
> > > >>>>>>> +         assert(m);
> > > >>>>>>> +
> > > >>>>>>> +-        tb = mnt_new_table();
> > > >>>>>>> +-        itr = mnt_new_iter(MNT_ITER_FORWARD);
> > > >>>>>>> +-        if (!tb || !itr)
> > > >>>>>>> ++        t = mnt_new_table();
> > > >>>>>>> ++        if (!t)
> > > >>>>>>> +                 return log_oom();
> > > >>>>>>> +
> > > >>>>>>> +-        r = mnt_table_parse_mtab(tb, NULL);
> > > >>>>>>> ++        i = mnt_new_iter(MNT_ITER_FORWARD);
> > > >>>>>>> ++        if (!i)
> > > >>>>>>> ++                return log_oom();
> > > >>>>>>> ++
> > > >>>>>>> ++        r = mnt_table_parse_mtab(t, NULL);
> > > >>>>>>> +         if (r < 0)
> > > >>>>>>> +-                return r;
> > > >>>>>>> ++                return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
> > > >>>>>>> +
> > > >>>>>>> +         r = 0;
> > > >>>>>>> +         for (;;) {
> > > >>>>>>> +                 const char *device, *path, *options, *fstype;
> > > >>>>>>> +                 _cleanup_free_ const char *d = NULL, *p = NULL;
> > > >>>>>>> ++                struct libmnt_fs *fs;
> > > >>>>>>> +                 int k;
> > > >>>>>>> +
> > > >>>>>>> +-                k = mnt_table_next_fs(tb, itr, &fs);
> > > >>>>>>> ++                k = mnt_table_next_fs(t, i, &fs);
> > > >>>>>>> +                 if (k == 1)
> > > >>>>>>> +                         break;
> > > >>>>>>> +-                else if (k < 0)
> > > >>>>>>> +-                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
> > > >>>>>>> ++                if (k < 0)
> > > >>>>>>> ++                        return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
> > > >>>>>>> +
> > > >>>>>>> +                 device = mnt_fs_get_source(fs);
> > > >>>>>>> +                 path = mnt_fs_get_target(fs);
> > > >>>>>>> +@@ -1588,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> > > >>>>>>> +                 fstype = mnt_fs_get_fstype(fs);
> > > >>>>>>> +
> > > >>>>>>> +                 d = cunescape(device);
> > > >>>>>>> ++                if (!d)
> > > >>>>>>> ++                        return log_oom();
> > > >>>>>>> ++
> > > >>>>>>> +                 p = cunescape(path);
> > > >>>>>>> +-                if (!d || !p)
> > > >>>>>>> ++                if (!p)
> > > >>>>>>> +                         return log_oom();
> > > >>>>>>> +
> > > >>>>>>> +-                k = mount_add_one(m, d, p, options, fstype, set_flags);
> > > >>>>>>> ++                (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
> > > >>>>>>> ++
> > > >>>>>>> ++                k = mount_setup_unit(m, d, p, options, fstype, set_flags);
> > > >>>>>>> +                 if (r == 0 && k < 0)
> > > >>>>>>> +                         r = k;
> > > >>>>>>> +         }
> > > >>>>>>> +@@ -1736,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> > > >>>>>>> +
> > > >>>>>>> +         r = mount_load_proc_self_mountinfo(m, true);
> > > >>>>>>> +         if (r < 0) {
> > > >>>>>>> +-                log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m");
> > > >>>>>>> +-
> > > >>>>>>> +                 /* Reset flags, just in case, for later calls */
> > > >>>>>>> +                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
> > > >>>>>>> +                         Mount *mount = MOUNT(u);
> > > >>>>>>> +@@ -1770,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
> > > >>>>>>> +                                 break;
> > > >>>>>>> +                         }
> > > >>>>>>> +
> > > >>>>>>> ++                        if (mount->parameters_proc_self_mountinfo.what)
> > > >>>>>>> ++                                (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
> > > >>>>>>> ++
> > > >>>>>>> ++
> > > >>>>>>> +                 } else if (mount->just_mounted || mount->just_changed) {
> > > >>>>>>> +
> > > >>>>>>> +                         /* New or changed mount entry */
> > > >>>>>>> +diff --git a/src/core/swap.c b/src/core/swap.c
> > > >>>>>>> +index 6997921..5c19af5 100644
> > > >>>>>>> +--- a/src/core/swap.c
> > > >>>>>>> ++++ b/src/core/swap.c
> > > >>>>>>> +@@ -338,7 +338,7 @@ static int swap_load(Unit *u) {
> > > >>>>>>> +         return swap_verify(s);
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-static int swap_add_one(
> > > >>>>>>> ++static int swap_setup_unit(
> > > >>>>>>> +                 Manager *m,
> > > >>>>>>> +                 const char *what,
> > > >>>>>>> +                 const char *what_proc_swaps,
> > > >>>>>>> +@@ -363,8 +363,10 @@ static int swap_add_one(
> > > >>>>>>> +
> > > >>>>>>> +         if (u &&
> > > >>>>>>> +             SWAP(u)->from_proc_swaps &&
> > > >>>>>>> +-            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
> > > >>>>>>> ++            !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) {
> > > >>>>>>> ++                log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps);
> > > >>>>>>> +                 return -EEXIST;
> > > >>>>>>> ++        }
> > > >>>>>>> +
> > > >>>>>>> +         if (!u) {
> > > >>>>>>> +                 delete = true;
> > > >>>>>>> +@@ -379,7 +381,7 @@ static int swap_add_one(
> > > >>>>>>> +
> > > >>>>>>> +                 SWAP(u)->what = strdup(what);
> > > >>>>>>> +                 if (!SWAP(u)->what) {
> > > >>>>>>> +-                        r = log_oom();
> > > >>>>>>> ++                        r = -ENOMEM;
> > > >>>>>>> +                         goto fail;
> > > >>>>>>> +                 }
> > > >>>>>>> +
> > > >>>>>>> +@@ -407,7 +409,6 @@ static int swap_add_one(
> > > >>>>>>> +         p->priority = priority;
> > > >>>>>>> +
> > > >>>>>>> +         unit_add_to_dbus_queue(u);
> > > >>>>>>> +-
> > > >>>>>>> +         return 0;
> > > >>>>>>> +
> > > >>>>>>> + fail:
> > > >>>>>>> +@@ -419,7 +420,7 @@ fail:
> > > >>>>>>> +         return r;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
> > > >>>>>>> ++static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {
> > > >>>>>>> +         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
> > > >>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> > > >>>>>>> +         const char *dn;
> > > >>>>>>> +@@ -428,7 +429,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> > > >>>>>>> +
> > > >>>>>>> +         assert(m);
> > > >>>>>>> +
> > > >>>>>>> +-        r = swap_add_one(m, device, device, prio, set_flags);
> > > >>>>>>> ++        r = swap_setup_unit(m, device, device, prio, set_flags);
> > > >>>>>>> +         if (r < 0)
> > > >>>>>>> +                 return r;
> > > >>>>>>> +
> > > >>>>>>> +@@ -444,7 +445,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> > > >>>>>>> +         /* Add the main device node */
> > > >>>>>>> +         dn = udev_device_get_devnode(d);
> > > >>>>>>> +         if (dn && !streq(dn, device))
> > > >>>>>>> +-                swap_add_one(m, dn, device, prio, set_flags);
> > > >>>>>>> ++                swap_setup_unit(m, dn, device, prio, set_flags);
> > > >>>>>>> +
> > > >>>>>>> +         /* Add additional units for all symlinks */
> > > >>>>>>> +         first = udev_device_get_devlinks_list_entry(d);
> > > >>>>>>> +@@ -465,7 +466,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool
> > > >>>>>>> +                             st.st_rdev != udev_device_get_devnum(d))
> > > >>>>>>> +                                 continue;
> > > >>>>>>> +
> > > >>>>>>> +-                swap_add_one(m, p, device, prio, set_flags);
> > > >>>>>>> ++                swap_setup_unit(m, p, device, prio, set_flags);
> > > >>>>>>> +         }
> > > >>>>>>> +
> > > >>>>>>> +         return r;
> > > >>>>>>> +@@ -1091,15 +1092,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
> > > >>>>>>> +                         if (k == EOF)
> > > >>>>>>> +                                 break;
> > > >>>>>>> +
> > > >>>>>>> +-                        log_warning("Failed to parse /proc/swaps:%u", i);
> > > >>>>>>> ++                        log_warning("Failed to parse /proc/swaps:%u.", i);
> > > >>>>>>> +                         continue;
> > > >>>>>>> +                 }
> > > >>>>>>> +
> > > >>>>>>> +                 d = cunescape(dev);
> > > >>>>>>> +                 if (!d)
> > > >>>>>>> +-                        return -ENOMEM;
> > > >>>>>>> ++                        return log_oom();
> > > >>>>>>> ++
> > > >>>>>>> ++                device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags);
> > > >>>>>>> +
> > > >>>>>>> +-                k = swap_process_new_swap(m, d, prio, set_flags);
> > > >>>>>>> ++                k = swap_process_new(m, d, prio, set_flags);
> > > >>>>>>> +                 if (k < 0)
> > > >>>>>>> +                         r = k;
> > > >>>>>>> +         }
> > > >>>>>>> +@@ -1151,6 +1154,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
> > > >>>>>>> +                                 break;
> > > >>>>>>> +                         }
> > > >>>>>>> +
> > > >>>>>>> ++                        if (swap->what)
> > > >>>>>>> ++                                device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true);
> > > >>>>>>> ++
> > > >>>>>>> +                 } else if (swap->just_activated) {
> > > >>>>>>> +
> > > >>>>>>> +                         /* New swap entry */
> > > >>>>>>> +@@ -1298,7 +1304,7 @@ fail:
> > > >>>>>>> +         return r;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev) {
> > > >>>>>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev) {
> > > >>>>>>> +         struct udev_list_entry *item = NULL, *first = NULL;
> > > >>>>>>> +         _cleanup_free_ char *e = NULL;
> > > >>>>>>> +         const char *dn;
> > > >>>>>>> +@@ -1341,7 +1347,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) {
> > > >>>>>>> +         return r;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev) {
> > > >>>>>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev) {
> > > >>>>>>> +         const char *dn;
> > > >>>>>>> +         int r = 0;
> > > >>>>>>> +         Swap *s;
> > > >>>>>>> +diff --git a/src/core/swap.h b/src/core/swap.h
> > > >>>>>>> +index 73e64d8..914a2db 100644
> > > >>>>>>> +--- a/src/core/swap.h
> > > >>>>>>> ++++ b/src/core/swap.h
> > > >>>>>>> +@@ -116,8 +116,8 @@ struct Swap {
> > > >>>>>>> +
> > > >>>>>>> + extern const UnitVTable swap_vtable;
> > > >>>>>>> +
> > > >>>>>>> +-int swap_process_new_device(Manager *m, struct udev_device *dev);
> > > >>>>>>> +-int swap_process_removed_device(Manager *m, struct udev_device *dev);
> > > >>>>>>> ++int swap_process_device_new(Manager *m, struct udev_device *dev);
> > > >>>>>>> ++int swap_process_device_remove(Manager *m, struct udev_device *dev);
> > > >>>>>>> +
> > > >>>>>>> + const char* swap_state_to_string(SwapState i) _const_;
> > > >>>>>>> + SwapState swap_state_from_string(const char *s) _pure_;
> > > >>>>>>> +diff --git a/src/core/unit.c b/src/core/unit.c
> > > >>>>>>> +index 563f6fe..a6558ee 100644
> > > >>>>>>> +--- a/src/core/unit.c
> > > >>>>>>> ++++ b/src/core/unit.c
> > > >>>>>>> +@@ -2843,7 +2843,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
> > > >>>>>>> +                 return -ENOMEM;
> > > >>>>>>> +
> > > >>>>>>> +         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
> > > >>>>>>> +-
> > > >>>>>>> +         if (r < 0)
> > > >>>>>>> +                 return r;
> > > >>>>>>> +
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..d614085
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0018-core-fix-return-value-on-OOM.patch
> > > >>>>>>> @@ -0,0 +1,26 @@
> > > >>>>>>> +From 3d3a67138c63b47f2a5723577f886bc3c7995748 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
> > > >>>>>>> +Date: Sat, 28 Feb 2015 23:39:55 +0100
> > > >>>>>>> +Subject: [PATCH 18/26] core: fix return value on OOM
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit c43b2132f37264600cc26e07c8d85dfdd6c969f0)
> > > >>>>>>> +---
> > > >>>>>>> + src/core/device.c | 2 ++
> > > >>>>>>> + 1 file changed, 2 insertions(+)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/core/device.c b/src/core/device.c
> > > >>>>>>> +index 75b9a46..1cc103c 100644
> > > >>>>>>> +--- a/src/core/device.c
> > > >>>>>>> ++++ b/src/core/device.c
> > > >>>>>>> +@@ -211,6 +211,8 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
> > > >>>>>>> +                         j = strjoin(model, " ", label, NULL);
> > > >>>>>>> +                         if (j)
> > > >>>>>>> +                                 r = unit_set_description(u, j);
> > > >>>>>>> ++                        else
> > > >>>>>>> ++                                r = -ENOMEM;
> > > >>>>>>> +                 } else
> > > >>>>>>> +                         r = unit_set_description(u, model);
> > > >>>>>>> +         } else
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..d94da60
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0019-machined-use-x-machine-unix-prefix-for-the-container.patch
> > > >>>>>>> @@ -0,0 +1,33 @@
> > > >>>>>>> +From 9a46fe3127eea552cd76d4b549f8d8ba70ea01b3 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Benjamin Franzke <benjaminfranzke@googlemail.com>
> > > >>>>>>> +Date: Thu, 19 Feb 2015 20:47:28 +0100
> > > >>>>>>> +Subject: [PATCH 19/26] machined: use x-machine-unix prefix for the container
> > > >>>>>>> + bus on dbus1
> > > >>>>>>> +
> > > >>>>>>> +This fixes "machinectl login" on systems configured with --disable-kdbus.
> > > >>>>>>> +
> > > >>>>>>> +The error was:
> > > >>>>>>> +machinectl login foo
> > > >>>>>>> +Failed to get machine PTY: Input/output error
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit f2273101c21bc59a390379e182e53cd4f07a7e71)
> > > >>>>>>> +---
> > > >>>>>>> + src/machine/machine-dbus.c | 2 +-
> > > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
> > > >>>>>>> +index b46f0a8..b0f0f66 100644
> > > >>>>>>> +--- a/src/machine/machine-dbus.c
> > > >>>>>>> ++++ b/src/machine/machine-dbus.c
> > > >>>>>>> +@@ -477,7 +477,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us
> > > >>>>>>> + #ifdef ENABLE_KDBUS
> > > >>>>>>> +         asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader);
> > > >>>>>>> + #else
> > > >>>>>>> +-        asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader);
> > > >>>>>>> ++        asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader);
> > > >>>>>>> + #endif
> > > >>>>>>> +         if (!container_bus->address)
> > > >>>>>>> +                 return -ENOMEM;
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..fcc2adf
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0020-shared-AFS-is-also-a-network-filesystem.patch
> > > >>>>>>> @@ -0,0 +1,25 @@
> > > >>>>>>> +From 3c350019fe9e4be16bf110988c324cfa3a21c61b Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> > > >>>>>>> +Date: Fri, 20 Feb 2015 15:35:11 -0300
> > > >>>>>>> +Subject: [PATCH 20/26] shared: AFS is also a network filesystem
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit ba89821c104d959082aad6f3f0e05a8afd575023)
> > > >>>>>>> +---
> > > >>>>>>> + src/shared/util.c | 1 +
> > > >>>>>>> + 1 file changed, 1 insertion(+)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/shared/util.c b/src/shared/util.c
> > > >>>>>>> +index ba035ca..f24b5b4 100644
> > > >>>>>>> +--- a/src/shared/util.c
> > > >>>>>>> ++++ b/src/shared/util.c
> > > >>>>>>> +@@ -1689,6 +1689,7 @@ bool chars_intersect(const char *a, const char *b) {
> > > >>>>>>> +
> > > >>>>>>> + bool fstype_is_network(const char *fstype) {
> > > >>>>>>> +         static const char table[] =
> > > >>>>>>> ++                "afs\0"
> > > >>>>>>> +                 "cifs\0"
> > > >>>>>>> +                 "smbfs\0"
> > > >>>>>>> +                 "sshfs\0"
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..02e279d
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0021-core-downgrade-unit-type-not-supported-message.patch
> > > >>>>>>> @@ -0,0 +1,31 @@
> > > >>>>>>> +From 4e2d4dd757c6faa4d5a471c10cf6f45978524845 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
> > > >>>>>>> +Date: Fri, 20 Feb 2015 10:53:28 +0100
> > > >>>>>>> +Subject: [PATCH 21/26] core: downgrade unit type not supported message
> > > >>>>>>> +
> > > >>>>>>> +Otherwise every daemon reload prints out warnings like:
> > > >>>>>>> +
> > > >>>>>>> +systemd[1]: Unit type .busname is not supported on this system.
> > > >>>>>>> +systemd[1]: Unit type .swap is not supported on this system.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 03afec3c9aa849ba13161c253b129b834298fd40)
> > > >>>>>>> +---
> > > >>>>>>> + src/core/manager.c | 2 +-
> > > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/core/manager.c b/src/core/manager.c
> > > >>>>>>> +index 4775219..bc9b7ec 100644
> > > >>>>>>> +--- a/src/core/manager.c
> > > >>>>>>> ++++ b/src/core/manager.c
> > > >>>>>>> +@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) {
> > > >>>>>>> +                 int q;
> > > >>>>>>> +
> > > >>>>>>> +                 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
> > > >>>>>>> +-                        log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> > > >>>>>>> ++                        log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
> > > >>>>>>> +                         continue;
> > > >>>>>>> +                 }
> > > >>>>>>> +
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..f5afd09
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0022-journal-remote-fix-saving-of-binary-fields.patch
> > > >>>>>>> @@ -0,0 +1,97 @@
> > > >>>>>>> +From 91a3ba906422127bb12095d1c7d0c7f0cb385588 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > > >>>>>>> +Date: Mon, 2 Mar 2015 10:34:51 -0500
> > > >>>>>>> +Subject: [PATCH 22/26] journal-remote: fix saving of binary fields
> > > >>>>>>> +
> > > >>>>>>> +Binary fields were not processed properly, and resulting journal files
> > > >>>>>>> +were non-conforming, resulting in an error ("Invalid field.") when reading.
> > > >>>>>>> +
> > > >>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89391
> > > >>>>>>> +(cherry picked from commit 09d801a82a46df518dd752e40bf13ac404daa2ce)
> > > >>>>>>> +---
> > > >>>>>>> + src/journal-remote/journal-remote-parse.c | 31 ++++++++++++++++++-------------
> > > >>>>>>> + src/journal-remote/journal-remote-parse.h |  4 +++-
> > > >>>>>>> + 2 files changed, 21 insertions(+), 14 deletions(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
> > > >>>>>>> +index d9dea8d..afded7e 100644
> > > >>>>>>> +--- a/src/journal-remote/journal-remote-parse.c
> > > >>>>>>> ++++ b/src/journal-remote/journal-remote-parse.c
> > > >>>>>>> +@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) {
> > > >>>>>>> +                    LLLLLLLL0011223344...\n
> > > >>>>>>> +                 */
> > > >>>>>>> +                 sep = memchr(line, '=', n);
> > > >>>>>>> +-                if (sep)
> > > >>>>>>> ++                if (sep) {
> > > >>>>>>> +                         /* chomp newline */
> > > >>>>>>> +                         n--;
> > > >>>>>>> +-                else
> > > >>>>>>> ++
> > > >>>>>>> ++                        r = iovw_put(&source->iovw, line, n);
> > > >>>>>>> ++                        if (r < 0)
> > > >>>>>>> ++                                return r;
> > > >>>>>>> ++                } else {
> > > >>>>>>> +                         /* replace \n with = */
> > > >>>>>>> +                         line[n-1] = '=';
> > > >>>>>>> +-                log_trace("Received: %.*s", (int) n, line);
> > > >>>>>>> +
> > > >>>>>>> +-                r = iovw_put(&source->iovw, line, n);
> > > >>>>>>> +-                if (r < 0) {
> > > >>>>>>> +-                        log_error("Failed to put line in iovect");
> > > >>>>>>> +-                        return r;
> > > >>>>>>> ++                        source->field_len = n;
> > > >>>>>>> ++                        source->state = STATE_DATA_START;
> > > >>>>>>> ++
> > > >>>>>>> ++                        /* we cannot put the field in iovec until we have all data */
> > > >>>>>>> +                 }
> > > >>>>>>> +
> > > >>>>>>> +-                if (!sep)
> > > >>>>>>> +-                        source->state = STATE_DATA_START;
> > > >>>>>>> ++                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
> > > >>>>>>> ++
> > > >>>>>>> +                 return 0; /* continue */
> > > >>>>>>> +         }
> > > >>>>>>> +
> > > >>>>>>> +@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) {
> > > >>>>>>> +
> > > >>>>>>> +         case STATE_DATA: {
> > > >>>>>>> +                 void *data;
> > > >>>>>>> ++                char *field;
> > > >>>>>>> +
> > > >>>>>>> +                 assert(source->data_size > 0);
> > > >>>>>>> +
> > > >>>>>>> +@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) {
> > > >>>>>>> +
> > > >>>>>>> +                 assert(data);
> > > >>>>>>> +
> > > >>>>>>> +-                r = iovw_put(&source->iovw, data, source->data_size);
> > > >>>>>>> +-                if (r < 0) {
> > > >>>>>>> +-                        log_error("failed to put binary buffer in iovect");
> > > >>>>>>> ++                field = (char*) data - sizeof(uint64_t) - source->field_len;
> > > >>>>>>> ++                memmove(field + sizeof(uint64_t), field, source->field_len);
> > > >>>>>>> ++
> > > >>>>>>> ++                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
> > > >>>>>>> ++                if (r < 0)
> > > >>>>>>> +                         return r;
> > > >>>>>>> +-                }
> > > >>>>>>> +
> > > >>>>>>> +                 source->state = STATE_DATA_FINISH;
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h
> > > >>>>>>> +index 8499f4e..22db550 100644
> > > >>>>>>> +--- a/src/journal-remote/journal-remote-parse.h
> > > >>>>>>> ++++ b/src/journal-remote/journal-remote-parse.h
> > > >>>>>>> +@@ -42,7 +42,9 @@ typedef struct RemoteSource {
> > > >>>>>>> +         size_t offset;     /* offset to the beginning of live data in the buffer */
> > > >>>>>>> +         size_t scanned;    /* number of bytes since the beginning of data without a newline */
> > > >>>>>>> +         size_t filled;     /* total number of bytes in the buffer */
> > > >>>>>>> +-        size_t data_size;  /* size of the binary data chunk being processed */
> > > >>>>>>> ++
> > > >>>>>>> ++        size_t field_len;  /* used for binary fields: the field name length */
> > > >>>>>>> ++        size_t data_size;  /* and the size of the binary data chunk being processed */
> > > >>>>>>> +
> > > >>>>>>> +         struct iovec_wrapper iovw;
> > > >>>>>>> +
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..79e565b
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch
> > > >>>>>>> @@ -0,0 +1,37 @@
> > > >>>>>>> +From 983c520982b548c9bb8f2689a93f2fb35c54c392 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
> > > >>>>>>> +Date: Sun, 1 Mar 2015 21:13:10 -0300
> > > >>>>>>> +Subject: [PATCH 23/26] journal: fix Inappropriate ioctl for device on ext4
> > > >>>>>>> +
> > > >>>>>>> +Logs constantly show
> > > >>>>>>> +
> > > >>>>>>> +systemd-journald[395]: Failed to set file attributes: Inappropriate ioctl for device
> > > >>>>>>> +
> > > >>>>>>> +This is because ext4 does not support FS_NOCOW_FL.
> > > >>>>>>> +
> > > >>>>>>> +[zj: fold into one conditional as suggested on the ML and
> > > >>>>>>> +     fix (preexisting) r/errno confusion in error message.]
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 65eae3b76243d2dfd869f8c43b787575f7b4b994)
> > > >>>>>>> +---
> > > >>>>>>> + src/journal/journal-file.c | 4 ++--
> > > >>>>>>> + 1 file changed, 2 insertions(+), 2 deletions(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
> > > >>>>>>> +index 2845e05..0f28718 100644
> > > >>>>>>> +--- a/src/journal/journal-file.c
> > > >>>>>>> ++++ b/src/journal/journal-file.c
> > > >>>>>>> +@@ -2611,8 +2611,8 @@ int journal_file_open(
> > > >>>>>>> +                  * shouldn't be too bad, given that we do our own
> > > >>>>>>> +                  * checksumming). */
> > > >>>>>>> +                 r = chattr_fd(f->fd, true, FS_NOCOW_FL);
> > > >>>>>>> +-                if (r < 0)
> > > >>>>>>> +-                        log_warning_errno(errno, "Failed to set file attributes: %m");
> > > >>>>>>> ++                if (r < 0 && r != -ENOTTY)
> > > >>>>>>> ++                        log_warning_errno(r, "Failed to set file attributes: %m");
> > > >>>>>>> +
> > > >>>>>>> +                 /* Let's attach the creation time to the journal file,
> > > >>>>>>> +                  * so that the vacuuming code knows the age of this
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..0cf9a0a
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch
> > > >>>>>>> @@ -0,0 +1,53 @@
> > > >>>>>>> +From 3f0c8096f3d5e3b37d6e0e26f0562c1a8669f0d8 Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Lennart Poettering <lennart@poettering.net>
> > > >>>>>>> +Date: Mon, 2 Mar 2015 20:55:38 +0100
> > > >>>>>>> +Subject: [PATCH 24/26] sd-daemon: replace VLA with alloca(), to make llvm
> > > >>>>>>> + happy
> > > >>>>>>> +
> > > >>>>>>> +https://bugs.freedesktop.org/show_bug.cgi?id=89379
> > > >>>>>>> +(cherry picked from commit d4a144fadf89bca681724c6c9a65b4a165fa0f90)
> > > >>>>>>> +---
> > > >>>>>>> + src/libsystemd/sd-daemon/sd-daemon.c | 12 +++++-------
> > > >>>>>>> + 1 file changed, 5 insertions(+), 7 deletions(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
> > > >>>>>>> +index 028c2a7..22a3a53 100644
> > > >>>>>>> +--- a/src/libsystemd/sd-daemon/sd-daemon.c
> > > >>>>>>> ++++ b/src/libsystemd/sd-daemon/sd-daemon.c
> > > >>>>>>> +@@ -352,11 +352,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> > > >>>>>>> +                 .msg_iovlen = 1,
> > > >>>>>>> +                 .msg_name = &sockaddr,
> > > >>>>>>> +         };
> > > >>>>>>> +-        union {
> > > >>>>>>> +-                struct cmsghdr cmsghdr;
> > > >>>>>>> +-                uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
> > > >>>>>>> +-                            CMSG_SPACE(sizeof(int) * n_fds)];
> > > >>>>>>> +-        } control;
> > > >>>>>>> ++        struct cmsghdr *control;
> > > >>>>>>> +         _cleanup_close_ int fd = -1;
> > > >>>>>>> +         struct cmsghdr *cmsg = NULL;
> > > >>>>>>> +         const char *e;
> > > >>>>>>> +@@ -400,8 +396,10 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> > > >>>>>>> +         if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
> > > >>>>>>> +                 msghdr.msg_namelen = sizeof(struct sockaddr_un);
> > > >>>>>>> +
> > > >>>>>>> ++        control = alloca(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int) * n_fds));
> > > >>>>>>> ++
> > > >>>>>>> +         if (n_fds > 0) {
> > > >>>>>>> +-                msghdr.msg_control = &control;
> > > >>>>>>> ++                msghdr.msg_control = control;
> > > >>>>>>> +                 msghdr.msg_controllen = CMSG_LEN(sizeof(int) * n_fds);
> > > >>>>>>> +
> > > >>>>>>> +                 cmsg = CMSG_FIRSTHDR(&msghdr);
> > > >>>>>>> +@@ -418,7 +416,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char
> > > >>>>>>> +                 try_without_ucred = true;
> > > >>>>>>> +                 controllen_without_ucred = msghdr.msg_controllen;
> > > >>>>>>> +
> > > >>>>>>> +-                msghdr.msg_control = &control;
> > > >>>>>>> ++                msghdr.msg_control = control;
> > > >>>>>>> +                 msghdr.msg_controllen += CMSG_LEN(sizeof(struct ucred));
> > > >>>>>>> +
> > > >>>>>>> +                 if (cmsg)
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..6912489
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch
> > > >>>>>>> @@ -0,0 +1,84 @@
> > > >>>>>>> +From 5fb87c4b6582ddb0a0ab1f31300eae69ab963afb Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: Hans-Peter Deifel <hpd@hpdeifel.de>
> > > >>>>>>> +Date: Tue, 3 Mar 2015 00:35:08 +0100
> > > >>>>>>> +Subject: [PATCH 25/26] tmpfiles: quietly ignore ACLs on unsupported
> > > >>>>>>> + filesystems
> > > >>>>>>> +
> > > >>>>>>> +A warning is printed if ACLs cannot be retrieved for any reason other
> > > >>>>>>> +than -ENOSYS. For -ENOSYS, debug log is printed.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit d873e8778c92014c02a9122852758b436fa95c0e)
> > > >>>>>>> +---
> > > >>>>>>> + src/tmpfiles/tmpfiles.c | 36 ++++++++++++++++++++----------------
> > > >>>>>>> + 1 file changed, 20 insertions(+), 16 deletions(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> > > >>>>>>> +index 88ba7e4..187997e 100644
> > > >>>>>>> +--- a/src/tmpfiles/tmpfiles.c
> > > >>>>>>> ++++ b/src/tmpfiles/tmpfiles.c
> > > >>>>>>> +@@ -704,6 +704,9 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> > > >>>>>>> +         int r;
> > > >>>>>>> +         _cleanup_(acl_free_charpp) char *t = NULL;
> > > >>>>>>> +
> > > >>>>>>> ++        /* Returns 0 for success, positive error if already warned,
> > > >>>>>>> ++         * negative error otherwise. */
> > > >>>>>>> ++
> > > >>>>>>> +         if (modify) {
> > > >>>>>>> +                 r = acls_for_file(path, type, acl, &dup);
> > > >>>>>>> +                 if (r < 0)
> > > >>>>>>> +@@ -731,35 +734,36 @@ static int path_set_acl(const char *path, acl_type_t type, acl_t acl, bool modif
> > > >>>>>>> +
> > > >>>>>>> +         r = acl_set_file(path, type, dup);
> > > >>>>>>> +         if (r < 0)
> > > >>>>>>> +-                return log_error_errno(-errno,
> > > >>>>>>> +-                                       "Setting %s ACL \"%s\" on %s failed: %m",
> > > >>>>>>> +-                                       type == ACL_TYPE_ACCESS ? "access" : "default",
> > > >>>>>>> +-                                       strna(t), path);
> > > >>>>>>> ++                return -log_error_errno(errno,
> > > >>>>>>> ++                                        "Setting %s ACL \"%s\" on %s failed: %m",
> > > >>>>>>> ++                                        type == ACL_TYPE_ACCESS ? "access" : "default",
> > > >>>>>>> ++                                        strna(t), path);
> > > >>>>>>> ++
> > > >>>>>>> +         return 0;
> > > >>>>>>> + }
> > > >>>>>>> + #endif
> > > >>>>>>> +
> > > >>>>>>> + static int path_set_acls(Item *item, const char *path) {
> > > >>>>>>> ++        int r = 0;
> > > >>>>>>> + #ifdef HAVE_ACL
> > > >>>>>>> +-        int r;
> > > >>>>>>> +-
> > > >>>>>>> +         assert(item);
> > > >>>>>>> +         assert(path);
> > > >>>>>>> +
> > > >>>>>>> +-        if (item->acl_access) {
> > > >>>>>>> ++        if (item->acl_access)
> > > >>>>>>> +                 r = path_set_acl(path, ACL_TYPE_ACCESS, item->acl_access, item->force);
> > > >>>>>>> +-                if (r < 0)
> > > >>>>>>> +-                        return r;
> > > >>>>>>> +-        }
> > > >>>>>>> +
> > > >>>>>>> +-        if (item->acl_default) {
> > > >>>>>>> ++        if (r == 0 && item->acl_default)
> > > >>>>>>> +                 r = path_set_acl(path, ACL_TYPE_DEFAULT, item->acl_default, item->force);
> > > >>>>>>> +-                if (r < 0)
> > > >>>>>>> +-                        return r;
> > > >>>>>>> +-        }
> > > >>>>>>> +-#endif
> > > >>>>>>> +
> > > >>>>>>> +-        return 0;
> > > >>>>>>> ++        if (r > 0)
> > > >>>>>>> ++                return -r; /* already warned */
> > > >>>>>>> ++        else if (r == -ENOTSUP) {
> > > >>>>>>> ++                log_debug_errno(r, "ACLs not supported by file system at %s", path);
> > > >>>>>>> ++                return 0;
> > > >>>>>>> ++        } else if (r < 0)
> > > >>>>>>> ++                log_error_errno(r, "ACL operation on \"%s\" failed: %m", path);
> > > >>>>>>> ++#endif
> > > >>>>>>> ++        return r;
> > > >>>>>>> + }
> > > >>>>>>> +
> > > >>>>>>> + static int write_one_file(Item *i, const char *path) {
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> > > >>>>>>> new file mode 100644
> > > >>>>>>> index 0000000..a49a369
> > > >>>>>>> --- /dev/null
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd/0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch
> > > >>>>>>> @@ -0,0 +1,30 @@
> > > >>>>>>> +From 0436d5c5f4b39ba8177437fa92f082f8ef1830fb Mon Sep 17 00:00:00 2001
> > > >>>>>>> +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
> > > >>>>>>> +Date: Tue, 3 Mar 2015 19:07:28 -0500
> > > >>>>>>> +Subject: [PATCH 26/26] shared/util: assume ac when /sys/class/power_supply is
> > > >>>>>>> + missing
> > > >>>>>>> +
> > > >>>>>>> +On s390 (at least) /sys/class/power_supply is not present. We should
> > > >>>>>>> +treat this like if this directory was empty, and not an error.
> > > >>>>>>> +
> > > >>>>>>> +(cherry picked from commit 6d89003462484c8656b698e07b9cf0a337e3818e)
> > > >>>>>>> +---
> > > >>>>>>> + src/shared/util.c | 2 +-
> > > >>>>>>> + 1 file changed, 1 insertion(+), 1 deletion(-)
> > > >>>>>>> +
> > > >>>>>>> +diff --git a/src/shared/util.c b/src/shared/util.c
> > > >>>>>>> +index f24b5b4..8548723 100644
> > > >>>>>>> +--- a/src/shared/util.c
> > > >>>>>>> ++++ b/src/shared/util.c
> > > >>>>>>> +@@ -5994,7 +5994,7 @@ int on_ac_power(void) {
> > > >>>>>>> +
> > > >>>>>>> +         d = opendir("/sys/class/power_supply");
> > > >>>>>>> +         if (!d)
> > > >>>>>>> +-                return -errno;
> > > >>>>>>> ++                return errno == ENOENT ? true : -errno;
> > > >>>>>>> +
> > > >>>>>>> +         for (;;) {
> > > >>>>>>> +                 struct dirent *de;
> > > >>>>>>> +--
> > > >>>>>>> +1.9.1
> > > >>>>>>> +
> > > >>>>>>> diff --git a/meta/recipes-core/systemd/systemd_219.bb b/meta/recipes-core/systemd/systemd_219.bb
> > > >>>>>>> index 73b930e..9c20b11 100644
> > > >>>>>>> --- a/meta/recipes-core/systemd/systemd_219.bb
> > > >>>>>>> +++ b/meta/recipes-core/systemd/systemd_219.bb
> > > >>>>>>> @@ -40,10 +40,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> > > >>>>>>>           file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \
> > > >>>>>>>           file://0010-Make-root-s-home-directory-configurable.patch \
> > > >>>>>>>           file://0011-systemd-user-avoid-using-system-auth.patch \
> > > >>>>>>> -           file://0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> > > >>>>>>> -           file://0002-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> > > >>>>>>>           file://0012-systemd-tmpfiles.c-Honor-ordering-within-files-as-th.patch \
> > > >>>>>>> -           file://0013-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> > > >>>>>>>           file://0014-Revert-rules-remove-firmware-loading-rules.patch \
> > > >>>>>>>           file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
> > > >>>>>>>           file://tmpfiles-pam.patch \
> > > >>>>>>> @@ -55,6 +52,36 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master \
> > > >>>>>>> 
> > > >>>>>>> S = "${WORKDIR}/git"
> > > >>>>>>> 
> > > >>>>>>> +# Appending backport fixes released for version 219-stable
> > > >>>>>>> +SRC_URI_append = "\
> > > >>>>>>> +           file://0001-journal-remote-fix-certificate-status-memory-leak.patch \
> > > >>>>>>> +           file://0002-journal-remote-fix-client_cert-memory-leak.patch \
> > > >>>>>>> +           file://0003-tmpfiles-Fix-parse_acl-error-message.patch \
> > > >>>>>>> +           file://0004-test-utf8-fix-utf16-tests-on-BE-machines.patch \
> > > >>>>>>> +           file://0005-tmpfiles-avoid-creating-duplicate-acl-entries.patch \
> > > >>>>>>> +           file://0006-shared-time-util-fix-gcc5-warning.patch \
> > > >>>>>>> +           file://0007-test-time-test-infinity-parsing-in-nanoseconds.patch \
> > > >>>>>>> +           file://0008-bootchart-fix-default-init-path.patch \
> > > >>>>>>> +           file://0009-systemctl-bump-NOFILE-only-for-systemctl_main.patch \
> > > >>>>>>> +           file://0010-acl-util-avoid-freeing-uninitialized-pointer.patch \
> > > >>>>>>> +           file://0011-bootchart-svg-fix-checking-of-list-end.patch \
> > > >>>>>>> +           file://0012-systemd-add-getrandom-syscall-numbers-for-MIPS.patch \
> > > >>>>>>> +           file://0013-unit-use-weaker-dependencies-between-mount-and-devic.patch \
> > > >>>>>>> +           file://0014-unit-When-stopping-due-to-BindsTo-log-which-unit-cau.patch \
> > > >>>>>>> +           file://0015-sysctl-downgrade-message-about-sysctl-overrides-to-d.patch \
> > > >>>>>>> +           file://0016-sysctl-add-some-hints-how-to-override-settings.patch \
> > > >>>>>>> +           file://0017-core-rework-device-state-logic.patch \
> > > >>>>>>> +           file://0018-core-fix-return-value-on-OOM.patch \
> > > >>>>>>> +           file://0019-machined-use-x-machine-unix-prefix-for-the-container.patch \
> > > >>>>>>> +           file://0020-shared-AFS-is-also-a-network-filesystem.patch \
> > > >>>>>>> +           file://0021-core-downgrade-unit-type-not-supported-message.patch \
> > > >>>>>>> +           file://0022-journal-remote-fix-saving-of-binary-fields.patch \
> > > >>>>>>> +           file://0023-journal-fix-Inappropriate-ioctl-for-device-on-ext4.patch \
> > > >>>>>>> +           file://0024-sd-daemon-replace-VLA-with-alloca-to-make-llvm-happy.patch \
> > > >>>>>>> +           file://0025-tmpfiles-quietly-ignore-ACLs-on-unsupported-filesyst.patch \
> > > >>>>>>> +           file://0026-shared-util-assume-ac-when-sys-class-power_supply-is.patch \
> > > >>>>>>> +           "
> > > >>>>>>> +
> > > >>>>>>> SRC_URI_append_libc-uclibc = "\
> > > >>>>>>>            file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
> > > >>>>>>>           "
> > > >>>>>>> --
> > > >>>>>>> 1.9.1
> > > >>>>>>> 
> > > >>>>>> 
> > > >>>>>> 
> > > >>>>>> --
> > > >>>>>> _______________________________________________
> > > >>>>>> Openembedded-core mailing list
> > > >>>>>> Openembedded-core@lists.openembedded.org
> > > >>>>>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
> > > >>>>> 
> > > >>>>> 
> > > >>>>> 
> > > >>>> 
> > > >>>> 
> > > >>> 
> > > >> 
> > > >> 
> > > > 
> > > > 
> > > 
> > 
> > 
> 
> 




^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2015-04-15 13:23 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-30 18:13 [PATCH] systemd: v219 with stable fixes Bruno Bottazzini
2015-03-30 18:20 ` Bottazzini, Bruno
2015-03-31 20:21 ` Bottazzini, Bruno
2015-03-31 20:25   ` Otavio Salvador
2015-04-01 21:08     ` Bottazzini, Bruno
2015-04-01 21:14       ` Khem Raj
2015-04-01 21:16         ` Bottazzini, Bruno
2015-04-07 13:10           ` Bottazzini, Bruno
2015-04-07 19:33             ` Khem Raj
2015-04-09 12:57               ` Bottazzini, Bruno
2015-04-13 21:21                 ` Bottazzini, Bruno
2015-04-15 13:23                   ` Bottazzini, Bruno

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.