[CRIU] [RFC] mount: Add ability to c/r devtmpfs

Cyrill Gorcunov gorcunov at openvz.org
Thu Oct 16 09:59:37 PDT 2014


Looking into experiments with OpenVZ kernel
it seems plain tar over devtmpfs should be
enough for a while. So here is a new option
comes in "--devtmpfs-content".

Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 crtools.c            |  5 +++++
 include/cr_options.h |  1 +
 lib/criu.c           |  6 ++++++
 lib/criu.h           |  1 +
 mount.c              | 16 ++++++++++++++++
 protobuf/rpc.proto   |  1 +
 6 files changed, 30 insertions(+)

diff --git a/crtools.c b/crtools.c
index 0ac667cd8eda..196ac56a2502 100644
--- a/crtools.c
+++ b/crtools.c
@@ -187,6 +187,7 @@ int main(int argc, char *argv[], char *envp[])
 		{ "exec-cmd", no_argument, 0, 1059},
 		{ "manage-cgroups", no_argument, 0, 1060},
 		{ "cgroup-root", required_argument, 0, 1061},
+		{ "devtmpfs-content", no_argument, 0, 1062},
 		{ },
 	};
 
@@ -392,6 +393,9 @@ int main(int argc, char *argv[], char *envp[])
 					return -1;
 			}
 			break;
+		case 1062:
+			opts.devtmpfs_content = true;
+			break;
 		case 'M':
 			{
 				char *aux;
@@ -604,6 +608,7 @@ usage:
 "                        change the root cgroup the controller will be\n"
 "                        installed into. No controller means that root is the\n"
 "                        default for all controllers not specified.\n"
+"  --devtmpfs-content    checkpoint/restore content of devtmpfs filesystem.\n"
 "\n"
 "* Logging:\n"
 "  -o|--log-file FILE    log file name\n"
diff --git a/include/cr_options.h b/include/cr_options.h
index a9f9e92259e6..43d889c47ea7 100644
--- a/include/cr_options.h
+++ b/include/cr_options.h
@@ -58,6 +58,7 @@ struct cr_options {
 	char			*new_global_cg_root;
 	struct list_head	new_cgroup_roots;
 	bool			aufs;		/* auto-deteced, not via cli */
+	bool			devtmpfs_content;
 };
 
 extern struct cr_options opts;
diff --git a/lib/criu.c b/lib/criu.c
index ad419ba1a633..2fcc55fcc59d 100644
--- a/lib/criu.c
+++ b/lib/criu.c
@@ -169,6 +169,12 @@ void criu_set_cpu_cap(unsigned int cap)
 	opts->cpu_cap		= cap;
 }
 
+void criu_set_devtmpfs_content(bool val)
+{
+	opts->has_devtmpfs_content	= true;
+	opts->devtmpfs_content		= val;
+}
+
 int criu_set_exec_cmd(int argc, char *argv[])
 {
 	int i;
diff --git a/lib/criu.h b/lib/criu.h
index 18f911eeaba6..b0cc633034ab 100644
--- a/lib/criu.h
+++ b/lib/criu.h
@@ -46,6 +46,7 @@ void criu_set_link_remap(bool link_remap);
 void criu_set_log_level(int log_level);
 void criu_set_log_file(char *log_file);
 void criu_set_cpu_cap(unsigned int cap);
+void criu_set_devtmpfs_content(bool val);
 void criu_set_root(char *root);
 void criu_set_manage_cgroups(bool manage);
 int criu_set_exec_cmd(int argc, char *argv[]);
diff --git a/mount.c b/mount.c
index a60c86e0f97b..d0dbdb31b791 100644
--- a/mount.c
+++ b/mount.c
@@ -729,6 +729,13 @@ out:
 	return ret;
 }
 
+static int devtmpfs_dump(struct mount_info *pm)
+{
+	if (!opts.devtmpfs_content)
+		return 0;
+	return tmpfs_dump(pm);
+}
+
 static int tmpfs_restore(struct mount_info *pm)
 {
 	int ret;
@@ -753,6 +760,13 @@ static int tmpfs_restore(struct mount_info *pm)
 	return 0;
 }
 
+static int devtmpfs_restore(struct mount_info *pm)
+{
+	if (!opts.devtmpfs_content)
+		return 0;
+	return tmpfs_restore(pm);
+}
+
 static int binfmt_misc_dump(struct mount_info *pm)
 {
 	int fd, ret = -1;
@@ -831,6 +845,8 @@ static struct fstype fstypes[] = {
 	}, {
 		.name = "devtmpfs",
 		.code = FSTYPE__DEVTMPFS,
+		.dump = devtmpfs_dump,
+		.restore = devtmpfs_restore,
 	}, {
 		.name = "binfmt_misc",
 		.code = FSTYPE__BINFMT_MISC,
diff --git a/protobuf/rpc.proto b/protobuf/rpc.proto
index d511512c5696..41e4b5706fa3 100644
--- a/protobuf/rpc.proto
+++ b/protobuf/rpc.proto
@@ -55,6 +55,7 @@ message criu_opts {
 	repeated cgroup_root		cg_root		= 25;
 
 	optional bool			rst_sibling	= 26; /* swrk only */
+	optional bool			devtmpfs_content= 27;
 }
 
 message criu_dump_resp {
-- 
1.9.3



More information about the CRIU mailing list