[CRIU] [PATCH 1/2] mount: strip options for all mounts
Andrey Vagin
avagin at openvz.org
Tue Sep 9 13:17:46 PDT 2014
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;
--
1.9.3
More information about the CRIU
mailing list