[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