[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