[CRIU] [PATCH] mnt: don't match the wrong nested bind mount

Tycho Andersen tycho.andersen at canonical.com
Wed Apr 15 08:00:37 PDT 2015


Andrey reported this issue and it took me a while to figure out exactly what
might cause it. I think the comment describes it accurately, as with that
example I end up with mountinfo on the host like:

47 23 253:1 /root/bind1/subdir /root/bind2 rw,relatime shared:1 - ext4 /dev/disk/by-uuid/6c5a78e0-95fa-49a8-aa91-a8093d295e58 rw,data=ordered
48 23 253:1 /root/bind1 /root/bind3 rw,relatime shared:1 - ext4 /dev/disk/by-uuid/6c5a78e0-95fa-49a8-aa91-a8093d295e58 rw,data=ordered

Reported-by: Andrew Vagin <avagin at odin.com>
CC: Andrew Vagin <avagin at odin.com>
Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
---
 mount.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/mount.c b/mount.c
index 1bb2ebc..b47041d 100644
--- a/mount.c
+++ b/mount.c
@@ -674,6 +674,20 @@ static struct mount_info *find_best_external_match(struct mount_info *list, stru
 		if (!mounts_equal(info, it, true))
 			continue;
 
+		/*
+		 * This means we have a situation like:
+		 *
+		 * root at criu:~# mount --bind bind1/subdir/ bind2
+		 * root at criu:~# mount --bind bind1/ bind3
+		 *
+		 * outside the container, and bind1 is directly bind mounted
+		 * inside the container. mounts_equal() considers these mounts
+		 * equal for bind purposes, but their roots are different, and
+		 * we want to match the one with the right root.
+		 */
+		if (!issubpath(info->root, it->root))
+			continue;
+
 		candidate = it;
 
 		/*
-- 
2.1.4



More information about the CRIU mailing list