[CRIU] [PATCH cr 8/8] cr-restore: unlock connections at the last moment

Andrey Vagin avagin at openvz.org
Fri Sep 14 06:25:32 EDT 2012


Restore must not fail after unlocking connections.

Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 cr-restore.c |   39 +++++++++++++++++++++++++++++----------
 sk-tcp.c     |    2 --
 2 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/cr-restore.c b/cr-restore.c
index af962fe..888c488 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -835,6 +835,23 @@ static int restore_task_with_children(void *_arg)
 	return restore_one_task(current->pid.virt);
 }
 
+static int network_unlock_connections()
+{
+	pr_info("Unlock network\n");
+	if  (!(opts.namespaces_flags & CLONE_NEWNET)) {
+		tcp_unlock_connections();
+		return 0;
+	}
+
+	if (opts.unlock_network == NULL)
+		return 0;
+
+	if (system(opts.unlock_network))
+		return -1;
+
+	return 0;
+}
+
 static int restore_root_task(struct pstree_item *init, struct cr_options *opts)
 {
 	int ret;
@@ -902,6 +919,18 @@ static int restore_root_task(struct pstree_item *init, struct cr_options *opts)
 	futex_wait_while_gt(&task_entries->nr_in_progress, 0);
 	ret = (int)futex_get(&task_entries->nr_in_progress);
 
+	futex_set_and_wake(&task_entries->nr_in_progress, task_entries->nr);
+	futex_set_and_wake(&task_entries->start, CR_STATE_RESTORE_SIGCHLD);
+	futex_wait_until(&task_entries->nr_in_progress, 0);
+
+	/* Restore SIGCHLD here to skip SIGCHLD from a network sctip */
+	ret = sigaction(SIGCHLD, &old_act, NULL);
+	if (ret < 0) {
+		pr_perror("sigaction() failed\n");
+		goto out;
+	}
+
+	ret = network_unlock_connections();
 out:
 	if (ret < 0) {
 		struct pstree_item *pi;
@@ -919,16 +948,6 @@ out:
 		return 1;
 	}
 
-	futex_set_and_wake(&task_entries->nr_in_progress, task_entries->nr);
-	futex_set_and_wake(&task_entries->start, CR_STATE_RESTORE_SIGCHLD);
-	futex_wait_until(&task_entries->nr_in_progress, 0);
-
-	ret = sigaction(SIGCHLD, &old_act, NULL);
-	if (ret < 0) {
-		pr_perror("sigaction() failed\n");
-		return -1;
-	}
-
 	pr_info("Go on!!!\n");
 	futex_set_and_wake(&task_entries->start, CR_STATE_COMPLETE);
 
diff --git a/sk-tcp.c b/sk-tcp.c
index ec4582e..ca36a0f 100644
--- a/sk-tcp.c
+++ b/sk-tcp.c
@@ -547,8 +547,6 @@ int restore_one_tcp(int fd, struct inet_sk_info *ii)
 	if (rst_tcp_socks_add(fd))
 		return -1;
 
-	nf_unlock_connection_info(ii);
-
 	if (restore_tcp_conn_state(fd, ii))
 		return -1;
 
-- 
1.7.1



More information about the CRIU mailing list