[CRIU] [PATCH v5 5/5] mount: Restore binfmt_misc content in case of missing mount

Kirill Tkhai ktkhai at virtuozzo.com
Thu Aug 4 06:49:48 PDT 2016


In case of mount image is not containing binfmt_misc mountpoint,
add temporary mountpoint to mount tree and try to restore
binfmt_misc content in ordinary way. Then, umount temporary mountpoint.

v4: New
v5: Check for opts.has_binfmt_misc to determine if image presents

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 criu/mount.c |   19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/criu/mount.c b/criu/mount.c
index 926817a..964dbbc 100644
--- a/criu/mount.c
+++ b/criu/mount.c
@@ -2451,6 +2451,15 @@ static int do_new_mount(struct mount_info *mi)
 	if (tp->restore && tp->restore(mi))
 		return -1;
 
+	if (!mi->mnt_id) {
+		/* C-r time mountpoint, umount it */
+		if (umount(mi->mountpoint) < 0) {
+			pr_perror("Can't umount %s\n", mi->mountpoint);
+			return -1;
+		}
+		goto out;
+	}
+
 	if (remount_ro && mount(NULL, mi->mountpoint, tp->name,
 				     MS_REMOUNT | MS_RDONLY, NULL)) {
 		pr_perror("Unable to apply mount options");
@@ -2470,7 +2479,7 @@ static int do_new_mount(struct mount_info *mi)
 	BUG_ON(mi->master_id);
 	if (restore_shared_options(mi, !mi->shared_id, mi->shared_id, 0))
 		return -1;
-
+out:
 	mi->mounted = true;
 
 	return 0;
@@ -3339,6 +3348,7 @@ static int populate_mnt_ns(void)
 	struct mount_info *pms;
 	struct ns_id *nsid;
 	struct mount_info *roots_mp = NULL;
+	struct stat st;
 	int ret;
 
 	if (mnt_roots) {
@@ -3355,6 +3365,13 @@ static int populate_mnt_ns(void)
 	if (!pms)
 		return -1;
 
+	if (!opts.has_binfmt_misc && stat_image(CR_FD_BINFMT_MISC, &st, 0) == 0) {
+		/* Add to mount tree. Generic code will mount it later */
+		ret = add_cr_time_mount(pms, "binfmt_misc", BINFMT_MISC_HOME, 0);
+		if (ret)
+			return -1;
+	}
+
 	if (resolve_shared_mounts(mntinfo, pms->master_id))
 		return -1;
 



More information about the CRIU mailing list