[CRIU] [PATCH v5 2/5] mount: Create binfmt_misc image w/o device suffix

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


Use name binfmt_misc-0.img for any mounted binfmt_misc.
Note, that newly created binfmt_misc images won't restore
on old criu.

Also, because of above, let's change a behaviour of dump and now
we do not create binfmt_misc images if there is no registered
binfmt_misc entries.

v5: New
Suggested-by: Pavel Emelyanov <xemul at virtuozzo.com>
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 criu/mount.c |   40 ++++++++++++++++++++++++++++++++--------
 1 file changed, 32 insertions(+), 8 deletions(-)

diff --git a/criu/mount.c b/criu/mount.c
index f90ec69..c5533de 100644
--- a/criu/mount.c
+++ b/criu/mount.c
@@ -1361,7 +1361,7 @@ static int dump_binfmt_misc_entry(int dfd, char *name, struct cr_img *img)
 
 static int binfmt_misc_dump(struct mount_info *pm)
 {
-	struct cr_img *img;
+	struct cr_img *img = NULL;
 	struct dirent *de;
 	DIR *fdir = NULL;
 	int fd, ret;
@@ -1381,10 +1381,6 @@ static int binfmt_misc_dump(struct mount_info *pm)
 	}
 
 	ret = -1;
-	img = open_image(CR_FD_BINFMT_MISC, O_DUMP, pm->s_dev);
-	if (!img)
-		goto out;
-
 	while ((de = readdir(fdir))) {
 		if (dir_dots(de))
 			continue;
@@ -1393,6 +1389,13 @@ static int binfmt_misc_dump(struct mount_info *pm)
 		if (!strcmp(de->d_name, "status"))
 			continue;
 
+		if (!img) {
+			/* Create image only if an extry exists, i.e. here */
+			img = open_image(CR_FD_BINFMT_MISC, O_DUMP, 0);
+			if (!img)
+				goto out;
+		}
+
 		if (dump_binfmt_misc_entry(fd, de->d_name, img))
 			goto out;
 	}
@@ -1487,20 +1490,41 @@ static int make_bfmtm_magic_str(char *buf, BinfmtMiscEntry *bme)
 
 static int binfmt_misc_restore(struct mount_info *mi)
 {
+	unsigned int suffix;
 	struct cr_img *img;
+	struct stat st;
 	char *buf;
-	int ret = -1;
+	int ret;
 
 	buf = xmalloc(BINFMT_MISC_STR);
 	if (!buf)
 		return -1;
 
-	img = open_image(CR_FD_BINFMT_MISC, O_RSTR, mi->s_dev);
+	suffix = 0;
+	ret = stat_image(CR_FD_BINFMT_MISC, &st, suffix);
+	if (ret < 0) {
+		if (ret == -ENOENT) {
+			suffix = mi->s_dev;
+			ret = stat_image(CR_FD_BINFMT_MISC, &st, suffix);
+			if (ret == -ENOENT) {
+				ret = 0;
+				pr_info("No binfmt image found\n");
+				goto free_buf;
+			}
+		}
+		else if (ret) {
+			pr_err("Can't stat binfmt_misc image: %s\n", strerror(ret));
+			goto free_buf;
+		}
+	}
+
+	img = open_image(CR_FD_BINFMT_MISC, O_RSTR, suffix);
 	if (!img) {
+		pr_err("Can't open binfmt_misc image\n");
+		ret = -1;
 		goto free_buf;
 	}
 
-	ret = 0;
 	while (ret == 0) {
 		BinfmtMiscEntry *bme;
 



More information about the CRIU mailing list