[CRIU] [PATCH 1/2] mount: handle tracefs more gracefully
Andrew Vagin
avagin at virtuozzo.com
Tue May 17 10:37:22 PDT 2016
Hi Tycho,
Honestly, I don't like this hack. I think it will not work in all cases.
For example, we create a clean mount, if an required path is
overmounted:
if (&c->siblings != &mi->bind->children) {
/* Get a copy of mi->bind without child mounts */
if (mount(mnt_path, mnt_clean_path, NULL, MS_BIND, NULL)) {
pr_perror("Unable to bind-mount %s to %s",
mi->bind->mountpoint, mnt_clean_path);
}
mnt_path = mnt_clean_path;
umount_mnt_path = true;
}
so if we will create a clean mount for debugfs, we will lost tracefs.
Do you bind-mount debugfs from host in a container? If it's yes, you probably
use --mnt-ext-map options for it. Maybe we can add recursive external mounts
or something like this.
On Mon, May 16, 2016 at 10:30:47PM +0000, Tycho Andersen wrote:
> See the comment for details, but basically tracefs is automounted by the
> kernel, so we can just mount debugfs with MS_REC and get the right result.
>
> v2: rebase on criu-dev
> v3: don't use a new fstype->flags, just always set MS_REC in debugfs'
> ->parse
>
> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
> ---
> This is kind of similarly ugly to to a cgroup patch I sent earlier, where
> we needed some filesystem specific code and checks in various parts of
> mount.c. I somehow can't figure out a nicer way to do this, but I am
> definitely open to suggestions.
> ---
> criu/mount.c | 15 +++++++++++++++
> criu/proc_parse.c | 7 +++++++
> images/mnt.proto | 1 +
> 3 files changed, 23 insertions(+)
>
> diff --git a/criu/mount.c b/criu/mount.c
> index 6f47655..e85e5d9 100644
> --- a/criu/mount.c
> +++ b/criu/mount.c
> @@ -1679,6 +1679,17 @@ out:
> return ret;
> }
>
> +static int debugfs_parse(struct mount_info *pm)
> +{
> + /* tracefs is automounted underneath debugfs sometimes, and the
> + * kernel's overmounting protection prevents us from mounting debugfs
> + * first without tracefs, so let's always mount debugfs MS_REC.
> + */
> + pm->flags |= MS_REC;
> +
> + return 0;
> +}
> +
> static int cgroup_parse(struct mount_info *pm)
> {
> if (!(root_ns_mask & CLONE_NEWCGROUP))
> @@ -1780,6 +1791,10 @@ static struct fstype fstypes[] = {
> }, {
> .name = "debugfs",
> .code = FSTYPE__DEBUGFS,
> + .parse = debugfs_parse,
> + }, {
> + .name = "tracefs",
> + .code = FSTYPE__TRACEFS,
> }, {
> .name = "cgroup",
> .code = FSTYPE__CGROUP,
> diff --git a/criu/proc_parse.c b/criu/proc_parse.c
> index cebf21c..db1d0af 100644
> --- a/criu/proc_parse.c
> +++ b/criu/proc_parse.c
> @@ -1381,6 +1381,13 @@ struct mount_info *parse_mountinfo(pid_t pid, struct ns_id *nsid, bool for_dump)
> goto end;
> }
>
> + if (new->fstype->code == FSTYPE__TRACEFS) {
> + pr_info("\tskipping tracefs mounted at %s\n", new->mountpoint + 1);
> + mnt_entry_free(new);
> + new = NULL;
> + goto end;
> + }
> +
> pr_info("\ttype %s source %s mnt_id %d s_dev %#x %s @ %s flags %#x options %s\n",
> fsname, new->source,
> new->mnt_id, new->s_dev, new->root, new->mountpoint,
> diff --git a/images/mnt.proto b/images/mnt.proto
> index fe1e4bb..9338ecb 100644
> --- a/images/mnt.proto
> +++ b/images/mnt.proto
> @@ -20,6 +20,7 @@ enum fstype {
> AUTO = 16;
> OVERLAYFS = 17;
> AUTOFS = 18;
> + TRACEFS = 19;
> };
>
> message mnt_entry {
> --
> 2.7.4
>
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list