[CRIU] [PATCH 9/9] mounts: handle bind-mounts

Andrey Vagin avagin at openvz.org
Wed Jul 24 04:10:23 EDT 2013


A non-root mount is bind-mounted from a proper root mount.

Non-root mount without root mount is not supported yet

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

diff --git a/mount.c b/mount.c
index 8016dcc..3ede19a 100644
--- a/mount.c
+++ b/mount.c
@@ -224,13 +224,20 @@ static int collect_shared(struct mount_info *info)
 				list_add(&t->mnt_share, &m->mnt_share);
 			}
 		}
-		if (!need_master)
-			continue;
 
-		pr_err("Mount %d (master_id: %d shared_id: %d) "
-		       "has unreachable sharing\n", m->mnt_id,
-			m->master_id, m->shared_id);
-		return -1;
+		if (need_master) {
+			pr_err("Mount %d (master_id: %d shared_id: %d) "
+			       "has unreachable sharing\n", m->mnt_id,
+				m->master_id, m->shared_id);
+			return -1;
+		}
+
+		/* Search bind-mounts */
+		if (list_empty(&m->mnt_bind))
+			for (t = m->next; t; t = t->next) {
+				if (mounts_equal(m, t, true))
+					list_add(&t->mnt_bind, &m->mnt_bind);
+			}
 	}
 
 	return 0;
@@ -703,6 +710,11 @@ static int propagate_siblings(struct mount_info *mi)
 	return 0;
 }
 
+static inline int fsroot_mounted(struct mount_info *mi)
+{
+	return is_root(mi->root);
+}
+
 static int propagate_mount(struct mount_info *mi)
 {
 	struct mount_info *t;
@@ -725,6 +737,19 @@ static int propagate_mount(struct mount_info *mi)
 		}
 	}
 
+	/*
+	 * FIXME Currently non-root mounts can be restored
+	 * only if a proper root mount exists
+	 */
+	if (fsroot_mounted(mi))
+		list_for_each_entry(t, &mi->mnt_bind, mnt_bind) {
+			if (t->bind)
+				continue;
+			if (t->master_id)
+				continue;
+			t->bind = mi;
+		}
+
 	return 0;
 }
 
@@ -799,11 +824,6 @@ static int do_bind_mount(struct mount_info *mi)
 	return 0;
 }
 
-static inline int fsroot_mounted(struct mount_info *mi)
-{
-	return is_root(mi->root);
-}
-
 static int do_mount_one(struct mount_info *mi)
 {
 	int ret;
-- 
1.8.3.1



More information about the CRIU mailing list