[CRIU] [PATCH] cgroup: actually detect cgroupns bind mounts correctly
Tycho Andersen
tycho.andersen at canonical.com
Thu Aug 11 07:05:25 PDT 2016
On Wed, Aug 10, 2016 at 04:35:18PM +0300, Pavel Emelyanov wrote:
> On 08/09/2016 01:36 AM, Tycho Andersen wrote:
> > Initially, the cgroupns patchset that went into the Ubuntu kernels had the
> > nsroot= argument in mountopts, which allowed us to distinguish between
> > cgroupfs mounts. The upstream kernel doesn't have this (the reasoning was
> > that it showed up in the root field of mountinfo), so all cgroup mounts
> > look idential if we don't consider the root mount, and we wrongly detect
> > the mounts as bind mounts. Instead, let's remember the root path and
> > compare this when considering when a mount is a bind mount.
> >
> > This patch is a little ugly because it intorduces cgroup specific behavior
> > into the generic code, which we've thus far been able to avoid. One way to
> > deal with this might be able to add a ->sb_equal hook to the fstype struct
> > that could compare mountinfos' superblocks, and then fall back to
> > mounts_sb_equal if that isn't present. Or we can leave this specific code
> > in the generic bits until more of these appear. Either way is fine with me.
> >
> > Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
> > ---
> > criu/mount.c | 5 ++++-
> > 1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/criu/mount.c b/criu/mount.c
> > index f90ec69..de13915 100644
> > --- a/criu/mount.c
> > +++ b/criu/mount.c
> > @@ -721,6 +721,9 @@ static struct mount_info *find_best_external_match(struct mount_info *list, stru
> > if (!mounts_sb_equal(info, it))
> > continue;
> >
> > + if (info->fstype->code == FSTYPE__CGROUP && strcmp(info->private, it->private))
> > + continue;
>
> Shouldn't this be rather in mounts_sb_equal()?
It could be, and I suppose it should be too, I can resend.
> And, BTW, what's there in cgroup's mi->private?
It's the original root path from pm->root, see the hunk below.
Tycho
> > +
> > /*
> > * This means we have a situation like:
> > *
> > @@ -1602,7 +1605,7 @@ static int cgroup_parse(struct mount_info *pm)
> > /* cgroup namespaced mounts don't look rooted to CRIU, so let's fake it
> > * here.
> > */
> > - xfree(pm->root);
> > + pm->private = pm->root;
> > pm->root = xstrdup("/");
> > if (!pm->root)
> > return -1;
> >
>
More information about the CRIU
mailing list