[CRIU] [PATCH 3/5] mnt: add --enable-external-masters option

Tycho Andersen tycho.andersen at canonical.com
Thu Apr 9 09:32:34 PDT 2015


This option enables external (slave) bind mounts to be resolved.

v2: don't always assume that when the master id matches, the mounts match

Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
---
 crtools.c            | 11 +++++++++++
 include/cr_options.h |  1 +
 mount.c              | 14 ++++++++++++++
 3 files changed, 26 insertions(+)

diff --git a/crtools.c b/crtools.c
index fe77f39..095c86e 100644
--- a/crtools.c
+++ b/crtools.c
@@ -205,6 +205,7 @@ int main(int argc, char *argv[], char *envp[])
 		{ "feature",		required_argument,	0, 1063	},
 		{ "skip-mnt",		required_argument,	0, 1064},
 		{ "enable-external-sharing", no_argument, 	0, 1065 },
+		{ "enable-external-masters", no_argument, 	0, 1066 },
 		{ },
 	};
 
@@ -425,6 +426,9 @@ int main(int argc, char *argv[], char *envp[])
 		case 1065:
 			opts.enable_external_sharing = true;
 			break;
+		case 1066:
+			opts.enable_external_masters = true;
+			break;
 		case 'M':
 			{
 				char *aux;
@@ -461,6 +465,11 @@ int main(int argc, char *argv[], char *envp[])
 		return 1;
 	}
 
+	if (!opts.autodetect_ext_mounts && (opts.enable_external_masters || opts.enable_external_sharing)) {
+		pr_msg("must specify --ext-mount-map auto with --enable-external-{sharing|masters}");
+		return 1;
+	}
+
 	if (work_dir == NULL)
 		work_dir = imgs_dir;
 
@@ -655,6 +664,8 @@ usage:
 "                        attempt to autodetect external mount mapings\n"
 "  --enable-external-sharing\n"
 "                        allow autoresolving mounts with external sharing\n"
+"  --enable-external-masters\n"
+"                        allow autoresolving mounts with external masters\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 29be2c8..28bed45 100644
--- a/include/cr_options.h
+++ b/include/cr_options.h
@@ -64,6 +64,7 @@ struct cr_options {
 	struct list_head	new_cgroup_roots;
 	bool			autodetect_ext_mounts;
 	bool			enable_external_sharing;
+	bool			enable_external_masters;
 	bool			aufs;		/* auto-deteced, not via cli */
 };
 
diff --git a/mount.c b/mount.c
index fc334cf..3a44e97 100644
--- a/mount.c
+++ b/mount.c
@@ -742,6 +742,20 @@ static int resolve_external_mounts(struct mount_info *info)
 				m->internal_sharing = true;
 		}
 
+		if (m->flags & MS_SLAVE) {
+			if (!opts.enable_external_masters)
+				continue;
+
+			/*
+			 * In order to support something like internal slavery,
+			 * we need to teach can_mount_now and do_mount_one
+			 * about slavery relationships in external mounts. This
+			 * seems like an uncommon case, so we punt for not.
+			 */
+			if (m->master_id != match->shared_id)
+				continue;
+		}
+
 		size = strlen(match->mountpoint + 1) + strlen(m->root) + 1;
 		p = xmalloc(sizeof(char) * size);
 		if (!p)
-- 
2.1.0



More information about the CRIU mailing list