[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