[Devel] [PATCH 05/13][user-cr]: restart: Use ckpt_perror()

Sukadev Bhattiprolu sukadev at linux.vnet.ibm.com
Wed Mar 3 23:47:39 PST 2010


From: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
Date: Mon, 1 Mar 2010 20:18:31 -0800
Subject: [PATCH 05/13][user-cr]: restart: Use ckpt_perror()

Remove the implicit dependency on 'stderr' and redirect messages to
global_uerrfd. This would simplify implementing command line options
for these file descriptors and also enable implementing the restart
functionality as a library interface

Signed-off-by: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
---
 restart.c |   92 ++++++++++++++++++++++++++++++++----------------------------
 1 files changed, 49 insertions(+), 43 deletions(-)

diff --git a/restart.c b/restart.c
index c4c2158..eda864d 100644
--- a/restart.c
+++ b/restart.c
@@ -123,6 +123,12 @@ static inline void ckpt_msg(int fd, char *format, ...)
 	va_end(ap);
 }
 
+#define ckpt_perror(s) 							\
+	do {								\
+		ckpt_msg(global_uerrfd, s);				\
+		ckpt_msg(global_uerrfd, ": %s\n", strerror(errno));	\
+	} while (0)
+
 #ifdef CHECKPOINT_DEBUG
 #define ckpt_dbg(_format, _args...)					\
 	do {								\
@@ -649,7 +655,7 @@ static void parse_args(struct args *args, int argc, char *argv[])
 	if (klogfile) {
 		args->klogfd = open(klogfile, O_RDWR | O_CREAT | O_EXCL, 0644);
 		if (args->klogfd < 0) {
-			perror("open log file");
+			ckpt_perror("open log file");
 			exit(1);
 		}
 	}
@@ -701,7 +707,7 @@ static void sigchld_handler(int sig)
 		} else if (errno == ECHILD) {
 			break;
 		} else {
-			perror("WEIRD !! child collection failed");
+			ckpt_perror("WEIRD !! child collection failed");
 			exit(1);
 		}
 	}
@@ -741,7 +747,7 @@ static int freezer_prepare(struct ckpt_ctx *ctx)
 
 	freezer = malloc(strlen(ctx->args->freezer) + 32);
 	if (!freezer) {
-		perror("malloc freezer buf");
+		ckpt_perror("malloc freezer buf");
 		return -1;
 	}
 
@@ -749,13 +755,13 @@ static int freezer_prepare(struct ckpt_ctx *ctx)
 
 	fd = open(freezer, O_WRONLY, 0);
 	if (fd < 0) {
-		perror("freezer path");
+		ckpt_perror("freezer path");
 		free(freezer);
 		exit(1);
 	}
 	ret = write(fd, FREEZER_THAWED, sizeof(FREEZER_THAWED)); 
 	if (ret != sizeof(FREEZER_THAWED)) {
-		perror("thawing freezer");
+		ckpt_perror("thawing freezer");
 		free(freezer);
 		exit(1);
 	}
@@ -774,14 +780,14 @@ static int freezer_register(struct ckpt_ctx *ctx, pid_t pid)
 
 	fd = open(ctx->freezer, O_WRONLY, 0);
 	if (fd < 0) {
-		perror("freezer path");
+		ckpt_perror("freezer path");
 		return -1;
 	}
 
 	n = sprintf(pidstr, "%d", pid);
 	ret = write(fd, pidstr, n);
 	if (ret != n) {
-		perror("adding pid %d to freezer");
+		ckpt_perror("adding pid %d to freezer");
 		ret = -1;
 	} else {
 		ret = 0;
@@ -815,7 +821,7 @@ int main(int argc, char *argv[])
 	if (args.input) {
 		args.infd = open(args.input, O_RDONLY, 0);
 		if (args.infd < 0) {
-			perror("open input file");
+			ckpt_perror("open input file");
 			exit(1);
 		}
 	}
@@ -823,7 +829,7 @@ int main(int argc, char *argv[])
 	/* input file descriptor (default: stdin) */
 	if (args.infd >= 0) {
 		if (dup2(args.infd, STDIN_FILENO) < 0) {
-			perror("dup2 input file");
+			ckpt_perror("dup2 input file");
 			exit(1);
 		}
 		if (args.infd != STDIN_FILENO)
@@ -840,13 +846,13 @@ int main(int argc, char *argv[])
 
 	/* private mounts namespace ? */
 	if (args.mntns && unshare(CLONE_NEWNS | CLONE_FS) < 0) {
-		perror("unshare");
+		ckpt_perror("unshare");
 		exit(1);
 	}
 
 	/* chroot ? */
 	if (args.root && chroot(args.root) < 0) {
-		perror("chroot");
+		ckpt_perror("chroot");
 		exit(1);
 	}
 
@@ -858,7 +864,7 @@ int main(int argc, char *argv[])
 	if (args.self) {
 		restart(getpid(), STDIN_FILENO, RESTART_TASKSELF, args.klogfd);
 		/* reach here if restart(2) failed ! */
-		perror("restart");
+		ckpt_perror("restart");
 		exit(1);
 	}
 
@@ -866,25 +872,25 @@ int main(int argc, char *argv[])
 
 	ret = ckpt_read_header(&ctx);
 	if (ret < 0) {
-		perror("read c/r header");
+		ckpt_perror("read c/r header");
 		exit(1);
 	}
 		
 	ret = ckpt_read_header_arch(&ctx);
 	if (ret < 0) {
-		perror("read c/r header arch");
+		ckpt_perror("read c/r header arch");
 		exit(1);
 	}
 
 	ret = ckpt_read_container(&ctx);
 	if (ret < 0) {
-		perror("read c/r container section");
+		ckpt_perror("read c/r container section");
 		exit(1);
 	}
 
 	ret = ckpt_read_tree(&ctx);
 	if (ret < 0) {
-		perror("read c/r tree");
+		ckpt_perror("read c/r tree");
 		exit(1);
 	}
 
@@ -978,7 +984,7 @@ static int ckpt_collect_child(struct ckpt_ctx *ctx)
 	if (global_child_collected) {
 		status = global_child_status;
 	} else if (pid < 0) {
-		perror("WEIRD: collect child task");
+		ckpt_perror("WEIRD: collect child task");
 		exit(1);
 	}
 
@@ -991,7 +997,7 @@ static int ckpt_remount_devpts(struct ckpt_ctx *ctx)
 
 	/* make sure /dev/ptmx is a link else we'll just break */
 	if (lstat("/dev/ptmx", &ptystat) < 0) {
-		perror("stat /dev/ptmx");
+		ckpt_perror("stat /dev/ptmx");
 		return -1;
 	}
 	if ((ptystat.st_mode & S_IFMT) != S_IFLNK) {
@@ -1002,7 +1008,7 @@ static int ckpt_remount_devpts(struct ckpt_ctx *ctx)
 	/* this is unlikely, but maybe we don't want to fail */
 	if (umount2("/dev/pts", MNT_DETACH) < 0) {
 		if (ckpt_cond_fail(ctx, CKPT_COND_MNTPTY)) {
-			perror("umount -l /dev/pts");
+			ckpt_perror("umount -l /dev/pts");
 			return -1;
 		}
 		if (ckpt_cond_warn(ctx, CKPT_COND_MNTPTY))
@@ -1010,7 +1016,7 @@ static int ckpt_remount_devpts(struct ckpt_ctx *ctx)
 	}
 	if (mount("pts", "/dev/pts", "devpts", 0,
 		  "ptmxmode=666,newinstance") < 0) {
-		perror("mount -t devpts -o newinstance");
+		ckpt_perror("mount -t devpts -o newinstance");
 		return -1;
 	}
 
@@ -1092,20 +1098,20 @@ static int ckpt_probe_child(pid_t pid, char *str)
 static int ckpt_remount_proc(struct ckpt_ctx *ctx)
 {
 	if (unshare(CLONE_NEWNS | CLONE_FS) < 0) {
-		perror("unshare");
+		ckpt_perror("unshare");
 		return -1;
 	}
 	/* this is unlikely, but we don't want to fail */
 	if (umount2("/proc", MNT_DETACH) < 0) {
 		if (ckpt_cond_fail(ctx, CKPT_COND_MNTPROC)) {
-			perror("umount -l /proc");
+			ckpt_perror("umount -l /proc");
 			return -1;
 		}
 		if (ckpt_cond_warn(ctx, CKPT_COND_MNTPROC))
 			ckpt_err("[warn] failed to un-mount old /proc\n");
 	}
 	if (mount("proc", "/proc", "proc", 0, NULL) < 0) {
-		perror("mount -t proc");
+		ckpt_perror("mount -t proc");
 		return -1;
 	}
 
@@ -1135,7 +1141,7 @@ static int ckpt_coordinator_status(struct ckpt_ctx *ctx)
 
 	ret = read(ctx->pipe_coord[0], &status, sizeof(status));
 	if (ret < 0)
-		perror("read coordinator status");
+		ckpt_perror("read coordinator status");
 	else if (ret == 0) {
 		/* coordinator failed to report */
 		ckpt_dbg("Coordinator failed to report status.");
@@ -1162,13 +1168,13 @@ static int ckpt_coordinator_pidns(struct ckpt_ctx *ctx)
 	 * root-task's return value).
 	 */
 	if (pipe(ctx->pipe_coord) < 0) {
-		perror("pipe");
+		ckpt_perror("pipe");
 		return -1;
 	}
 
 	stk = genstack_alloc(PTHREAD_STACK_MIN);
 	if (!stk) {
-		perror("coordinator genstack_alloc");
+		ckpt_perror("coordinator genstack_alloc");
 		return -1;
 	}
 	sp = genstack_sp(stk);
@@ -1179,7 +1185,7 @@ static int ckpt_coordinator_pidns(struct ckpt_ctx *ctx)
 	coord_pid = clone(__ckpt_coordinator, sp, CLONE_NEWPID|SIGCHLD, ctx);
 	genstack_release(stk);
 	if (coord_pid < 0) {
-		perror("clone coordinator");
+		ckpt_perror("clone coordinator");
 		return coord_pid;
 	}
 	global_child_pid = coord_pid;
@@ -1244,7 +1250,7 @@ static int ckpt_coordinator(struct ckpt_ctx *ctx)
 	ret = restart(root_pid, STDIN_FILENO, flags, ctx->args->klogfd);
 
 	if (ret < 0) {
-		perror("restart failed");
+		ckpt_perror("restart failed");
 		ckpt_verbose("Failed\n");
 		ckpt_dbg("restart failed ?\n");
 		exit(1);
@@ -1258,7 +1264,7 @@ static int ckpt_coordinator(struct ckpt_ctx *ctx)
 	if (ctx->args->pidns && ctx->tasks_arr[0].pid != 1) {
 		/* Report success/failure to the parent */
 		if (write(ctx->pipe_coord[1], &ret, sizeof(ret)) < 0) {
-			perror("failed to report status");
+			ckpt_perror("failed to report status");
 			exit(1);
 		}
 
@@ -1314,7 +1320,7 @@ static int ckpt_build_tree(struct ckpt_ctx *ctx)
 	ctx->tasks_max = ctx->pids_nr * 4;
 	ctx->tasks_arr = malloc(sizeof(*ctx->tasks_arr) * ctx->tasks_max);
 	if (!ctx->tasks_arr) {
-		perror("malloc tasks array");
+		ckpt_perror("malloc tasks array");
 		return -1;
 	}
 
@@ -1915,7 +1921,7 @@ static int ckpt_make_tree(struct ckpt_ctx *ctx, struct task *task)
 	if (task->pid == task->sid) {
 		ret = setsid();
 		if (ret < 0 && task != ckpt_init_task(ctx)) {
-			perror("setsid");
+			ckpt_perror("setsid");
 			return -1;
 		}
 	}
@@ -1948,7 +1954,7 @@ static int ckpt_make_tree(struct ckpt_ctx *ctx, struct task *task)
 	swap.new = _gettid();
 	ret = write(ctx->pipe_out, &swap, sizeof(swap));
 	if (ret != sizeof(swap)) {
-		perror("write swap");
+		ckpt_perror("write swap");
 		return -1;
 	}
 	close(ctx->pipe_out);
@@ -1975,7 +1981,7 @@ static int ckpt_make_tree(struct ckpt_ctx *ctx, struct task *task)
 	ckpt_dbg("about to call sys_restart(), flags %#lx\n", flags);
 	ret = restart(0, STDIN_FILENO, flags, CHECKPOINT_FD_NONE);
 	if (ret < 0)
-		perror("task restore failed");
+		ckpt_perror("task restore failed");
 	return ret;
 }
 
@@ -2007,7 +2013,7 @@ int ckpt_fork_stub(void *data)
 	 */
 	if (!ctx->args->pidns) {
 		if (prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0) < 0) {
-			perror("prctl");
+			ckpt_perror("prctl");
 			return -1;
 		}
 		if (getppid() != task->real_parent) {
@@ -2044,7 +2050,7 @@ static pid_t ckpt_fork_child(struct ckpt_ctx *ctx, struct task *child)
 
 	stk = genstack_alloc(PTHREAD_STACK_MIN);
 	if (!stk) {
-		perror("ckpt_fork_child genstack_alloc");
+		ckpt_perror("ckpt_fork_child genstack_alloc");
 		return -1;
 	}
 
@@ -2078,7 +2084,7 @@ static pid_t ckpt_fork_child(struct ckpt_ctx *ctx, struct task *child)
 
 	pid = eclone(ckpt_fork_stub, child, flags, &clone_args, &pid);
 	if (pid < 0) {
-		perror("eclone");
+		ckpt_perror("eclone");
 		genstack_release(stk);
 		return -1;
 	}
@@ -2105,12 +2111,12 @@ static int ckpt_fork_feeder(struct ckpt_ctx *ctx)
 	pid_t pid;
 
 	if (pipe(ctx->pipe_feed)) {
-		perror("pipe");
+		ckpt_perror("pipe");
 		exit(1);
 	}
 
 	if (pipe(ctx->pipe_child) < 0) {
-		perror("pipe");
+		ckpt_perror("pipe");
 		exit(1);
 	}
 
@@ -2122,14 +2128,14 @@ static int ckpt_fork_feeder(struct ckpt_ctx *ctx)
 
 	stk = genstack_alloc(PTHREAD_STACK_MIN);
 	if (!stk) {
-		perror("ckpt_fork_feeder genstack_alloc");
+		ckpt_perror("ckpt_fork_feeder genstack_alloc");
 		return -1;
 	}
 
 	pid = clone(ckpt_do_feeder, genstack_sp(stk),
 		    CLONE_THREAD | CLONE_SIGHAND | CLONE_VM, ctx);
 	if (pid < 0) {
-		perror("feeder thread");
+		ckpt_perror("feeder thread");
 		return -1;
 	}
 
@@ -2148,7 +2154,7 @@ static int ckpt_fork_feeder(struct ckpt_ctx *ctx)
 
 static void ckpt_abort(struct ckpt_ctx *ctx, char *str)
 {
-	perror(str);
+	ckpt_perror(str);
 	kill(-(ctx->root_pid), SIGKILL);
 	exit(1);
 }
@@ -2685,7 +2691,7 @@ static int hash_init(struct ckpt_ctx *ctx)
 
 	ctx->hash_arr = malloc(sizeof(*hash) * HASH_BUCKETS);
 	if (!ctx->hash_arr) {
-		perror("malloc hash table");
+		ckpt_perror("malloc hash table");
 		return -1;
 	}
 	memset(ctx->hash_arr, 0, sizeof(*hash) * HASH_BUCKETS);
@@ -2725,7 +2731,7 @@ static int hash_insert(struct ckpt_ctx *ctx, long key, void *data)
 
 	hash = malloc(sizeof(*hash));
 	if (!hash) {
-		perror("malloc hash");
+		ckpt_perror("malloc hash");
 		return -1;
 	}
 	hash->key = key;
-- 
1.6.0.4

_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers




More information about the Devel mailing list