From 2ec3b0659d6a1fe55f1306cd69379522c2476459 Mon Sep 17 00:00:00 2001 From: Jan Synacek Date: Dec 10 2015 12:47:25 +0000 Subject: Fix rawhide build failures on ppc64 (#1286249) --- diff --git a/0001-tests-turn-check-if-manager-cannot-be-intialized-int.patch b/0001-tests-turn-check-if-manager-cannot-be-intialized-int.patch new file mode 100644 index 0000000..3e119a1 --- /dev/null +++ b/0001-tests-turn-check-if-manager-cannot-be-intialized-int.patch @@ -0,0 +1,166 @@ +From 32a4ce451c3aa579d768005decd5342ba319a0e7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= +Date: Tue, 1 Dec 2015 22:35:16 -0500 +Subject: [PATCH 1/4] tests: turn check if manager cannot be intialized into + macro + +We need to check the same thing in multiple tests. Use a shared +macro to make it easier to update the list of errnos. + +Change the errno code for "unitialized cgroup fs" for ENOMEDIUM. +Exec format error looks like something more serious. + +This fixes test-execute invocation in mock. + +(cherry picked from commit 8b3aa503c171acdb9ec63484a8c50e2680d31e79) + +Resolves: #1286249 +--- + src/basic/cgroup-util.c | 2 +- + src/libsystemd/sd-bus/test-bus-creds.c | 2 +- + src/test/test-engine.c | 3 ++- + src/test/test-execute.c | 3 ++- + src/test/test-helper.h | 12 ++++++++++++ + src/test/test-path.c | 3 ++- + src/test/test-sched-prio.c | 3 ++- + 7 files changed, 22 insertions(+), 6 deletions(-) + +diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c +index f7fc2c2..263c726 100644 +--- a/src/basic/cgroup-util.c ++++ b/src/basic/cgroup-util.c +@@ -2130,7 +2130,7 @@ int cg_unified(void) { + else if (F_TYPE_EQUAL(fs.f_type, TMPFS_MAGIC)) + unified_cache = false; + else +- return -ENOEXEC; ++ return -ENOMEDIUM; + + return unified_cache; + } +diff --git a/src/libsystemd/sd-bus/test-bus-creds.c b/src/libsystemd/sd-bus/test-bus-creds.c +index bd0101a..de337bb 100644 +--- a/src/libsystemd/sd-bus/test-bus-creds.c ++++ b/src/libsystemd/sd-bus/test-bus-creds.c +@@ -29,7 +29,7 @@ int main(int argc, char *argv[]) { + _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; + int r; + +- if (cg_unified() == -ENOEXEC) { ++ if (cg_unified() == -ENOMEDIUM) { + puts("Skipping test: /sys/fs/cgroup/ not available"); + return EXIT_TEST_SKIP; + } +diff --git a/src/test/test-engine.c b/src/test/test-engine.c +index 4f14c58..f09df43 100644 +--- a/src/test/test-engine.c ++++ b/src/test/test-engine.c +@@ -25,6 +25,7 @@ + + #include "bus-util.h" + #include "manager.h" ++#include "test-helper.h" + + int main(int argc, char *argv[]) { + _cleanup_bus_error_free_ sd_bus_error err = SD_BUS_ERROR_NULL; +@@ -38,7 +39,7 @@ int main(int argc, char *argv[]) { + /* prepare the test */ + assert_se(set_unit_path(TEST_DIR) >= 0); + r = manager_new(MANAGER_USER, true, &m); +- if (IN_SET(r, -EPERM, -EACCES, -EADDRINUSE, -EHOSTDOWN, -ENOENT, -ENOEXEC)) { ++ if (MANAGER_SKIP_TEST(r)) { + printf("Skipping test: manager_new: %s", strerror(-r)); + return EXIT_TEST_SKIP; + } +diff --git a/src/test/test-execute.c b/src/test/test-execute.c +index 03ec0fc..1ab10fb 100644 +--- a/src/test/test-execute.c ++++ b/src/test/test-execute.c +@@ -29,6 +29,7 @@ + #include "mkdir.h" + #include "path-util.h" + #include "rm-rf.h" ++#include "test-helper.h" + #include "unit.h" + #include "util.h" + +@@ -296,7 +297,7 @@ int main(int argc, char *argv[]) { + assert_se(unsetenv("VAR3") == 0); + + r = manager_new(MANAGER_USER, true, &m); +- if (IN_SET(r, -EPERM, -EACCES, -EADDRINUSE, -EHOSTDOWN, -ENOENT)) { ++ if (MANAGER_SKIP_TEST(r)) { + printf("Skipping test: manager_new: %s", strerror(-r)); + return EXIT_TEST_SKIP; + } +diff --git a/src/test/test-helper.h b/src/test/test-helper.h +index f75dd33..c0f6a91 100644 +--- a/src/test/test-helper.h ++++ b/src/test/test-helper.h +@@ -23,9 +23,21 @@ + + #include "sd-daemon.h" + ++#include "macro.h" ++ + #define TEST_REQ_RUNNING_SYSTEMD(x) \ + if (sd_booted() > 0) { \ + x; \ + } else { \ + printf("systemd not booted skipping '%s'\n", #x); \ + } ++ ++#define MANAGER_SKIP_TEST(r) \ ++ IN_SET(r, \ ++ -EPERM, \ ++ -EACCES, \ ++ -EADDRINUSE, \ ++ -EHOSTDOWN, \ ++ -ENOENT, \ ++ -ENOMEDIUM /* cannot determine cgroup */ \ ++ ) +diff --git a/src/test/test-path.c b/src/test/test-path.c +index 8302bdd..6e6a72d 100644 +--- a/src/test/test-path.c ++++ b/src/test/test-path.c +@@ -29,6 +29,7 @@ + #include "rm-rf.h" + #include "string-util.h" + #include "strv.h" ++#include "test-helper.h" + #include "unit.h" + #include "util.h" + +@@ -44,7 +45,7 @@ static int setup_test(Manager **m) { + assert_se(m); + + r = manager_new(MANAGER_USER, true, &tmp); +- if (IN_SET(r, -EPERM, -EACCES, -EADDRINUSE, -EHOSTDOWN, -ENOENT, -ENOEXEC)) { ++ if (MANAGER_SKIP_TEST(r)) { + printf("Skipping test: manager_new: %s", strerror(-r)); + return -EXIT_TEST_SKIP; + } +diff --git a/src/test/test-sched-prio.c b/src/test/test-sched-prio.c +index 8396ae6..7958a6c 100644 +--- a/src/test/test-sched-prio.c ++++ b/src/test/test-sched-prio.c +@@ -23,6 +23,7 @@ + + #include "macro.h" + #include "manager.h" ++#include "test-helper.h" + + int main(int argc, char *argv[]) { + Manager *m = NULL; +@@ -35,7 +36,7 @@ int main(int argc, char *argv[]) { + /* prepare the test */ + assert_se(set_unit_path(TEST_DIR) >= 0); + r = manager_new(MANAGER_USER, true, &m); +- if (IN_SET(r, -EPERM, -EACCES, -EADDRINUSE, -EHOSTDOWN, -ENOENT, -ENOEXEC)) { ++ if (MANAGER_SKIP_TEST(r)) { + printf("Skipping test: manager_new: %s", strerror(-r)); + return EXIT_TEST_SKIP; + } +-- +2.5.0 + diff --git a/0002-lz4-fix-size-check-which-had-no-chance-of-working-on.patch b/0002-lz4-fix-size-check-which-had-no-chance-of-working-on.patch new file mode 100644 index 0000000..4003caa --- /dev/null +++ b/0002-lz4-fix-size-check-which-had-no-chance-of-working-on.patch @@ -0,0 +1,29 @@ +From 274e72394432cc35af5c9e7b91e49f3dc5180243 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= +Date: Tue, 1 Dec 2015 22:53:23 -0500 +Subject: [PATCH 2/4] lz4: fix size check which had no chance of working on + big-endian + +(cherry picked from commit b3aa622929f81b44974d182636b1fde8b2a506e5) + +Resolves: #1286249 +--- + src/journal/compress.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/journal/compress.c b/src/journal/compress.c +index e1ca0a8..1a3d2cd 100644 +--- a/src/journal/compress.c ++++ b/src/journal/compress.c +@@ -201,7 +201,7 @@ int decompress_blob_lz4(const void *src, uint64_t src_size, + return -EBADMSG; + + size = le64toh( *(le64_t*)src ); +- if (size < 0 || (le64_t) size != *(le64_t*)src) ++ if (size < 0 || (unsigned) size != le64toh(*(le64_t*)src)) + return -EFBIG; + if ((size_t) size > *dst_alloc_size) { + out = realloc(*dst, size); +-- +2.5.0 + diff --git a/0003-tests-fix-newlines-in-skip-message.patch b/0003-tests-fix-newlines-in-skip-message.patch new file mode 100644 index 0000000..ccad3dd --- /dev/null +++ b/0003-tests-fix-newlines-in-skip-message.patch @@ -0,0 +1,70 @@ +From 98628af16f2ec4f7fbaa9bc23ae8606fc9adcc1c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= +Date: Tue, 1 Dec 2015 23:44:27 -0500 +Subject: [PATCH 3/4] tests: fix newlines in skip message + +(cherry picked from commit 1d31abf7920460f3c9bb9744a255e0e518dce00d) + +Resolves: #1286249 +--- + src/test/test-engine.c | 2 +- + src/test/test-execute.c | 2 +- + src/test/test-path.c | 2 +- + src/test/test-sched-prio.c | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/test/test-engine.c b/src/test/test-engine.c +index f09df43..e3ded1b 100644 +--- a/src/test/test-engine.c ++++ b/src/test/test-engine.c +@@ -40,7 +40,7 @@ int main(int argc, char *argv[]) { + assert_se(set_unit_path(TEST_DIR) >= 0); + r = manager_new(MANAGER_USER, true, &m); + if (MANAGER_SKIP_TEST(r)) { +- printf("Skipping test: manager_new: %s", strerror(-r)); ++ printf("Skipping test: manager_new: %s\n", strerror(-r)); + return EXIT_TEST_SKIP; + } + assert_se(r >= 0); +diff --git a/src/test/test-execute.c b/src/test/test-execute.c +index 1ab10fb..753afad 100644 +--- a/src/test/test-execute.c ++++ b/src/test/test-execute.c +@@ -298,7 +298,7 @@ int main(int argc, char *argv[]) { + + r = manager_new(MANAGER_USER, true, &m); + if (MANAGER_SKIP_TEST(r)) { +- printf("Skipping test: manager_new: %s", strerror(-r)); ++ printf("Skipping test: manager_new: %s\n", strerror(-r)); + return EXIT_TEST_SKIP; + } + assert_se(r >= 0); +diff --git a/src/test/test-path.c b/src/test/test-path.c +index 6e6a72d..7a3b145 100644 +--- a/src/test/test-path.c ++++ b/src/test/test-path.c +@@ -46,7 +46,7 @@ static int setup_test(Manager **m) { + + r = manager_new(MANAGER_USER, true, &tmp); + if (MANAGER_SKIP_TEST(r)) { +- printf("Skipping test: manager_new: %s", strerror(-r)); ++ printf("Skipping test: manager_new: %s\n", strerror(-r)); + return -EXIT_TEST_SKIP; + } + assert_se(r >= 0); +diff --git a/src/test/test-sched-prio.c b/src/test/test-sched-prio.c +index 7958a6c..60b5160 100644 +--- a/src/test/test-sched-prio.c ++++ b/src/test/test-sched-prio.c +@@ -37,7 +37,7 @@ int main(int argc, char *argv[]) { + assert_se(set_unit_path(TEST_DIR) >= 0); + r = manager_new(MANAGER_USER, true, &m); + if (MANAGER_SKIP_TEST(r)) { +- printf("Skipping test: manager_new: %s", strerror(-r)); ++ printf("Skipping test: manager_new: %s\n", strerror(-r)); + return EXIT_TEST_SKIP; + } + assert_se(r >= 0); +-- +2.5.0 + diff --git a/0004-core-Do-not-bind-a-mount-unit-to-a-device-if-it-was-.patch b/0004-core-Do-not-bind-a-mount-unit-to-a-device-if-it-was-.patch new file mode 100644 index 0000000..d83135c --- /dev/null +++ b/0004-core-Do-not-bind-a-mount-unit-to-a-device-if-it-was-.patch @@ -0,0 +1,135 @@ +From a5866298597e2fd460c47d9fda7cceacbe9f3fcb Mon Sep 17 00:00:00 2001 +From: Harald Hoyer +Date: Tue, 24 Nov 2015 09:41:26 +0100 +Subject: [PATCH 4/4] core: Do not bind a mount unit to a device, if it was + from mountinfo + +If a mount unit is bound to a device, systemd tries to umount the +mount point, if it thinks the device has gone away. + +Due to the uevent queue and inotify of /proc/self/mountinfo being two +different sources, systemd can never get the ordering reliably correct. + +It can happen, that in the uevent queue ADD,REMOVE,ADD is queued +and an inotify of mountinfo (or libmount event) happend with the +device in question. + +systemd cannot know, at which point of time the mount happend in the +ADD,REMOVE,ADD sequence. + +The real ordering might have been ADD,REMOVE,ADD,mount +and systemd might think ADD,mount,REMOVE,ADD and would umount the +mountpoint. + +A test script which triggered this behaviour is: +rm -f test-efi-disk.img +dd if=/dev/null of=test-efi-disk.img bs=1M seek=512 count=1 +parted --script test-efi-disk.img \ + "mklabel gpt" \ + "mkpart ESP fat32 1MiB 511MiB" \ + "set 1 boot on" +LOOP=$(losetup --show -f -P test-efi-disk.img) +udevadm settle +mkfs.vfat -F32 ${LOOP}p1 +mkdir -p mnt +mount ${LOOP}p1 mnt +... + +Without the "udevadm settle" systemd unmounted mnt while the script was +operating on mnt. + +Of course the question is, why there was a REMOVE in the first place, +but this is not part of this patch. + +(cherry picked from commit 9d06297e262966de71095debd1537fc223f940a3) + +Note: I'm adding a Related note, but I'm not entirely sure if it really is... + +Related: #1195761 +--- + src/core/mount.c | 2 +- + src/core/socket.c | 2 +- + src/core/swap.c | 2 +- + src/core/unit.c | 6 ++++-- + src/core/unit.h | 2 +- + 5 files changed, 8 insertions(+), 6 deletions(-) + +diff --git a/src/core/mount.c b/src/core/mount.c +index 9b44357..2ad4ad4 100644 +--- a/src/core/mount.c ++++ b/src/core/mount.c +@@ -335,7 +335,7 @@ static int mount_add_device_links(Mount *m) { + if (mount_is_auto(p) && UNIT(m)->manager->running_as == MANAGER_SYSTEM) + device_wants_mount = true; + +- r = unit_add_node_link(UNIT(m), p->what, device_wants_mount); ++ r = unit_add_node_link(UNIT(m), p->what, device_wants_mount, m->from_fragment ? UNIT_BINDS_TO : UNIT_REQUIRES); + if (r < 0) + return r; + +diff --git a/src/core/socket.c b/src/core/socket.c +index 687675b..860a1e3 100644 +--- a/src/core/socket.c ++++ b/src/core/socket.c +@@ -289,7 +289,7 @@ static int socket_add_device_link(Socket *s) { + return 0; + + t = strjoina("/sys/subsystem/net/devices/", s->bind_to_device); +- return unit_add_node_link(UNIT(s), t, false); ++ return unit_add_node_link(UNIT(s), t, false, UNIT_BINDS_TO); + } + + static int socket_add_default_dependencies(Socket *s) { +diff --git a/src/core/swap.c b/src/core/swap.c +index b6e4372..5568898 100644 +--- a/src/core/swap.c ++++ b/src/core/swap.c +@@ -202,7 +202,7 @@ static int swap_add_device_links(Swap *s) { + return 0; + + if (is_device_path(s->what)) +- return unit_add_node_link(UNIT(s), s->what, UNIT(s)->manager->running_as == MANAGER_SYSTEM); ++ return unit_add_node_link(UNIT(s), s->what, UNIT(s)->manager->running_as == MANAGER_SYSTEM, UNIT_BINDS_TO); + else + /* File based swap devices need to be ordered after + * systemd-remount-fs.service, since they might need a +diff --git a/src/core/unit.c b/src/core/unit.c +index 0a02e38..e6e67d2 100644 +--- a/src/core/unit.c ++++ b/src/core/unit.c +@@ -2840,7 +2840,7 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) { + } + } + +-int unit_add_node_link(Unit *u, const char *what, bool wants) { ++int unit_add_node_link(Unit *u, const char *what, bool wants, UnitDependency dep) { + Unit *device; + _cleanup_free_ char *e = NULL; + int r; +@@ -2867,7 +2867,9 @@ 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, u->manager->running_as == MANAGER_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true); ++ r = unit_add_two_dependencies(u, UNIT_AFTER, ++ u->manager->running_as == MANAGER_SYSTEM ? dep : UNIT_WANTS, ++ device, true); + if (r < 0) + return r; + +diff --git a/src/core/unit.h b/src/core/unit.h +index 1681bbf..3eb3484 100644 +--- a/src/core/unit.h ++++ b/src/core/unit.h +@@ -528,7 +528,7 @@ int unit_serialize_item_escaped(Unit *u, FILE *f, const char *key, const char *v + int unit_serialize_item_fd(Unit *u, FILE *f, FDSet *fds, const char *key, int fd); + void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_(4,5); + +-int unit_add_node_link(Unit *u, const char *what, bool wants); ++int unit_add_node_link(Unit *u, const char *what, bool wants, UnitDependency d); + + int unit_coldplug(Unit *u); + +-- +2.5.0 + diff --git a/systemd.spec b/systemd.spec index 4577ec3..6f57f00 100644 --- a/systemd.spec +++ b/systemd.spec @@ -34,6 +34,11 @@ Source7: systemd-journal-remote.xml Source8: systemd-journal-gatewayd.xml Source9: 20-yama-ptrace.conf +Patch0001: 0001-tests-turn-check-if-manager-cannot-be-intialized-int.patch +Patch0002: 0002-lz4-fix-size-check-which-had-no-chance-of-working-on.patch +Patch0003: 0003-tests-fix-newlines-in-skip-message.patch +Patch0004: 0004-core-Do-not-bind-a-mount-unit-to-a-device-if-it-was-.patch + # kernel-install patch for grubby, drop if grubby is obsolete Patch1000: kernel-install-grubby.patch @@ -802,6 +807,9 @@ getent passwd systemd-journal-upload >/dev/null 2>&1 || useradd -r -l -g systemd /usr/lib/firewalld/services/* %changelog +* Thu Dec 10 2015 Jan Synáček - 228-6.gite35a787 +- Fix rawhide build failures on ppc64 (#1286249) + * Sun Nov 29 2015 Zbigniew Jędrzejewski-Szmek - 228-6.gite35a787 - Create /etc/systemd/network (#1286397)