[CRIU] [PATCH 1/2] mount: strip options for all mounts

Andrew Vagin avagin at parallels.com
Wed Sep 10 05:50:10 PDT 2014


On Wed, Sep 10, 2014 at 12:17:46AM +0400, Andrey Vagin wrote:
> Currently we stript options only one of brothers, but
> mount_equal() thinks that two brothers should have the same options.

I have sent two more patches, which fix the root cause of the problem.
But I would like to have this patch in the upstream repo, because it
isn't obvious for me, that strip() changes the argument.

Thanks.

> 
> Execute zdtm/live/static/mountpoints
> ./mountpoints --pidfile=mountpoints.pid --outfile=mountpoints.out
> Dump 2737
> WARNING: mountpoints returned 1 and left running for debug needs
> Test: zdtm/live/static/mountpoints, Result: FAIL
> ==================================== ERROR ====================================
> Test: zdtm/live/static/mountpoints, Namespace:
> Dump log   : /root/git/criu/test/dump/static/mountpoints/2737/1/dump.log
> --------------------------------- grep Error ---------------------------------
> (00.146444) Error (mount.c:399): Two shared mounts 50, 67 have different sets of children
> (00.146460) Error (mount.c:402): 67:./zdtm_mpts/dev/share-1 doesn't have a proper point for 54:./zdtm_mpts/dev/share-3/test.mnt.share
> (00.146820) Error (cr-dump.c:1921): Dumping FAILED.
> ------------------------------------- END -------------------------------------
> ================================= ERROR OVER =================================
> 
> Reported-by: Ruslan Kuprieiev <kupruser at gmail.com>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  mount.c      | 15 +--------------
>  proc_parse.c | 13 ++++++++-----
>  2 files changed, 9 insertions(+), 19 deletions(-)
> 
> diff --git a/mount.c b/mount.c
> index f7bb5f0..001aa45 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -902,19 +902,6 @@ uns:
>  	return &fstypes[0];
>  }
>  
> -static char *strip(char *opt)
> -{
> -	int len;
> -
> -	len = strlen(opt);
> -	if (len > 1 && opt[len - 1] == ',')
> -		opt[len - 1] = '\0';
> -	if (opt[0] == ',')
> -		opt++;
> -
> -	return opt;
> -}
> -
>  static int dump_one_mountpoint(struct mount_info *pm, int fd)
>  {
>  	MntEntry me = MNT_ENTRY__INIT;
> @@ -941,7 +928,7 @@ static int dump_one_mountpoint(struct mount_info *pm, int fd)
>  	me.flags		= pm->flags;
>  	me.mountpoint		= pm->mountpoint + 1;
>  	me.source		= pm->source;
> -	me.options		= strip(pm->options);
> +	me.options		= pm->options;
>  	me.shared_id		= pm->shared_id;
>  	me.has_shared_id	= true;
>  	me.master_id		= pm->master_id;
> diff --git a/proc_parse.c b/proc_parse.c
> index 45a3503..39cc543 100644
> --- a/proc_parse.c
> +++ b/proc_parse.c
> @@ -797,6 +797,7 @@ static int do_opt2flag(char *opt, unsigned *flags,
>  {
>  	int i;
>  	char *end;
> +	size_t uoff = 0;
>  
>  	while (1) {
>  		end = strchr(opt, ',');
> @@ -815,15 +816,17 @@ static int do_opt2flag(char *opt, unsigned *flags,
>  				return -1;
>  			}
>  
> -			strcpy(unknown, opt);
> -			unknown += strlen(opt);
> -			*unknown = ',';
> -			unknown++;
> +			strcpy(unknown + uoff, opt);
> +			uoff += strlen(opt);
> +			unknown[uoff] = ',';
> +			uoff++;
>  		}
>  
>  		if (!end) {
> +			if (uoff)
> +				uoff--;
>  			if (unknown)
> -				*unknown = '\0';
> +				unknown[uoff] = '\0';
>  			break;
>  		} else
>  			opt = end + 1;
> -- 
> 1.9.3
> 


More information about the CRIU mailing list