[CRIU] [PATCH] mnt: Helper and comment for shared mounts validation
Pavel Emelyanov
xemul at parallels.com
Fri Oct 31 02:50:45 PDT 2014
Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
---
mount.c | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/mount.c b/mount.c
index f62fd04..f8afc63 100644
--- a/mount.c
+++ b/mount.c
@@ -372,6 +372,25 @@ static int try_resolve_ext_mount(struct mount_info *info)
info->external = em;
return 0;
}
+
+static struct mount_info *find_shared_peer_for(struct mount_info *m, struct mount_info *at)
+{
+ struct mount_info *s;
+
+ list_for_each_entry(s, &at->children, siblings)
+ if (mounts_equal(m, s, false))
+ return s;
+
+ return NULL;
+}
+
+/*
+ * Children set of shared mounts should concide.
+ * We check each mount with its next peer only,
+ * thus any set of shared mounts will be checked
+ * on-by-one.
+ */
+
static int validate_shared(struct mount_info *m)
{
struct mount_info *ct, *t;
@@ -380,12 +399,8 @@ static int validate_shared(struct mount_info *m)
return 0;
t = list_first_entry(&m->parent->mnt_share, struct mount_info, mnt_share);
-
- list_for_each_entry(ct, &t->children, siblings) {
- if (mounts_equal(m, ct, false))
- break;
- }
- if (&ct->siblings == &t->children) {
+ ct = find_shared_peer_for(m, t);
+ if (!ct) {
pr_err("Two shared mounts %d, %d have different sets of children\n",
m->parent->mnt_id, t->mnt_id);
pr_err("%d:%s doesn't have a proper point for %d:%s\n",
--
1.8.4.2
More information about the CRIU
mailing list