[CRIU] [PATCH 3/9] mntns: pivot_root() can move the current root to a non-shared mount

Andrey Vagin avagin at openvz.org
Thu Oct 23 06:49:01 PDT 2014


So we need to create a temporary private mount for the old root.

Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 mount.c | 27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/mount.c b/mount.c
index 07f6db4..ac89baa 100644
--- a/mount.c
+++ b/mount.c
@@ -1465,6 +1465,7 @@ static int clean_mnt_ns(struct mount_info *mntinfo_tree)
 static int cr_pivot_root(char *root)
 {
 	char put_root[] = "crtools-put-root.XXXXXX";
+	int exit_code = -1;
 
 	pr_info("Move the root to %s\n", root ? : ".");
 
@@ -1480,11 +1481,19 @@ static int cr_pivot_root(char *root)
 		return -1;
 	}
 
+	if (mount(put_root, put_root, NULL, MS_BIND, NULL)) {
+		pr_perror("Unable to mount tmpfs in %s", put_root);
+		goto err_root;
+	}
+
+	if (mount(NULL, put_root, NULL, MS_PRIVATE, NULL)) {
+		pr_perror("Can't remount %s with MS_PRIVATE", put_root);
+		goto err_tmpfs;
+	}
+
 	if (pivot_root(".", put_root)) {
 		pr_perror("pivot_root(., %s) failed", put_root);
-		if (rmdir(put_root))
-			pr_perror("Can't remove the directory %s", put_root);
-		return -1;
+		goto err_tmpfs;
 	}
 
 	if (mount("none", put_root, "none", MS_REC|MS_PRIVATE, NULL)) {
@@ -1492,16 +1501,26 @@ static int cr_pivot_root(char *root)
 		return -1;
 	}
 
+	exit_code = 0;
+
 	if (umount2(put_root, MNT_DETACH)) {
 		pr_perror("Can't umount %s", put_root);
 		return -1;
 	}
+
+err_tmpfs:
+	if (umount2(put_root, MNT_DETACH)) {
+		pr_perror("Can't umount %s", put_root);
+		return -1;
+	}
+
+err_root:
 	if (rmdir(put_root)) {
 		pr_perror("Can't remove the directory %s", put_root);
 		return -1;
 	}
 
-	return 0;
+	return exit_code;
 }
 
 struct mount_info *mnt_entry_alloc()
-- 
1.9.3



More information about the CRIU mailing list