[CRIU] [PATCH 4/5] mount: clone a mount namespace to open a detached mount

Andrei Vagin avagin at openvz.org
Tue Feb 7 00:43:30 PST 2017


From: Andrei Vagin <avagin at virtuozzo.com>

If we can't create a temporary directory for a detached mount,
we can clone a whole mount namespace, open a mount and release
the created namespace. The result will be the same.

https://jira.sw.ru/browse/PSBM-57135
https://github.com/opencontainers/runc/issues/1202
Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
---
 criu/mount.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/criu/mount.c b/criu/mount.c
index cbbc154..8f66b4e 100644
--- a/criu/mount.c
+++ b/criu/mount.c
@@ -1091,10 +1091,23 @@ int open_mountpoint(struct mount_info *pm)
 		goto out;
 
 	mnt_path = get_clean_mnt(pm, mnt_path_tmp, mnt_path_root);
-	if (mnt_path == NULL)
-		goto out;
+	if (mnt_path == NULL) {
+		/*
+		 * We probably can't create a temporary direcotry,
+		 * so we can try to clone the mount namespace, open
+		 * the required mount and destroy this mount namespace
+		 * by calling restore_ns() below in this function.
+		 */
+		if (unshare(CLONE_NEWNS)) {
+			pr_perror("Unable to clone a mount namespace");
+			goto out;
+		}
 
-	fd = open_detach_mount(mnt_path);
+		fd = open(pm->mountpoint, O_RDONLY | O_DIRECTORY, 0);
+		if (fd < 0)
+			pr_perror("Can't open directory %s: %d", pm->mountpoint, fd);
+	} else
+		fd = open_detach_mount(mnt_path);
 	if (fd < 0)
 		goto out;
 
-- 
2.7.4



More information about the CRIU mailing list