[CRIU] [PATCH 8/9] mount: remove validate_shared as now we allow non-uniform sharings
Pavel Tikhomirov
ptikhomirov at virtuozzo.com
Tue Jul 10 19:02:30 MSK 2018
Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
---
criu/mount.c | 104 +--------------------------------------------------
1 file changed, 1 insertion(+), 103 deletions(-)
diff --git a/criu/mount.c b/criu/mount.c
index eb801dbce..d64a97fed 100644
--- a/criu/mount.c
+++ b/criu/mount.c
@@ -512,104 +512,6 @@ static int try_resolve_ext_mount(struct mount_info *info)
return 0;
}
-static struct mount_info *find_wider_shared(struct mount_info *m)
-{
- struct mount_info *p;
-
- /*
- * Try to find a mount, which is wider or equal.
- * A is wider than B, if A->root is a subpath of B->root.
- */
- list_for_each_entry(p, &m->mnt_share, mnt_share)
- if (issubpath(m->root, p->root))
- return p;
-
- return NULL;
-}
-
-static struct mount_info *find_shared_peer(struct mount_info *m,
- struct mount_info *ct, char *ct_mountpoint)
-{
- struct mount_info *cm;
-
- list_for_each_entry(cm, &m->children, siblings) {
- if (strcmp(ct_mountpoint, cm->mountpoint))
- continue;
-
- if (!mounts_equal(cm, ct))
- break;
-
- return cm;
- }
-
- return NULL;
-}
-
-static int validate_shared(struct mount_info *m)
-{
- struct mount_info *t, *ct;
- char buf[PATH_MAX], *sibling_path;
- LIST_HEAD(children);
-
- /*
- * Check that all mounts in one shared group has the same set of
- * children. Only visible children are accounted. A non-root bind-mount
- * doesn't see children out of its root and it's expected case.
- *
- * Here is a few conditions:
- * 1. t is wider than m
- * 2. We search a wider mount in the same direction, so when we
- * enumerate all mounts, we can't be sure that all of them
- * has the same set of children.
- */
-
- t = find_wider_shared(m);
- if (!t)
- /*
- * The current mount is the widest one in its shared group,
- * all others will be compared to it or with some other,
- * which will be compared to it.
- */
- return 0;
-
- /* Search a child, which is visible in both mounts. */
- list_for_each_entry(ct, &t->children, siblings) {
- struct mount_info *cm;
-
- if (ct->is_ns_root || ct->mnt_id == CRTIME_MNT_ID)
- continue;
-
- sibling_path = mnt_get_sibling_path(ct, m, buf, sizeof(buf));
- if (sibling_path == NULL)
- continue;
-
- cm = find_shared_peer(m, ct, sibling_path);
- if (!cm)
- goto err;
-
- /*
- * Keep this one aside. At the end of t's children scan we should
- * move _all_ m's children here (the list_empty check below).
- */
- list_move(&cm->siblings, &children);
- }
-
- /* Now all real mounts should be moved */
- list_for_each_entry(ct, &m->children, siblings) {
- if (ct->mnt_id != CRTIME_MNT_ID)
- goto err;
- }
-
- list_splice(&children, &m->children);
- return 0;
-
-err:
- list_splice(&children, &m->children);
- pr_err("%d:%s and %d:%s have different set of mounts\n",
- m->mnt_id, m->mountpoint, t->mnt_id, t->mountpoint);
- return -1;
-}
-
/*
* Find the mount_info from which the respective bind-mount
* can be created. It can be either an FS-root mount, or the
@@ -722,9 +624,6 @@ static int validate_mounts(struct mount_info *info, bool for_dump)
/* root mount can be any */
continue;
- if (m->shared_id && validate_shared(m))
- return -1;
-
if (validate_children_collision(m))
return -1;
@@ -2880,8 +2779,7 @@ static int get_mp_root(MntEntry *me, struct mount_info *mi)
* to ->root can confuse mnt_is_external and other functions
* which expect to see the path in the file system to the root
* of these mount (mounts_equal, mnt_build_ids_tree,
- * find_wider_shared, find_fsroot_mount_for,
- * find_best_external_match, etc.)
+ * find_fsroot_mount_for, find_best_external_match, etc.)
*/
me->root = NO_ROOT_MOUNT;
}
--
2.17.0
More information about the CRIU
mailing list