| From 6ae61e265d8becff0960c0911e8bd37b0df42386 Mon Sep 17 00:00:00 2001 |
| From: Fedora systemd team <systemd-maint@redhat.com> |
| Date: Thu, 18 Dec 2014 15:21:22 +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 60e1651a31c9c0ed1caef1a63f5e3a87156b0b1e) |
| |
| 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 0466ddb..2f57e65 100644 |
| |
| |
| @@ -2982,9 +2982,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_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 478988c..8ea3807 100644 |
| |
| |
| @@ -631,3 +631,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 |
| +} |
| -- |
| 2.2.0 |
| |