systemd/0140-nspawn-fix-invocation-...

54 lines
2.2 KiB
Diff

From 98963dfd60e4ae11cd4537e38cb6976da95abc9e Mon Sep 17 00:00:00 2001
From: Ken Werner <ken@linux.vnet.ibm.com>
Date: Tue, 16 Dec 2014 18:06:41 +0100
Subject: [PATCH] nspawn: fix invocation of the raw clone() system call on s390
and cris
Since the order of the first and second arguments of the raw clone() system
call is reversed on s390 and cris it needs to be invoked differently.
(cherry picked from commit 60e1651a31c9c0ed1caef1a63f5e3a87156b0b1e)
Conflicts:
src/shared/missing.h
---
src/nspawn/nspawn.c | 6 +++---
src/shared/missing.h | 10 ++++++++++
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
index 27e533cd9b..ef6cf20e64 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -3187,9 +3187,9 @@ int main(int argc, char *argv[]) {
goto finish;
}
- pid = syscall(__NR_clone, SIGCHLD|CLONE_NEWNS|
- (arg_share_system ? 0 : CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWUTS)|
- (arg_private_network ? CLONE_NEWNET : 0), NULL);
+ pid = raw_clone(SIGCHLD|CLONE_NEWNS|
+ (arg_share_system ? 0 : CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWUTS)|
+ (arg_private_network ? CLONE_NEWNET : 0), NULL);
if (pid < 0) {
if (errno == EINVAL)
log_error("clone() failed, do you have namespace support enabled in your kernel? (You need UTS, IPC, PID and NET namespacing built in): %m");
diff --git a/src/shared/missing.h b/src/shared/missing.h
index c98d0273a3..f6b78cae92 100644
--- a/src/shared/missing.h
+++ b/src/shared/missing.h
@@ -595,3 +595,13 @@ static inline int setns(int fd, int nstype) {
#ifndef LOOPBACK_IFINDEX
#define LOOPBACK_IFINDEX 1
#endif
+
+static inline long raw_clone(unsigned long flags, void *child_stack) {
+#if defined(__s390__) || defined(__CRIS__)
+ /* On s390 and cris the order of the first and second arguments
+ * of the raw clone() system call is reversed. */
+ return syscall(__NR_clone, child_stack, flags);
+#else
+ return syscall(__NR_clone, flags, child_stack);
+#endif
+}