[CRIU] [PATCH 02/22] unix: Move stale unlink into post-prep

Pavel Emelyanov xemul at virtuozzo.com
Fri Jun 30 13:56:04 MSK 2017


The call to unlink() should happen in root task context,
while the collection stage is about to be moved into the
crtools, so keep the stale-unlink piece in post-prep
for a socket.

Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
 criu/sk-unix.c | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/criu/sk-unix.c b/criu/sk-unix.c
index 7c71448..69c1d14 100644
--- a/criu/sk-unix.c
+++ b/criu/sk-unix.c
@@ -1390,7 +1390,19 @@ static void unlink_stale(struct unix_sk_info *ui)
 	revert_unix_sk_cwd(&cwd_fd, &root_fd);
 }
 
-static int resolve_unix_peer(struct pprep_head *ph);
+static int resolve_unix_peer(struct unix_sk_info *ui);
+
+static int post_prepare_unix_sk(struct pprep_head *ph)
+{
+	struct unix_sk_info *ui;
+
+	ui = container_of(ph, struct unix_sk_info, peer_resolve);
+	if (ui->ue->peer && resolve_unix_peer(ui))
+		return -1;
+	if (ui->name)
+		unlink_stale(ui);
+	return 0;
+}
 
 static int collect_one_unixsk(void *o, ProtobufCMessage *base, struct cr_img *i)
 {
@@ -1401,11 +1413,6 @@ static int collect_one_unixsk(void *o, ProtobufCMessage *base, struct cr_img *i)
 	ui->ue = pb_msg(base, UnixSkEntry);
 	ui->name_dir = (void *)ui->ue->name_dir;
 
-	if (ui->ue->peer) {
-		ui->peer_resolve.actor = resolve_unix_peer;
-		add_post_prepare_cb(&ui->peer_resolve);
-	}
-
 	if (ui->ue->name.len) {
 		if (ui->ue->name.len > UNIX_PATH_MAX) {
 			pr_err("Bad unix name len %d\n", (int)ui->ue->name.len);
@@ -1413,8 +1420,6 @@ static int collect_one_unixsk(void *o, ProtobufCMessage *base, struct cr_img *i)
 		}
 
 		ui->name = (void *)ui->ue->name.data;
-
-		unlink_stale(ui);
 	} else
 		ui->name = NULL;
 
@@ -1452,6 +1457,11 @@ static int collect_one_unixsk(void *o, ProtobufCMessage *base, struct cr_img *i)
 		prefix, ulen, uname,
 		ui->name_dir ? ui->name_dir : "-");
 
+	if (ui->ue->peer || ui->name) {
+		ui->peer_resolve.actor = post_prepare_unix_sk;
+		add_post_prepare_cb(&ui->peer_resolve);
+	}
+
 	list_add_tail(&ui->list, &unix_sockets);
 	return file_desc_add(&ui->d, ui->ue->id, &unix_desc_ops);
 }
@@ -1490,11 +1500,10 @@ static void interconnected_pair(struct unix_sk_info *ui, struct unix_sk_info *pe
 	}
 }
 
-static int resolve_unix_peer(struct pprep_head *ph)
+static int resolve_unix_peer(struct unix_sk_info *ui)
 {
-	struct unix_sk_info *ui, *peer;
+	struct unix_sk_info *peer;
 
-	ui = container_of(ph, struct unix_sk_info, peer_resolve);
 	if (ui->peer)
 		goto out;
 
-- 
2.1.4



More information about the CRIU mailing list