From: Andrei Vagin <ava...@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
Signed-off-by: Andrei Vagin <ava...@virtuozzo.com>
---
 criu/mount.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/criu/mount.c b/criu/mount.c
index d889732..50c5b79 100644
--- a/criu/mount.c
+++ b/criu/mount.c
@@ -1123,10 +1123,22 @@ 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.
+                */
+               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;
 
-- 
1.8.3.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to