[CRIU] [PATCH v4 07/17] autofs: dump stage introduced
Pavel Emelyanov
xemul at parallels.com
Tue Jan 19 05:58:19 PST 2016
On 01/07/2016 07:09 PM, Stanislav Kinsburskiy wrote:
> AutoFS mount point is managed by user space daemon, which receives requests
> from kernel via pipe, passed on mount operation.
> Kernel hold write end, while user space process - read end.
> Thus, for successfull AutoFS migration, this connection has to be restored.
>
> The major trick for dump stage is that mount points are collected (parsed)
> from initial pid namespace, which leads to real pgrp value in AutoFS options
> instead of virtual one. This have to be fixed.
>
> Note: we don't care about virtual pgrp in case of catatonic mounts
>
> Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
> ---
> autofs.c | 24 ++++++++++++++++++++++++
> include/autofs.h | 1 +
> mount.c | 1 +
> 3 files changed, 26 insertions(+)
>
> diff --git a/autofs.c b/autofs.c
> index c2aafa6..1f7509f 100644
> --- a/autofs.c
> +++ b/autofs.c
> @@ -300,3 +300,27 @@ int autofs_parse(struct mount_info *pm, bool for_dump)
>
> return 0;
> }
> +
> +int autofs_dump(struct mount_info *pm)
> +{
> + AutofsEntry *entry = pm->autofs;
> + struct mount_info *mi;
> +
> + if (entry->fd == AUTOFS_CATATONIC_FD)
> + return 0;
> +
> + /* We need to get virtual pgrp to restore mount */
> + entry->pgrp = pid_to_virt(entry->pgrp);
> + if (!entry->pgrp) {
> + pr_err("failed to find pstree item with pid %d\n",
> + entry->pgrp);
> + pr_err("Non-catatonic mount without master?\n");
> + return -1;
> + }
> +
> + /* Fix pgrp for all bind-mounts */
> + list_for_each_entry(mi, &pm->mnt_bind, mnt_bind)
> + mi->autofs->pgrp = entry->pgrp;
Do they all have mi->autofs? This pointer is set in dump_one_mountpoint()
and by the time you get here for the first pm, all the others still
have NULL there.
> +
> + return 0;
> +}
> diff --git a/include/autofs.h b/include/autofs.h
> index ac7ae5e..e547f55 100644
> --- a/include/autofs.h
> +++ b/include/autofs.h
> @@ -9,5 +9,6 @@ bool is_autofs_pipe(unsigned long inode);
>
> struct mount_info;
> int autofs_parse(struct mount_info *pm, bool for_dump);
> +int autofs_dump(struct mount_info *pm);
>
> #endif
> diff --git a/mount.c b/mount.c
> index 69c69e1..f79f991 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -1699,6 +1699,7 @@ static struct fstype fstypes[32] = {
> .name = "autofs",
> .code = FSTYPE__AUTOFS,
> .parse = autofs_parse,
> + .dump = autofs_dump,
> .restore = always_fail,
> },
> };
>
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
> .
>
More information about the CRIU
mailing list