[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