[CRIU] [PATCH 8/9] mounts: find mounts, which are propagated from a current one

Andrey Vagin avagin at openvz.org
Tue Jul 9 07:05:55 EDT 2013


A mount is propagated to all members of a parent's shared group

Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 mount.c | 46 ++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 44 insertions(+), 2 deletions(-)

diff --git a/mount.c b/mount.c
index fae9513..42d37db 100644
--- a/mount.c
+++ b/mount.c
@@ -618,6 +618,44 @@ static char *resolve_source(struct mount_info *mi)
 	return NULL;
 }
 
+static int propogate_mount(struct mount_info *mi)
+{
+	struct mount_info *t;
+
+	list_for_each_entry(t, &mi->mnt_share, mnt_share)
+		t->bind = mi;
+
+	list_for_each_entry(t, &mi->mnt_slave_list, mnt_slave)
+		t->bind = mi;
+
+	/* Mart this mnt as mounted for all who in this group */
+	list_for_each_entry(t, &mi->parent->mnt_share, mnt_share) {
+		struct mount_info *c;
+
+		list_for_each_entry(c, &t->children, siblings) {
+			if (mntcmp(mi, c, false))
+				t->mounted = true;
+		}
+	}
+
+	list_for_each_entry(t, &mi->parent->mnt_slave_list, mnt_slave) {
+		struct mount_info *c;
+		list_for_each_entry(c, &t->children, siblings) {
+			if (mntcmp(mi, c, false))
+				t->mounted = true;
+		}
+	}
+
+	if (fsroot_mounted(mi))
+		list_for_each_entry(t, &mi->mnt_bind, mnt_bind) {
+			if (t->bind)
+				continue;
+			t->bind = mi;
+		}
+
+	return 0;
+}
+
 static int do_new_mount(struct mount_info *mi)
 {
 	char *src;
@@ -637,8 +675,8 @@ static int do_new_mount(struct mount_info *mi)
 	if (tp->restore && tp->restore(mi))
 		return -1;
 
-	list_for_each_entry(t, &mi->mnt_bind, mnt_bind)
-		t->bind = mi;
+	if (propogate_mount(mi))
+		return 0;
 
 	return 0;
 }
@@ -654,6 +692,10 @@ static int do_bind_mount(struct mount_info *mi)
 		pr_perror("Can't mount at %s", mi->mountpoint);
 		return -1;
 	}
+
+	if (propogate_mount(mi))
+		return -1;
+
 	return 0;
 }
 
-- 
1.8.3.1



More information about the CRIU mailing list