[CRIU] [PATCH v8 15/15] check: "autofs" feature added

Stanislav Kinsburskiy skinsbursky at virtuozzo.com
Wed Mar 16 06:18:23 PDT 2016


The only way to check, whether autofs migration is supported  from the kernel
side is to check actual mount point options (search for "pipe_ino" option).
This checker first tries to find autofs on host. If there is no any, temporary
mounts autofs by itself.

Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
---
 criu/cr-check.c |   82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 82 insertions(+)

diff --git a/criu/cr-check.c b/criu/cr-check.c
index 2896b02..f3fd2ee 100644
--- a/criu/cr-check.c
+++ b/criu/cr-check.c
@@ -21,6 +21,7 @@
 #include <sys/prctl.h>
 #include <sched.h>
 #include <linux/aio_abi.h>
+#include <sys/mount.h>
 
 #include "proc_parse.h"
 #include "sockets.h"
@@ -820,6 +821,84 @@ static int check_clone_parent_vs_pid()
 	return 0;
 }
 
+static int check_autofs_pipe_ino(void)
+{
+	FILE *f;
+	char str[1024];
+	int ret = -ENOENT;
+
+	f = fopen_proc(PROC_SELF, "mountinfo");
+	if (!f) {
+		pr_perror("Can't open %d mountinfo", getpid());
+		return -1;
+	}
+
+	while (fgets(str, sizeof(str), f)) {
+		if (strstr(str, " autofs ")) {
+			if (strstr(str, "pipe_ino="))
+				ret = 0;
+			else {
+				pr_err("autofs not supported.\n");
+				ret = -ENOTSUP;
+			}
+			break;
+		}
+	}
+
+	fclose(f);
+	return ret;
+}
+
+static int check_autofs(void)
+{
+	char *dir, *options, template[] = "/tmp/.criu.mnt.XXXXXX";
+	int ret, pfd[2];
+
+	ret = check_autofs_pipe_ino();
+	if (ret != -ENOENT)
+		return ret;
+
+	if (pipe(pfd) < 0) {
+		pr_perror("failed to create pipe");
+		return -1;
+	}
+
+	ret = -1;
+
+	options = xsprintf("fd=%d,pgrp=%d,minproto=5,maxproto=5,direct",
+				pfd[1], getpgrp());
+	if (!options) {
+		pr_err("failed to allocate autofs options\n");
+		goto close_pipe;
+	}
+
+	dir = mkdtemp(template);
+	if (!dir) {
+		pr_perror("failed to construct temporary name\n");
+		goto free_options;
+	}
+
+	if (mount("criu", dir, "autofs", 0, options) < 0) {
+		pr_perror("failed to mount autofs");
+		goto unlink_dir;
+	}
+
+	ret = check_autofs_pipe_ino();
+
+	if (umount(dir))
+		pr_perror("failed to umount %s\n", dir);
+
+unlink_dir:
+	if (rmdir(dir))
+		pr_perror("failed to unlink %s", dir);
+free_options:
+	free(options);
+close_pipe:
+	close(pfd[0]);
+	close(pfd[1]);
+	return ret;
+}
+
 static int check_cgroupns(void)
 {
 	int ret;
@@ -894,6 +973,7 @@ int cr_check(void)
 	ret |= check_fdinfo_lock();
 	ret |= check_clone_parent_vs_pid();
 	ret |= check_cgroupns();
+	ret |= check_autofs();
 
 out:
 	if (!ret)
@@ -969,6 +1049,8 @@ int check_add_feature(char *feat)
 		chk_feature = check_loginuid;
 	else if (!strcmp(feat, "cgroupns"))
 		chk_feature = check_cgroupns;
+	else if (!strcmp(feat, "autofs"))
+		chk_feature = check_autofs;
 	else {
 		pr_err("Unknown feature %s\n", feat);
 		return -1;



More information about the CRIU mailing list