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.
This commit is contained in:
Ken Werner 2014-12-16 18:06:41 +01:00 committed by Zbigniew Jędrzejewski-Szmek
parent ef686ae230
commit 60e1651a31
2 changed files with 13 additions and 3 deletions

View File

@ -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");

View File

@ -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
}