[CRIU] [PATCH 2/5] mnt: add --enable-external-sharing flag
Tycho Andersen
tycho.andersen at canonical.com
Thu Apr 9 09:32:33 PDT 2015
With this flag, external shared bind mounts are attempted to be resolved
automatically.
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;
}
--
2.1.0
More information about the CRIU
mailing list