[CRIU] [PATCH] image: do_open_remote_image: Move the unix sockets to workdir

Omri Kramer omri.kramer at gmail.com
Mon Jul 17 21:49:13 MSK 2017


It's better to open the unix sockets for dump and restore
inside the workdir. See TODO item 1 in:
https://github.com/xemul/criu/commit/037b2e3c95e098d63a3500834681543da544840e

Signed-off-by: Omri Kramer <omri.kramer at gmail.com>
Signed-off-by: Lior Fisch <fischlior at gmail.com>
---
 criu/image.c             | 32 +++++++++++++++++++++++++++++++-
 criu/include/servicefd.h |  1 +
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/criu/image.c b/criu/image.c
index 62e8e71..7c21178 100644
--- a/criu/image.c
+++ b/criu/image.c
@@ -338,7 +338,7 @@ int do_open_remote_image(int dfd, char *path, int flags)
 		return -1;
 	}
 
-	if (fchdir(get_service_fd(IMG_FD_OFF)) < 0) {
+	if (fchdir(get_service_fd(WRK_FD_OFF)) < 0) {
 		pr_perror("fchdir to dfd failed!");
 		close(save);
 		return -1;
@@ -465,6 +465,32 @@ struct cr_img *img_from_fd(int fd)
 	return img;
 }
 
+static void close_work_dir(void)
+{
+	close_service_fd(WRK_FD_OFF);
+}
+
+static int open_work_dir(char *dir)
+{
+	int fd;
+
+	fd = open(dir, O_RDONLY);
+	if (fd < 0) {
+		pr_perror("Can't open dir %s", dir);
+		return -1;
+	}
+
+	if (install_service_fd(WRK_FD_OFF, fd) < 0) {
+		pr_perror("Can't install work_fd\n");
+		close(fd);
+		return -1;
+	}
+
+	close(fd);
+	
+	return 0;
+}
+
 int open_image_dir(char *dir)
 {
 	int fd, ret;
@@ -481,6 +507,8 @@ int open_image_dir(char *dir)
 
 	if (opts.remote) {
 		init_snapshot_id(dir);
+		if (open_work_dir(opts.work_dir) < 0)
+			goto err;
 	} else if (opts.img_parent) {
 		ret = symlinkat(opts.img_parent, fd, CR_PARENT_LINK);
 		if (ret < 0 && errno != EEXIST) {
@@ -503,6 +531,8 @@ err:
 void close_image_dir(void)
 {
 	close_service_fd(IMG_FD_OFF);
+	if(opts.remote)
+		close_work_dir();
 }
 
 static unsigned long page_ids = 1;
diff --git a/criu/include/servicefd.h b/criu/include/servicefd.h
index b779223..66e4aeb 100644
--- a/criu/include/servicefd.h
+++ b/criu/include/servicefd.h
@@ -8,6 +8,7 @@ enum sfd_type {
 
 	LOG_FD_OFF,
 	IMG_FD_OFF,
+	WRK_FD_OFF,
 	PROC_FD_OFF,	/* fd with /proc for all proc_ calls */
 	PROC_PID_FD_OFF,
 	CTL_TTY_OFF,
-- 
2.7.4



More information about the CRIU mailing list