[Devel] [RFC v14-rc3][PATCH 36/36] Stub implementation of IPC namespace c/r

Oren Laadan orenl at cs.columbia.edu
Tue Apr 7 05:27:44 PDT 2009


From: Dan Smith <danms at us.ibm.com>

Changes:
 - Update to match UTS changes

Signed-off-by: Dan Smith <danms at us.ibm.com>
Signed-off-by: Oren Laadan <orenl at cs.columbia.edu>
---
 checkpoint/checkpoint.c        |    2 -
 checkpoint/ckpt_task.c         |   20 ++++++++++++++++--
 checkpoint/objhash.c           |    7 ++++++
 checkpoint/rstr_task.c         |   42 +++++++++++++++++++++++++++++++++++++++-
 include/linux/checkpoint.h     |    1 +
 include/linux/checkpoint_hdr.h |    2 +
 6 files changed, 68 insertions(+), 6 deletions(-)

diff --git a/checkpoint/checkpoint.c b/checkpoint/checkpoint.c
index d3661b1..7382cc3 100644
--- a/checkpoint/checkpoint.c
+++ b/checkpoint/checkpoint.c
@@ -258,8 +258,6 @@ static int cr_may_checkpoint_task(struct task_struct *t, struct cr_ctx *ctx)
 		return -EINVAL;
 
 	rcu_read_lock();
-	if (task_nsproxy(t)->ipc_ns != ctx->root_nsproxy->ipc_ns)
-		ret = -EPERM;
 	if (task_nsproxy(t)->mnt_ns != ctx->root_nsproxy->mnt_ns)
 		ret = -EPERM;
 	if (task_nsproxy(t)->pid_ns != ctx->root_nsproxy->pid_ns)
diff --git a/checkpoint/ckpt_task.c b/checkpoint/ckpt_task.c
index fb82b0b..b5e330b 100644
--- a/checkpoint/ckpt_task.c
+++ b/checkpoint/ckpt_task.c
@@ -13,6 +13,7 @@
 #include <linux/futex.h>
 #include <linux/poll.h>
 #include <linux/utsname.h>
+#include <linux/ipc_namespace.h>
 #include <linux/checkpoint.h>
 #include <linux/checkpoint_hdr.h>
 
@@ -205,7 +206,7 @@ static int cr_write_namespaces(struct cr_ctx *ctx, struct task_struct *t)
 	struct cr_hdr h;
 	struct cr_hdr_namespaces *hh;
 	struct nsproxy *nsproxy;
-	int new_uts;
+	int new_uts, new_ipc;
 	int ret;
 
 	hh = cr_hbuf_get(ctx, sizeof(*hh));
@@ -226,24 +227,37 @@ static int cr_write_namespaces(struct cr_ctx *ctx, struct task_struct *t)
 		ret = new_uts;
 		goto out;
 	}
+	new_ipc = cr_obj_add_ptr(ctx, nsproxy->ipc_ns,
+				 &hh->ipc_ref, CR_OBJ_IPCNS, 0);
+	if (new_ipc < 0) {
+		ret = new_ipc;
+		goto out;
+	}
 
 	hh->flags = 0;
 	if (new_uts)
 		hh->flags |= CLONE_NEWUTS;
+	if (new_ipc)
+		hh->flags |= CLONE_NEWIPC;
 
 	ret = cr_write_obj(ctx, &h, hh);
 	if (ret < 0)
 		goto out;
 
 	if (new_uts) {
-		ret = cr_write_utsns(ctx, nsp->uts_ns);
+		ret = cr_write_utsns(ctx, nsproxy->uts_ns);
+		if (ret < 0)
+			goto out;
+	}
+	if (new_ipc) {
+		/* ret = cr_write_ipcns(ctx, nsproxy->ipc_ns); */ ret = 0;
 		if (ret < 0)
 			goto out;
 	}
 
 	/* FIX: Write other namespaces here */
  out:
-	put_nsproxy(nsp);
+	put_nsproxy(nsproxy);
 	cr_hbuf_put(ctx, sizeof(*hh));
 	return ret;
 }
diff --git a/checkpoint/objhash.c b/checkpoint/objhash.c
index 1082713..2ffa098 100644
--- a/checkpoint/objhash.c
+++ b/checkpoint/objhash.c
@@ -12,6 +12,7 @@
 #include <linux/file.h>
 #include <linux/hash.h>
 #include <linux/utsname.h>
+#include <linux/ipc_namespace.h>
 #include <linux/checkpoint.h>
 
 struct cr_objref {
@@ -45,6 +46,9 @@ static void cr_obj_ref_drop(struct cr_objref *obj)
 	case CR_OBJ_UTSNS:
 		put_uts_ns((struct uts_namespace *) obj->ptr);
 		break;
+	case CR_OBJ_IPCNS:
+		put_ipc_ns((struct ipc_namespace *) obj->ptr);
+		break;
 	default:
 		BUG();
 	}
@@ -68,6 +72,9 @@ static int cr_obj_ref_grab(struct cr_objref *obj)
 	case CR_OBJ_UTSNS:
 		get_uts_ns((struct uts_namespace *) obj->ptr);
 		break;
+	case CR_OBJ_IPCNS:
+		get_ipc_ns((struct ipc_namespace *) obj->ptr);
+		break;
 	default:
 		BUG();
 	}
diff --git a/checkpoint/rstr_task.c b/checkpoint/rstr_task.c
index 13bc056..520c15a 100644
--- a/checkpoint/rstr_task.c
+++ b/checkpoint/rstr_task.c
@@ -13,6 +13,7 @@
 #include <linux/futex.h>
 #include <linux/poll.h>
 #include <linux/utsname.h>
+#include <linux/ipc_namespace.h>
 #include <linux/syscalls.h>
 #include <linux/checkpoint.h>
 #include <linux/checkpoint_hdr.h>
@@ -233,6 +234,41 @@ static int cr_restore_utsns(struct cr_ctx *ctx, int ref, int flags)
 	return ret;
 }
 
+static int cr_restore_ipcns(struct cr_ctx *ctx, int ref, int flags)
+{
+	struct ipc_namespace *ipc_ns, *oldipc_ns;
+	int ret;
+
+	ipc_ns = cr_obj_get_by_ref(ctx, ref, CR_OBJ_IPCNS);
+	if (IS_ERR(ipc_ns)) {
+		cr_debug("failed to get IPC ns from objhash\n");
+		return PTR_ERR(ipc_ns);
+	}
+
+	if (!!ipc_ns ^ !(flags & CLONE_NEWIPC))
+		return -EINVAL;
+
+	if (!ipc_ns) {
+		/* ret = cr_read_ipcns(ctx, current); */ ret = 0;
+		if (ret < 0)
+			return ret;
+
+		ret = cr_obj_add_ref(ctx, current->nsproxy->ipc_ns,
+				     ref, CR_OBJ_IPCNS, 0);
+	} else {
+		ret = copy_namespaces(CLONE_NEWIPC, current);
+		if (ret < 0)
+			return ret;
+
+		oldipc_ns = current->nsproxy->ipc_ns;
+		current->nsproxy->ipc_ns = ipc_ns;
+		get_ipc_ns(ipc_ns);
+		put_ipc_ns(oldipc_ns);
+	}
+
+	return ret;
+}
+
 static int cr_read_namespaces(struct cr_ctx *ctx)
 {
 	struct cr_hdr_namespaces *hh;
@@ -247,7 +283,7 @@ static int cr_read_namespaces(struct cr_ctx *ctx)
 		goto out;
 
 	ret = -EINVAL;
-	if (hh->flags & ~CLONE_NEWUTS)
+	if (hh->flags & ~(CLONE_NEWUTS | CLONE_NEWIPC))
 		goto out;
 
 	/* each unseen-before namespace will be un-shared now */
@@ -266,6 +302,10 @@ static int cr_read_namespaces(struct cr_ctx *ctx)
 	cr_debug("uts ns: %d\n", ret);
 	if (ret < 0)
 		goto out;
+	ret = cr_restore_ipcns(ctx, hh->ipc_ref, hh->flags);
+	cr_debug("ipc ns: %d\n", ret);
+	if (ret < 0)
+		goto out;
 
 	/* FIX: add more namespaces here */
 
diff --git a/include/linux/checkpoint.h b/include/linux/checkpoint.h
index f821283..1999639 100644
--- a/include/linux/checkpoint.h
+++ b/include/linux/checkpoint.h
@@ -79,6 +79,7 @@ enum {
 	CR_OBJ_INODE,
 	CR_OBJ_MM,
 	CR_OBJ_UTSNS,
+	CR_OBJ_IPCNS,
 	CR_OBJ_MAX
 };
 
diff --git a/include/linux/checkpoint_hdr.h b/include/linux/checkpoint_hdr.h
index 212c95f..5e923c3 100644
--- a/include/linux/checkpoint_hdr.h
+++ b/include/linux/checkpoint_hdr.h
@@ -51,6 +51,7 @@ enum {
 	CR_HDR_CPU,
 	CR_HDR_NS,
 	CR_HDR_UTSNS,
+	CR_HDR_IPCNS,
 
 	CR_HDR_MM = 201,
 	CR_HDR_VMA,
@@ -136,6 +137,7 @@ enum restart_block_type {
 struct cr_hdr_namespaces {
 	__u32 flags;
 	__u32 uts_ref;
+	__u32 ipc_ref;
 } __attribute__((aligned(8)));
 
 struct cr_hdr_utsns {
-- 
1.5.4.3

_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers




More information about the Devel mailing list