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

Ruslan Kuprieiev kupruser at gmail.com
Wed Sep 10 01:18:49 PDT 2014


Thanks! Everything works now.

Tested-by: Ruslan Kuprieiev <kupruser at gmail.com>

On 09.09.2014 23:17, Andrey Vagin wrote:
> Currently we stript options only one of brothers, but
> mount_equal() thinks that two brothers should have the same options.
>
> 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;



More information about the CRIU mailing list