[systemd-devel] [PATCH] nspawn: fix invocation of the raw clone() system call on s390 and cris

Ken Werner ken at linux.vnet.ibm.com
Tue Dec 16 09:06:41 PST 2014


From: Ken Werner <ken at linux.vnet.ibm.com>

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.

Signed-off-by: Ken Werner <ken at linux.vnet.ibm.com>
---
 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 9ca53cd..a13c1fc 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -3133,9 +3133,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)
                                 r = log_error_errno(errno, "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 c547479..bea1254 100644
--- a/src/shared/missing.h
+++ b/src/shared/missing.h
@@ -635,3 +635,13 @@ static inline int setns(int fd, int nstype) {
 #ifndef CAP_AUDIT_READ
 #define CAP_AUDIT_READ 37
 #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
+}
-- 
1.7.1



More information about the systemd-devel mailing list