Add new 0x00020303 API, using pid namespaces.
authorDaniel Hokka Zakrisson <daniel@hozac.com>
Mon, 14 Jul 2008 20:09:00 +0000 (20:09 +0000)
committerDaniel Hokka Zakrisson <daniel@hozac.com>
Mon, 14 Jul 2008 20:09:00 +0000 (20:09 +0000)
git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@2744 94cd875c-1c1d-0410-91d2-eb244daf1a30

14 files changed:
kernel/context_cmd.h
kernel/space_cmd.h
lib/Makefile-files
lib/syscall_ctxcreate-v21.hc
lib/syscall_ctxcreate-v23.hc [new file with mode: 0644]
lib/syscall_ctxcreate.c
lib/syscall_ctxmigrate-v21.hc
lib/syscall_ctxmigrate-v23.hc [new file with mode: 0644]
lib/syscall_ctxmigrate.c
lib/syscall_getspacedefault-v23.hc [new file with mode: 0644]
lib/syscall_getspacedefault.c [new file with mode: 0644]
lib/vserver-internal.h
lib/vserver.h
scripts/vserver.functions

index d1ec86b..7b4f2ae 100644 (file)
@@ -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;
index 811b451..17dcac7 100644 (file)
@@ -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;
index 28ea6ab..660d467 100644 (file)
@@ -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 \
index 20e7462..3fb2f56 100644 (file)
@@ -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 (file)
index 0000000..97aded8
--- /dev/null
@@ -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 <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;
+}
index 541213e..cb42c74 100644 (file)
 #  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
index 86100a8..733987e 100644 (file)
@@ -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 (file)
index 0000000..a53462f
--- /dev/null
@@ -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 <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;
+}
index a60b7c8..011d014 100644 (file)
 #  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 (file)
index 0000000..766a5e6
--- /dev/null
@@ -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 <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);
+}
diff --git a/lib/syscall_getspacedefault.c b/lib/syscall_getspacedefault.c
new file mode 100644 (file)
index 0000000..925404f
--- /dev/null
@@ -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 <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
index e1cd60c..c42010b 100644 (file)
@@ -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
index 60b104c..9de2fc0 100644 (file)
@@ -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 */
index db64fec..238c4b8 100644 (file)
@@ -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 || {