[Devel] [PATCH 28/30] cr: sockets

Alexey Dobriyan adobriyan at gmail.com
Thu Apr 9 19:40:37 PDT 2009


Nothing will be dumped because socket file_operations aren't ready.

This is one big FIXME item.

Signed-off-by: Alexey Dobriyan <adobriyan at gmail.com>
---

 include/linux/cr.h    |    8 ++++
 kernel/cr/Makefile    |    1 
 kernel/cr/cpt-sys.c   |    6 +++
 kernel/cr/cr-net.c    |    7 +++
 kernel/cr/cr-socket.c |   90 ++++++++++++++++++++++++++++++++++++++++++++++++++
 kernel/cr/cr.h        |   19 ++++++++++
 6 files changed, 131 insertions(+)

--- a/include/linux/cr.h
+++ b/include/linux/cr.h
@@ -50,6 +50,7 @@ struct cr_object_header {
 #define CR_OBJ_USER_NS		19
 #define CR_OBJ_MNT_NS		20
 #define CR_OBJ_NET_NS		21
+#define CR_OBJ_SOCK		22
 	__u32	cr_type;	/* object type */
 	__u32	cr_len;		/* object length in bytes including header */
 } __packed;
@@ -373,4 +374,11 @@ struct cr_image_net_ns {
 		__u32	cr_sysctl_max_dgram_qlen;
 	} cr_unx;
 } __packed;
+
+struct cr_image_sock {
+	struct cr_object_header cr_hdr;
+
+	cr_pos_t	cr_pos_sk_net;
+	__u16		cr_sk_family;
+} __packed;
 #endif
--- a/kernel/cr/Makefile
+++ b/kernel/cr/Makefile
@@ -10,6 +10,7 @@ cr-$(CONFIG_NET) += cr-net.o
 cr-y += cr-nsproxy.o
 cr-y += cr-pid.o
 cr-y += cr-signal.o
+cr-$(CONFIG_NET) += cr-socket.o
 cr-y += cr-task.o
 cr-y += cr-uts.o
 cr-$(CONFIG_X86_32) += cr-x86_32.o
--- a/kernel/cr/cpt-sys.c
+++ b/kernel/cr/cpt-sys.c
@@ -86,6 +86,9 @@ static int cr_collect(struct cr_context *ctx)
 	rv = cr_collect_all_file(ctx);
 	if (rv < 0)
 		return rv;
+	rv = cr_collect_all_sock(ctx);
+	if (rv < 0)
+		return rv;
 	rv = cr_collect_all_net_ns(ctx);
 	if (rv < 0)
 		return rv;
@@ -182,6 +185,9 @@ static int cr_dump(struct cr_context *ctx)
 	rv = cr_dump_all_net_ns(ctx);
 	if (rv < 0)
 		return rv;
+	rv = cr_dump_all_sock(ctx);
+	if (rv < 0)
+		return rv;
 	rv = cr_dump_all_sighand_struct(ctx);
 	if (rv < 0)
 		return rv;
--- a/kernel/cr/cr-net.c
+++ b/kernel/cr/cr-net.c
@@ -27,6 +27,13 @@ int cr_collect_all_net_ns(struct cr_context *ctx)
 		if (rv < 0)
 			return rv;
 	}
+	for_each_cr_object(ctx, obj, CR_CTX_SOCK) {
+		struct sock *sk = obj->o_obj;
+
+		rv = cr_collect_net_ns(ctx, sock_net(sk));
+		if (rv < 0)
+			return rv;
+	}
 	for_each_cr_object(ctx, obj, CR_CTX_NET_NS) {
 		struct net *net_ns = obj->o_obj;
 		unsigned int cnt = atomic_read(&net_ns->count);
new file mode 100644
--- /dev/null
+++ b/kernel/cr/cr-socket.c
@@ -0,0 +1,90 @@
+/* Copyright (C) 2000-2009 Parallels Holdings, Ltd. */
+#include <net/sock.h>
+
+#include <linux/cr.h>
+#include "cr.h"
+
+static int cr_check_sock(struct sock *sk)
+{
+#ifdef CONFIG_XFRM
+	if (sk->sk_policy[0] || sk->sk_policy[1]) {
+		WARN_ON(1);
+		return -EINVAL;
+	}
+#endif
+#ifdef CONFIG_SECURITY
+	if (sk->sk_security) {
+		WARN_ON(1);
+		return -EINVAL;
+	}
+#endif
+	return 0;
+}
+
+static int cr_collect_sock(struct cr_context *ctx, struct sock *sk)
+{
+	int rv;
+
+	rv = cr_check_sock(sk);
+	if (rv < 0)
+		return rv;
+	rv = cr_collect_object(ctx, sk, CR_CTX_SOCK);
+	printk("collect sock %p: rv %d, family %u\n", sk, rv, sk->sk_family);
+	return rv;
+}
+
+int cr_collect_all_sock(struct cr_context *ctx)
+{
+	struct cr_object *obj;
+	int rv;
+
+	for_each_cr_object(ctx, obj, CR_CTX_FILE) {
+		struct file *file = obj->o_obj;
+		struct inode *inode = file->f_path.dentry->d_inode;
+
+		if (!S_ISSOCK(inode->i_mode))
+			continue;
+
+		rv = cr_collect_sock(ctx, SOCKET_I(inode)->sk);
+		if (rv < 0)
+			return rv;
+	}
+	return 0;
+}
+
+static int cr_dump_sock(struct cr_context *ctx, struct cr_object *obj)
+{
+	struct sock *sk = obj->o_obj;
+	struct cr_image_sock *i;
+	struct cr_object *tmp;
+	int rv;
+
+	printk("dump socket %p\n", sk);
+
+	i = cr_prepare_image(CR_OBJ_SOCK, sizeof(*i));
+	if (!i)
+		return -ENOMEM;
+
+	tmp = cr_find_obj_by_ptr(ctx, sock_net(sk), CR_CTX_NET_NS);
+	i->cr_pos_sk_net = tmp->o_pos;
+
+	i->cr_sk_family = sk->sk_family;
+
+	obj->o_pos = ctx->cr_dump_file->f_pos;
+	rv = cr_write(ctx, i, sizeof(*i));
+	kfree(i);
+	return rv;
+}
+
+int cr_dump_all_sock(struct cr_context *ctx)
+{
+	struct cr_object *obj;
+	int rv;
+
+	for_each_cr_object(ctx, obj, CR_CTX_SOCK) {
+		rv = cr_dump_sock(ctx, obj);
+		if (rv < 0)
+			return rv;
+	}
+	return 0;
+}
--- a/kernel/cr/cr.h
+++ b/kernel/cr/cr.h
@@ -37,6 +37,9 @@ enum cr_context_obj_type {
 	CR_CTX_PID_NS,
 	CR_CTX_SIGHAND_STRUCT,
 	CR_CTX_SIGNAL_STRUCT,
+#ifdef CONFIG_NET
+	CR_CTX_SOCK,
+#endif
 	CR_CTX_TASK_STRUCT,
 	CR_CTX_USER_NS,
 	CR_CTX_USER_STRUCT,
@@ -113,6 +116,14 @@ int cr_collect_all_pid_ns(struct cr_context *ctx);
 int cr_collect_all_pid(struct cr_context *ctx);
 int cr_collect_all_sighand_struct(struct cr_context *ctx);
 int cr_collect_all_signal_struct(struct cr_context *ctx);
+#ifdef CONFIG_NET
+int cr_collect_all_sock(struct cr_context *ctx);
+#else
+static inline int cr_collect_all_sock(struct cr_context *ctx)
+{
+	return 0;
+}
+#endif
 int cr_collect_all_task_struct(struct cr_context *ctx);
 int cr_collect_all_user_ns(struct cr_context *ctx);
 int cr_collect_all_user_struct(struct cr_context *ctx);
@@ -138,6 +149,14 @@ int cr_dump_all_pid_ns(struct cr_context *ctx);
 int cr_dump_all_pid(struct cr_context *ctx);
 int cr_dump_all_sighand_struct(struct cr_context *ctx);
 int cr_dump_all_signal_struct(struct cr_context *ctx);
+#ifdef CONFIG_NET
+int cr_dump_all_sock(struct cr_context *ctx);
+#else
+static inline int cr_dump_all_sock(struct cr_context *ctx)
+{
+	return 0;
+}
+#endif
 int cr_dump_all_task_struct(struct cr_context *ctx);
 int cr_dump_all_user_ns(struct cr_context *ctx);
 int cr_dump_all_user_struct(struct cr_context *ctx);
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers




More information about the Devel mailing list