From: Daniel Hokka Zakrisson Date: Mon, 14 Jul 2008 20:09:00 +0000 (+0000) Subject: Add new 0x00020303 API, using pid namespaces. X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05f8e8a30aa7c113890e3d28341a010c0f994dac;p=util-vserver.git Add new 0x00020303 API, using pid namespaces. git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@2744 94cd875c-1c1d-0410-91d2-eb244daf1a30 --- diff --git a/kernel/context_cmd.h b/kernel/context_cmd.h index d1ec86b..7b4f2ae 100644 --- a/kernel/context_cmd.h +++ b/kernel/context_cmd.h @@ -28,14 +28,16 @@ struct vcmd_ctx_stat_v0 { /* context commands */ #define VCMD_ctx_create_v0 VC_CMD(VPROC, 1, 0) -#define VCMD_ctx_create VC_CMD(VPROC, 1, 1) +#define VCMD_ctx_create_v1 VC_CMD(VPROC, 1, 1) +#define VCMD_ctx_create VC_CMD(VPROC, 1, 2) struct vcmd_ctx_create { uint64_t flagword; }; #define VCMD_ctx_migrate_v0 VC_CMD(PROCMIG, 1, 0) -#define VCMD_ctx_migrate VC_CMD(PROCMIG, 1, 1) +#define VCMD_ctx_migrate_v1 VC_CMD(PROCMIG, 1, 1) +#define VCMD_ctx_migrate VC_CMD(PROCMIG, 1, 2) struct vcmd_ctx_migrate { uint64_t flagword; diff --git a/kernel/space_cmd.h b/kernel/space_cmd.h index 811b451..17dcac7 100644 --- a/kernel/space_cmd.h +++ b/kernel/space_cmd.h @@ -13,6 +13,8 @@ #define VCMD_get_space_mask VC_CMD(PROCALT, 4, 0) +#define VCMD_get_space_default VC_CMD(PROCALT, 7, 0) + struct vcmd_space_mask { uint64_t mask; diff --git a/lib/Makefile-files b/lib/Makefile-files index 28ea6ab..660d467 100644 --- a/lib/Makefile-files +++ b/lib/Makefile-files @@ -157,7 +157,11 @@ lib_v23_SRCS = lib/syscall_tagmigrate-v23.hc \ lib/syscall_getbadness.c \ lib/syscall_getbadness-v23.hc \ lib/syscall_setbadness.c \ - lib/syscall_setbadness-v23.hc + lib/syscall_setbadness-v23.hc \ + lib/syscall_ctxcreate-v23.hc \ + lib/syscall_ctxmigrate-v23.hc \ + lib/syscall_getspacedefault.c \ + lib/syscall_getspacedefault-v23.hc if ENSC_HAVE_C99_COMPILER lib_v13_SRCS += lib/syscall_adddlimit-v13.hc \ diff --git a/lib/syscall_ctxcreate-v21.hc b/lib/syscall_ctxcreate-v21.hc index 20e7462..3fb2f56 100644 --- a/lib/syscall_ctxcreate-v21.hc +++ b/lib/syscall_ctxcreate-v21.hc @@ -33,7 +33,7 @@ vc_ctx_create_v21(xid_t xid, struct vc_ctx_flags *flags) if (flags) data.flagword = flags->flagword & flags->mask; - res = vserver(VCMD_ctx_create, CTX_USER2KERNEL(xid), &data); + res = vserver(VCMD_ctx_create_v1, CTX_USER2KERNEL(xid), &data); res = CTX_KERNEL2USER(res); if (res != VC_NOCTX) { diff --git a/lib/syscall_ctxcreate-v23.hc b/lib/syscall_ctxcreate-v23.hc new file mode 100644 index 0000000..97aded8 --- /dev/null +++ b/lib/syscall_ctxcreate-v23.hc @@ -0,0 +1,53 @@ +// $Id$ --*- c -*-- + +// Copyright (C) 2008 Daniel Hokka Zakrisson +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +#ifdef HAVE_CONFIG_H +# include +#endif +#include +#include + +static inline ALWAYSINLINE xid_t +vc_ctx_create_v23(xid_t xid, struct vc_ctx_flags *flags) +{ + struct vcmd_ctx_create data = { + .flagword = (VC_VXF_STATE_SETUP | VC_VXF_STATE_ADMIN | + VC_VXF_STATE_INIT) + }; + xid_t res; + pid_t pid; + uint64_t spaces = vc_get_space_default(); + + if (flags) + data.flagword = flags->flagword & flags->mask; + + pid = sys_clone(spaces | SIGCHLD | CLONE_FILES | CLONE_FS, NULL); + if (pid == -1) + return -1; + else if (pid > 0) + vc_exitLikeProcess(pid, 1); + + res = vserver(VCMD_ctx_create, CTX_USER2KERNEL(xid), &data); + res = CTX_KERNEL2USER(res); + + if (res != VC_NOCTX && spaces) { + vc_set_namespace(VC_SAMECTX, spaces); + } + + return res; +} diff --git a/lib/syscall_ctxcreate.c b/lib/syscall_ctxcreate.c index 541213e..cb42c74 100644 --- a/lib/syscall_ctxcreate.c +++ b/lib/syscall_ctxcreate.c @@ -36,11 +36,16 @@ # include "syscall_ctxcreate-v21.hc" #endif +#if defined(VC_ENABLE_API_V23) +# include "syscall_ctxcreate-v23.hc" +#endif + #if defined(VC_ENABLE_API_V13) || defined(VC_ENABLE_API_V21) xid_t vc_ctx_create(xid_t xid, struct vc_ctx_flags *flags) { - CALL_VC(CALL_VC_V21 (vc_ctx_create, xid, flags), + CALL_VC(CALL_VC_V23P(vc_ctx_create, xid, flags), + CALL_VC_V21 (vc_ctx_create, xid, flags), CALL_VC_V13A(vc_ctx_create, xid, flags)); } #endif diff --git a/lib/syscall_ctxmigrate-v21.hc b/lib/syscall_ctxmigrate-v21.hc index 86100a8..733987e 100644 --- a/lib/syscall_ctxmigrate-v21.hc +++ b/lib/syscall_ctxmigrate-v21.hc @@ -34,5 +34,5 @@ vc_ctx_migrate_spaces(xid_t xid, uint_least64_t flags) return ret; } - return vserver(VCMD_ctx_migrate, CTX_USER2KERNEL(xid), &data); + return vserver(VCMD_ctx_migrate_v1, CTX_USER2KERNEL(xid), &data); } diff --git a/lib/syscall_ctxmigrate-v23.hc b/lib/syscall_ctxmigrate-v23.hc new file mode 100644 index 0000000..a53462f --- /dev/null +++ b/lib/syscall_ctxmigrate-v23.hc @@ -0,0 +1,52 @@ +// $Id$ --*- c -*-- + +// Copyright (C) 2008 Daniel Hokka Zakrisson +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +#ifdef HAVE_CONFIG_H +# include +#endif +#include +#include + +static inline ALWAYSINLINE int +vc_ctx_migrate_v23(xid_t xid, uint_least64_t flags) +{ + int ret; + struct vcmd_ctx_migrate data = { .flagword = flags }; + int do_spaces = 0; + + ret = vc_getXIDType(xid); + if (ret == vcTYPE_STATIC || ret == vcTYPE_DYNAMIC) { + do_spaces = 1; + ret = vc_enter_namespace(xid, vc_get_space_default()); + if (ret) + return ret; + } + + ret = vserver(VCMD_ctx_migrate, CTX_USER2KERNEL(xid), &data); + + if (!ret && do_spaces) { + /* Allocate a new pid */ + int pid = sys_clone(SIGCHLD | CLONE_FS | CLONE_FILES, NULL); + if (pid == -1) + return -1; + else if (pid > 0) + vc_exitLikeProcess(pid, 1); + } + + return ret; +} diff --git a/lib/syscall_ctxmigrate.c b/lib/syscall_ctxmigrate.c index a60b7c8..011d014 100644 --- a/lib/syscall_ctxmigrate.c +++ b/lib/syscall_ctxmigrate.c @@ -36,11 +36,16 @@ # include "syscall_ctxmigrate-v21.hc" #endif +#if defined(VC_ENABLE_API_V23) +# include "syscall_ctxmigrate-v23.hc" +#endif + #if defined(VC_ENABLE_API_V13) || defined(VC_ENABLE_API_V21) int vc_ctx_migrate(xid_t xid, uint_least64_t flags) { - CALL_VC(CALL_VC_SPACES(vc_ctx_migrate, xid, flags), + CALL_VC(CALL_VC_V23P (vc_ctx_migrate, xid, flags), + CALL_VC_SPACES(vc_ctx_migrate, xid, flags), CALL_VC_V13A (vc_ctx_migrate, xid)); } #endif diff --git a/lib/syscall_getspacedefault-v23.hc b/lib/syscall_getspacedefault-v23.hc new file mode 100644 index 0000000..766a5e6 --- /dev/null +++ b/lib/syscall_getspacedefault-v23.hc @@ -0,0 +1,31 @@ +// $Id$ --*- c -*-- + +// Copyright (C) 2008 Daniel Hokka Zakrisson +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +#ifdef HAVE_CONFIG_H +# include +#endif + +static inline ALWAYSINLINE uint_least64_t +vc_get_space_default_v23(int UNUSED tmp) +{ + struct vcmd_space_mask data = { .mask = 0 }; + int ret = vserver(VCMD_get_space_default, 0, &data); + if (ret) + return ret; + return data.mask & ~(CLONE_NEWNS|CLONE_FS); +} diff --git a/lib/syscall_getspacedefault.c b/lib/syscall_getspacedefault.c new file mode 100644 index 0000000..925404f --- /dev/null +++ b/lib/syscall_getspacedefault.c @@ -0,0 +1,37 @@ +// $Id$ --*- c -*-- + +// Copyright (C) 2008 Daniel Hokka Zakrisson +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "vserver.h" +#include "vserver-internal.h" +#include "virtual.h" + +#if defined(VC_ENABLE_API_V23) +# include "syscall_getspacedefault-v23.hc" +#endif + +#if defined(VC_ENABLE_API_V23) +uint_least64_t +vc_get_space_default() +{ + CALL_VC(CALL_VC_V23P(vc_get_space_default, 0)); +} +#endif diff --git a/lib/vserver-internal.h b/lib/vserver-internal.h index e1cd60c..c42010b 100644 --- a/lib/vserver-internal.h +++ b/lib/vserver-internal.h @@ -138,6 +138,12 @@ inline static ALWAYSINLINE void vc_noop0() {} # define CALL_VC_V23(F,...) CALL_VC_NOOP #endif +#ifdef VC_ENABLE_API_V23 +# define CALL_VC_V23P(F,...) CALL_VC_GENERAL(0x00020303, v23, F, __VA_ARGS__) +#else +# define CALL_VC_V23P(F,...) CALL_VC_NOOP +#endif + #ifdef VC_ENABLE_API_NET # define CALL_VC_NET(F,...) CALL_VC_GENERAL(0x00010016, net, F, __VA_ARGS__) #else diff --git a/lib/vserver.h b/lib/vserver.h index 60b104c..9de2fc0 100644 --- a/lib/vserver.h +++ b/lib/vserver.h @@ -763,8 +763,9 @@ extern "C" { /* namespace related functions */ int vc_enter_namespace(xid_t xid, uint_least64_t mask); int vc_set_namespace(xid_t xid, uint_least64_t mask); - int vc_cleanup_namespace(); - uint_least64_t vc_get_space_mask(); + int vc_cleanup_namespace(void); + uint_least64_t vc_get_space_mask(void); + uint_least64_t vc_get_space_default(void); /* disk limit related things */ diff --git a/scripts/vserver.functions b/scripts/vserver.functions index db64fec..238c4b8 100644 --- a/scripts/vserver.functions +++ b/scripts/vserver.functions @@ -769,8 +769,7 @@ function _generateSpaceOptions local vdir="$1" local d="$vdir"/spaces - ( test ! -e "$d"/pid && - ! $_VSERVER_INFO PIDSPACE FEATURE ) || \ + ( test ! -e "$d"/pid ) || \ OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --pid ) test ! -e "$d"/net || {