[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