[CRIU] [PATCH 08/13] mounts: bind mount one root for all namespaces

Pavel Emelyanov xemul at parallels.com
Tue Mar 11 12:42:09 PDT 2014


On 03/11/2014 07:18 PM, Andrey Vagin wrote:

I don't understand the subject, plz, rephrase.

> Currently we support nested mount namespaces, only if all of them have
> the same root.
> 
> crtools doesn't mount root, so it should be bind-mounted for all
> namespaces.
> 
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  mount.c | 24 ++++++++++++++++++++----
>  1 file changed, 20 insertions(+), 4 deletions(-)
> 
> diff --git a/mount.c b/mount.c
> index 22df8e9..a1e1748 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -239,6 +239,12 @@ static struct mount_info *mnt_build_ids_tree(struct mount_info *list)
>  					m->mnt_id, m->parent_mnt_id, m->mountpoint,
>  					root ? "found" : "not found");
>  			if (root && m->is_root) {
> +				if (!mounts_equal(root, m, true) ||
> +					(strcmp(root->root, m->root))) {
> +					pr_err("Nested mount namespaces with different roots are not supported yet");
> +					return NULL;
> +				}
> +
>  				/*
>  				 * A root of a sub mount namespace is
>  				 * mounted in a temporary directory in the
> @@ -1011,6 +1017,10 @@ static int propagate_mount(struct mount_info *mi)
>  	struct mount_info *t;
>  
>  	propagate_siblings(mi);
> +
> +	if (mi->parent == NULL)
> +		goto skip;

Why?

> +
>  	umount_from_slaves(mi);
>  
>  	/* Propagate this mount to everyone from a parent group */
> @@ -1028,11 +1038,13 @@ static int propagate_mount(struct mount_info *mi)
>  		}
>  	}
>  
> +skip:
>  	/*
>  	 * FIXME Currently non-root mounts can be restored
> -	 * only if a proper root mount exists
> +	 * only if a proper root mount exists.
> +	 * Here is one exception for sub-roots. Roots of all mntns are the same.
>  	 */
> -	if (fsroot_mounted(mi))
> +	if (mi->parent == NULL || fsroot_mounted(mi))

mi->parent is not NULL for sub-roots, you fixed it with previous patch:

+				/*
+				 * A root of a sub mount namespace is
+				 * mounted in a temporary directory in the
+				 * root mount namespace, so its parent is
+				 * the main root.
+				 */
+				p = root;

>  		list_for_each_entry(t, &mi->mnt_bind, mnt_bind) {
>  			if (t->bind)
>  				continue;
> @@ -1154,8 +1166,11 @@ static int do_mount_one(struct mount_info *mi)
>  {
>  	int ret;
>  
> -	if (!mi->parent)
> -		return 0;
> +	if (!mi->parent) {
> +		mi->mounted = true;
> +		ret = restore_shared_options(mi, 0, mi->shared_id, 0);
> +		goto propagate;
> +	}
>  
>  	if (mi->mounted)
>  		return 0;
> @@ -1172,6 +1187,7 @@ static int do_mount_one(struct mount_info *mi)
>  	else
>  		ret = do_bind_mount(mi);
>  
> +propagate:
>  	if (ret == 0 && propagate_mount(mi))
>  		return -1;
>  
> 




More information about the CRIU mailing list