[CRIU] [PATCH 12/13] mount: allow to dump and restore nested mount namespaces

Pavel Emelyanov xemul at parallels.com
Tue Mar 11 12:50:20 PDT 2014


On 03/11/2014 07:18 PM, Andrey Vagin wrote:
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  namespaces.c |  2 +-
>  pstree.c     | 25 ++++++++++++++++++-------
>  2 files changed, 19 insertions(+), 8 deletions(-)
> 
> diff --git a/namespaces.c b/namespaces.c
> index f45e088..b8036a3 100644
> --- a/namespaces.c
> +++ b/namespaces.c
> @@ -182,7 +182,7 @@ static unsigned int generate_ns_id(int pid, unsigned int kid, struct ns_desc *nd
>  			BUG_ON(current_ns_mask & nd->cflag);
>  			pr_info("Will take %s namespace in the image\n", nd->str);
>  			current_ns_mask |= nd->cflag;
> -		} else {
> +		} else if (nd->cflag != CLONE_NEWNS) {
>  			pr_err("Can't dump nested %s namespace for %d\n",
>  					nd->str, pid);
>  			return 0;
> diff --git a/pstree.c b/pstree.c
> index f2f3fc7..aac29c7 100644
> --- a/pstree.c
> +++ b/pstree.c
> @@ -635,19 +635,30 @@ static int prepare_pstree_kobj_ids(void)
>  set_mask:
>  		item->rst->clone_flags = cflags;
>  
> +		if (item == root_item) {
> +			pr_info("Will restore in %lx namespaces\n", cflags);
> +			current_ns_mask = cflags & CLONE_ALLNS;
> +			continue;
> +		}
> +
> +		/*
> +		 * Nested mount namespaces are supported only
> +		 * nobody shares external mntns.
> +		 */
> +		if (cflags & current_ns_mask & CLONE_NEWNS)
> +			cflags &= ~CLONE_NEWNS;

Can we unscrew this up?

> +
>  		/*
>  		 * Workaround for current namespaces model --
>  		 * all tasks should be in one namespace. And
>  		 * this namespace is either inherited from the
>  		 * criu or is created for the init task (only)
>  		 */
> -		if (item == root_item) {
> -			pr_info("Will restore in %lx namespaces\n", cflags);
> -			current_ns_mask = cflags & CLONE_ALLNS;
> -		} else if (cflags & CLONE_ALLNS) {
> -			pr_err("Can't restore sub-task in NS\n");
> -			return -1;
> -		}
> +		if (cflags & CLONE_ALLNS == 0)
> +			continue;
> +
> +		pr_err("Can't restore sub-task in NS\n");
> +		return -1;
>  	}
>  
>  	pr_debug("NS mask to use %lx\n", current_ns_mask);
> 




More information about the CRIU mailing list