[1/4] criu: Write pidfile later

Submitted by Pavel Emelianov on April 27, 2016, 12:23 p.m.

Details

Message ID 5720AF24.5030905@virtuozzo.com
State Superseded
Commit 42859b66bc32033436d4ec0ac08809f93d77df87
Headers show

Commit Message

Pavel Emelianov April 27, 2016, 12:23 p.m.
Next patch will put non-root task's PID into it, so this
one is preparatory. But, as a bonus, we remove the need
to unlink ths pid file in case of error :)

Risk -- scripts might want to have pidfile, but we already
have CRTOOLS_ROOT_PID environment in them for such cases.

Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
---
 criu/cr-restore.c | 36 ++++++++++++++++++++----------------
 1 file changed, 20 insertions(+), 16 deletions(-)

Patch hide | download patch | download mbox

diff --git a/criu/cr-restore.c b/criu/cr-restore.c
index 6ee0850..1b0354c 100644
--- a/criu/cr-restore.c
+++ b/criu/cr-restore.c
@@ -1325,18 +1325,6 @@  static inline int fork_with_pid(struct pstree_item *item)
 				item->pid.real, item->pid.virt);
 	}
 
-	if (opts.pidfile && root_item == item) {
-		int pid;
-
-		pid = ret;
-
-		ret = write_pidfile(pid);
-		if (ret < 0) {
-			pr_perror("Can't write pidfile");
-			kill(pid, SIGKILL);
-		}
-	}
-
 err_unlock:
 	if (ca.fd >= 0) {
 		if (flock(ca.fd, LOCK_UN))
@@ -1997,6 +1985,23 @@  static void restore_origin_ns_hook(void)
 		pr_err("Restore original /proc/self/loginuid failed");
 }
 
+static int write_restored_pid(void)
+{
+	int pid;
+
+	if (!opts.pidfile)
+		return 0;
+
+	pid = root_item->pid.real;
+
+	if (write_pidfile(pid) < 0) {
+		pr_perror("Can't write pidfile");
+		return -1;
+	}
+
+	return 0;
+}
+
 static int restore_root_task(struct pstree_item *init)
 {
 	enum trace_flags flag = TRACE_ALL;
@@ -2157,6 +2162,9 @@  static int restore_root_task(struct pstree_item *init)
 		goto out_kill;
 	}
 
+	if (write_restored_pid())
+		goto out_kill;
+
 	/* Unlock network before disabling repair mode on sockets */
 	network_unlock();
 
@@ -2234,10 +2242,6 @@  out_kill:
 				kill(pi->pid.virt, SIGKILL);
 	}
 
-	if (opts.pidfile) {
-		if (unlink(opts.pidfile))
-			pr_perror("Unable to remove %s", opts.pidfile);
-	}
 out:
 	fini_cgroup();
 	if (clean_remaps)