[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