[CRIU] [PATCH] check: "autofs" feature added
Pavel Emelyanov
xemul at virtuozzo.com
Wed Mar 16 03:25:11 PDT 2016
On 03/15/2016 06:07 PM, Stanislav Kinsburskiy wrote:
> 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 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
And add the feature in the test's desc file.
> 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;
>
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
> .
>
More information about the CRIU
mailing list