/* 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;
#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;
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 \
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) {
--- /dev/null
+// $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 <config.h>
+#endif
+#include <signal.h>
+#include <lib_internal/sys_clone.h>
+
+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;
+}
# 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
return ret;
}
- return vserver(VCMD_ctx_migrate, CTX_USER2KERNEL(xid), &data);
+ return vserver(VCMD_ctx_migrate_v1, CTX_USER2KERNEL(xid), &data);
}
--- /dev/null
+// $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 <config.h>
+#endif
+#include <signal.h>
+#include <lib_internal/sys_clone.h>
+
+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;
+}
# 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
--- /dev/null
+// $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 <config.h>
+#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);
+}
--- /dev/null
+// $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 <config.h>
+#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
# 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
/* 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 */
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 || {