[CRIU] [PATCH 2/5] mnt: add --enable-external-sharing flag
Tycho Andersen
tycho.andersen at canonical.com
Thu Apr 9 09:56:06 PDT 2015
On Thu, Apr 09, 2015 at 07:49:14PM +0300, Pavel Emelyanov wrote:
> On 04/09/2015 07:32 PM, Tycho Andersen wrote:
> > With this flag, external shared bind mounts are attempted to be resolved
> > automatically.
>
> Just a question -- what if we specify external mount map manually, would
> the sharing/slavery get resolved?
It isn't now, but it could be with a simple change. Right now the
behavior of --ext-mount-map KEY:VAL is (I hope) exactly as it was
before.
Tycho
> > v2: don't always assume when the sharing matches that the mount matches
> >
> > Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
> > ---
> > crtools.c | 6 ++++++
> > include/cr_options.h | 1 +
> > include/proc_parse.h | 1 +
> > mount.c | 20 +++++++++++++++++++-
> > protobuf/mnt.proto | 1 +
> > 5 files changed, 28 insertions(+), 1 deletion(-)
> >
> > diff --git a/crtools.c b/crtools.c
> > index a6ee2d7..fe77f39 100644
> > --- a/crtools.c
> > +++ b/crtools.c
> > @@ -204,6 +204,7 @@ int main(int argc, char *argv[], char *envp[])
> > { "inherit-fd", required_argument, 0, 1062 },
> > { "feature", required_argument, 0, 1063 },
> > { "skip-mnt", required_argument, 0, 1064},
> > + { "enable-external-sharing", no_argument, 0, 1065 },
> > { },
> > };
> >
> > @@ -421,6 +422,9 @@ int main(int argc, char *argv[], char *envp[])
> > if (!add_skip_mount(optarg))
> > return 1;
> > break;
> > + case 1065:
> > + opts.enable_external_sharing = true;
> > + break;
> > case 'M':
> > {
> > char *aux;
> > @@ -649,6 +653,8 @@ usage:
> > " add external mount mapping\n"
> > " -M|--ext-mount-map auto\n"
> > " attempt to autodetect external mount mapings\n"
> > +" --enable-external-sharing\n"
> > +" allow autoresolving mounts with external sharing\n"
> > " --manage-cgroups dump or restore cgroups the process is in\n"
> > " --cgroup-root [controller:]/newroot\n"
> > " change the root cgroup the controller will be\n"
> > diff --git a/include/cr_options.h b/include/cr_options.h
> > index f1cfc84..29be2c8 100644
> > --- a/include/cr_options.h
> > +++ b/include/cr_options.h
> > @@ -63,6 +63,7 @@ struct cr_options {
> > char *new_global_cg_root;
> > struct list_head new_cgroup_roots;
> > bool autodetect_ext_mounts;
> > + bool enable_external_sharing;
> > bool aufs; /* auto-deteced, not via cli */
> > };
> >
> > diff --git a/include/proc_parse.h b/include/proc_parse.h
> > index a0fee1f..e5d59d2 100644
> > --- a/include/proc_parse.h
> > +++ b/include/proc_parse.h
> > @@ -130,6 +130,7 @@ struct mount_info {
> > struct ns_id *nsid;
> >
> > struct ext_mount *external;
> > + bool internal_sharing;
> >
> > /* tree linkage */
> > struct mount_info *parent;
> > diff --git a/mount.c b/mount.c
> > index 154c389..fc334cf 100644
> > --- a/mount.c
> > +++ b/mount.c
> > @@ -734,6 +734,14 @@ static int resolve_external_mounts(struct mount_info *info)
> > if (!match)
> > continue;
> >
> > + if (m->flags & MS_SHARED) {
> > + if (!opts.enable_external_sharing)
> > + continue;
> > +
> > + if (m->shared_id != match->shared_id)
> > + m->internal_sharing = true;
> > + }
> > +
> > size = strlen(match->mountpoint + 1) + strlen(m->root) + 1;
> > p = xmalloc(sizeof(char) * size);
> > if (!p)
> > @@ -1312,6 +1320,11 @@ static int dump_one_mountpoint(struct mount_info *pm, struct cr_img *img)
> > me.with_plugin = true;
> > }
> >
> > + if (pm->internal_sharing) {
> > + me.has_internal_sharing = true;
> > + me.internal_sharing = true;
> > + }
> > +
> > if (pm->external) {
> > /*
> > * For external mount points dump the mapping's
> > @@ -1653,6 +1666,7 @@ static int restore_ext_mount(struct mount_info *mi)
> > static int do_bind_mount(struct mount_info *mi)
> > {
> > bool shared = 0;
> > + bool force_private_remount = false;
> >
> > if (!mi->need_plugin) {
> > char *root, rpath[PATH_MAX];
> > @@ -1666,6 +1680,7 @@ static int do_bind_mount(struct mount_info *mi)
> > * to proper location in the namespace we restore.
> > */
> > root = mi->root;
> > + force_private_remount = mi->internal_sharing;
> > goto do_bind;
> > }
> >
> > @@ -1702,7 +1717,7 @@ do_bind:
> > * shared - the mount is in the same shared group with mi->bind
> > * mi->shared_id && !shared - create a new shared group
> > */
> > - if (restore_shared_options(mi, !shared && !mi->master_id,
> > + if (restore_shared_options(mi, force_private_remount || (!shared && !mi->master_id),
> > mi->shared_id && !shared,
> > mi->master_id))
> > return -1;
> > @@ -2014,6 +2029,9 @@ static int collect_mnt_from_image(struct mount_info **pms, struct ns_id *nsid)
> > if (!pm->source)
> > goto err;
> >
> > + if (me->has_internal_sharing)
> > + pm->internal_sharing = me->internal_sharing;
> > +
> > /* FIXME: abort unsupported early */
> > pm->fstype = decode_fstype(me->fstype);
> >
> > diff --git a/protobuf/mnt.proto b/protobuf/mnt.proto
> > index 343bd6d..3244411 100644
> > --- a/protobuf/mnt.proto
> > +++ b/protobuf/mnt.proto
> > @@ -35,4 +35,5 @@ message mnt_entry {
> >
> > optional bool with_plugin = 12;
> > optional bool ext_mount = 13;
> > + optional bool internal_sharing = 14;
> > }
> >
>
More information about the CRIU
mailing list