[Devel] [PATCH criu-stable 1/3] mount: don't lose shared options for bind mounts

Andrew Vagin avagin at virtuozzo.com
Mon Jun 25 22:15:59 MSK 2018


Do we need these patches for the upstram criu?

On Mon, Jun 25, 2018 at 05:39:53PM +0300, Pavel Tikhomirov wrote:
> When we bind-mount something as a child of shared group, child will be
> created shared, so we should fix sharing flags after bind but not
> before.
> 
> Bigger problem we face is: when some mount is wrongly created shared
> instead of private, it's children can be duplicated, and migration may 
> hit container limit on number of mounts, after couple of iterations.
> 
> https://jira.sw.ru/browse/PSBM-85251
> 
> Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
> ---
>  criu/mount.c | 42 +++++++++++++++++++-----------------------
>  1 file changed, 19 insertions(+), 23 deletions(-)
> 
> diff --git a/criu/mount.c b/criu/mount.c
> index c745932c6..ffe11a22b 100644
> --- a/criu/mount.c
> +++ b/criu/mount.c
> @@ -2093,24 +2093,6 @@ static char *resolve_source(struct mount_info *mi)
>  	return NULL;
>  }
>  
> -static int __restore_shared_options(char *mountpoint, bool private, bool shared, bool slave)
> -{
> -	if (private && mount(NULL, mountpoint, NULL, MS_PRIVATE, NULL)) {
> -		pr_perror("Unable to make %s private", mountpoint);
> -		return -1;
> -	}
> -	if (slave && mount(NULL, mountpoint, NULL, MS_SLAVE, NULL)) {
> -		pr_perror("Unable to make %s slave", mountpoint);
> -		return -1;
> -	}
> -	if (shared && mount(NULL, mountpoint, NULL, MS_SHARED, NULL)) {
> -		pr_perror("Unable to make %s shared", mountpoint);
> -		return -1;
> -	}
> -
> -	return 0;
> -}
> -
>  static int restore_shared_options(struct mount_info *mi, bool private, bool shared, bool slave)
>  {
>  	pr_debug("%d:%s private %d shared %d slave %d\n",
> @@ -2123,7 +2105,20 @@ static int restore_shared_options(struct mount_info *mi, bool private, bool shar
>  			return mount(NULL, mi->mountpoint, NULL, MS_UNBINDABLE, NULL);
>  	}
>  
> -	return __restore_shared_options(mi->mountpoint, private, shared, slave);
> +	if (private && mount(NULL, mi->mountpoint, NULL, MS_PRIVATE, NULL)) {
> +		pr_perror("Unable to make %s private", mi->mountpoint);
> +		return -1;
> +	}
> +	if (slave && mount(NULL, mi->mountpoint, NULL, MS_SLAVE, NULL)) {
> +		pr_perror("Unable to make %s slave", mi->mountpoint);
> +		return -1;
> +	}
> +	if (shared && mount(NULL, mi->mountpoint, NULL, MS_SHARED, NULL)) {
> +		pr_perror("Unable to make %s shared", mi->mountpoint);
> +		return -1;
> +	}
> +
> +	return 0;
>  }
>  
>  /*
> @@ -2534,10 +2529,6 @@ static int do_bind_mount(struct mount_info *mi)
>  		pr_perror("Unable to open %s", mnt_clean_path);
>  		return -1;
>  	}
> -	if (__restore_shared_options(mnt_path, private,
> -				   mi->shared_id && !shared,
> -				   mi->master_id && !master))
> -		return -1;
>  
>  	if (mnt_path == NULL)
>  		return -1;
> @@ -2619,6 +2610,11 @@ static int do_bind_mount(struct mount_info *mi)
>  		}
>  	}
>  out:
> +	if (restore_shared_options(mi, private,
> +				   mi->shared_id && !shared,
> +				   mi->master_id && !master))
> +		return -1;
> +
>  	mi->mounted = true;
>  	exit_code = 0;
>  err:
> -- 
> 2.17.0
> 


More information about the Devel mailing list