[Devel] [PATCH criu 1/3] mount: Add export_mnt_ns_roots helper

Cyrill Gorcunov gorcunov at gmail.com
Thu Oct 12 10:21:29 MSK 2017


This helper produce space separated list of
mount namespace roots which can be exported
then into environment variable.

https://jira.sw.ru/browse/PSBM-71861

Signed-off-by: Cyrill Gorcunov <gorcunov at virtuozzo.com>
---
 criu/include/mount.h |  2 ++
 criu/mount.c         | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/criu/include/mount.h b/criu/include/mount.h
index 35e1b49..e19f767 100644
--- a/criu/include/mount.h
+++ b/criu/include/mount.h
@@ -93,6 +93,8 @@ extern int open_mountpoint(struct mount_info *pm);
 extern struct mount_info *collect_mntinfo(struct ns_id *ns, bool for_dump);
 extern int prepare_mnt_ns(void);
 
+extern char *export_mnt_ns_roots(char *dst, size_t size);
+
 extern int pivot_root(const char *new_root, const char *put_old);
 
 extern struct mount_info *lookup_overlayfs(char *rpath, unsigned int s_dev,
diff --git a/criu/mount.c b/criu/mount.c
index c483c2e..57df5da 100644
--- a/criu/mount.c
+++ b/criu/mount.c
@@ -2788,6 +2788,40 @@ static inline int print_ns_root(struct ns_id *ns, int remap_id, char *buf, int b
 	return snprintf(buf, bs, "%s/%d-%010d", mnt_roots, ns->id, remap_id);
 }
 
+/*
+ * Construct space separated list of mount namespace roots
+ * so that we could export it via environment variable and
+ * process in restore scripts.
+ */
+char *export_mnt_ns_roots(char *dst, size_t size)
+{
+	struct ns_id *nsid;
+	char *p = dst;
+	size_t len;
+
+	if (size == 0)
+		return dst;
+
+	dst[0] = '\0';
+	for (nsid = ns_ids; nsid; nsid = nsid->next) {
+		if (nsid->nd != &mnt_ns_desc)
+			continue;
+
+		len = print_ns_root(nsid, 0, p, size);
+		if (len >= (size - 2)) {
+			p[(size - 1)] = '\0';
+			return dst;
+		}
+
+		size -= len;
+		p += len;
+		p[0] = ' ';
+		p++, size--;
+	}
+
+	return dst;
+}
+
 static int create_mnt_roots(void)
 {
 	int exit_code = -1;
-- 
2.7.5



More information about the Devel mailing list