[CRIU] [PATCH RFC 01/12] files: Create per-process transport sock and bind it

Kirill Tkhai ktkhai at virtuozzo.com
Fri Oct 28 05:52:25 PDT 2016


Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 criu/cr-restore.c    |    6 ------
 criu/files.c         |   18 ++++++++++++++++--
 criu/include/files.h |    2 --
 3 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/criu/cr-restore.c b/criu/cr-restore.c
index 252cc91..4785f7b 100644
--- a/criu/cr-restore.c
+++ b/criu/cr-restore.c
@@ -269,10 +269,6 @@ static int root_prepare_shared(void)
 	if (ret)
 		goto err;
 
-	ret = open_transport_socket();
-	if (ret)
-		goto err;
-
 	show_saved_files();
 err:
 	return ret;
@@ -713,8 +709,6 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
 	if (prepare_vmas(current, ta))
 		return -1;
 
-	close_service_fd(TRANSPORT_FD_OFF);
-
 	if (setup_uffd(pid, ta))
 		return -1;
 
diff --git a/criu/files.c b/criu/files.c
index 21af891..e869614 100644
--- a/criu/files.c
+++ b/criu/files.c
@@ -1149,6 +1149,8 @@ int close_old_fds(void)
 	return 0;
 }
 
+static int open_transport_socket(pid_t pid);
+
 int prepare_fds(struct pstree_item *me)
 {
 	u32 ret = 0;
@@ -1183,6 +1185,9 @@ int prepare_fds(struct pstree_item *me)
 		}
 	}
 
+	if (open_transport_socket(me->pid.virt))
+		return -1;
+
 	for (state = 0; state < ARRAY_SIZE(states); state++) {
 		if (!states[state].required) {
 			pr_debug("Skipping %s fd stage\n", states[state].name);
@@ -1231,6 +1236,7 @@ int prepare_fds(struct pstree_item *me)
 out_w:
 	if (rsti(me)->fdt)
 		futex_inc_and_wake(&rsti(me)->fdt->fdt_lock);
+	close_service_fd(TRANSPORT_FD_OFF);
 out:
 	close_service_fd(CR_PROC_FD_OFF);
 	tty_fini_fds();
@@ -1663,15 +1669,23 @@ int inherit_fd_fini()
 	return 0;
 }
 
-int open_transport_socket()
+static int open_transport_socket(pid_t pid)
 {
-	int sock;
+	struct sockaddr_un saddr;
+	int sock, slen;
 
 	sock = socket(PF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
 	if (sock < 0) {
 		pr_perror("Can't create socket");
 		return -1;
 	}
+
+	transport_name_gen(&saddr, &slen, pid, -1);
+	if (bind(sock, (struct sockaddr *)&saddr, slen) < 0) {
+		pr_perror("Can't bind transport socket %s", saddr.sun_path + 1);
+		return -1;
+	}
+
 	if (install_service_fd(TRANSPORT_FD_OFF, sock) < 0) {
 		close(sock);
 		return -1;
diff --git a/criu/include/files.h b/criu/include/files.h
index 153e7b3..2cd1a67 100644
--- a/criu/include/files.h
+++ b/criu/include/files.h
@@ -189,6 +189,4 @@ extern FdinfoEntry *dup_fdinfo(FdinfoEntry *old, int fd, unsigned flags);
 int dup_fle(struct pstree_item *task, struct fdinfo_list_entry *ple,
 	    int fd, unsigned flags);
 
-extern int open_transport_socket(void);
-
 #endif /* __CR_FILES_H__ */



More information about the CRIU mailing list