From: Serge E. Hallyn <serue@xxxxxxxxxx> Signed-off-by: Serge E. Hallyn <serue@xxxxxxxxxx> --- arch/x86/mm/checkpoint.c | 4 ++-- checkpoint/checkpoint.c | 39 ++++++++++++++++++++++----------------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/arch/x86/mm/checkpoint.c b/arch/x86/mm/checkpoint.c index 32d9dca..df5bf4b 100644 --- a/arch/x86/mm/checkpoint.c +++ b/arch/x86/mm/checkpoint.c @@ -154,11 +154,11 @@ static unsigned short decode_segment(__u16 seg) static int may_checkpoint_thread(struct ckpt_ctx *ctx, struct task_struct *t) { if (t->thread.vm86_info) { - ckpt_write_err(ctx, "TE", "task in VM86 mode", -EBUSY); + ckpt_err(ctx, "%(T)%(E)Task in VM86 mode\n", -EBUSY); return -EBUSY; } if (task_thread_info(t)->flags & CKPT_X86_TIF_UNSUPPORTED) { - ckpt_write_err(ctx, "TE", "bad thread info flags %#lx", -EBUSY); + ckpt_err(ctx, "%(T)%(E)Bad thread info flags %#lx\n", -EBUSY); return -EBUSY; } return 0; diff --git a/checkpoint/checkpoint.c b/checkpoint/checkpoint.c index 6eb8f3b..30c6637 100644 --- a/checkpoint/checkpoint.c +++ b/checkpoint/checkpoint.c @@ -410,12 +410,12 @@ static int may_checkpoint_task(struct ckpt_ctx *ctx, struct task_struct *t) ckpt_debug("check %d\n", task_pid_nr_ns(t, ctx->root_nsproxy->pid_ns)); if (t->exit_state == EXIT_DEAD) { - __ckpt_write_err(ctx, "TE", "task state EXIT_DEAD\n", -EBUSY); + _ckpt_err(ctx, "%(T)%(E)Task state EXIT_DEAD\n", -EBUSY); return -EBUSY; } if (!ptrace_may_access(t, PTRACE_MODE_ATTACH)) { - __ckpt_write_err(ctx, "TE", "ptrace attach denied", -EPERM); + _ckpt_err(ctx, "%(T)%(E)Ptrace attach denied\n", -EPERM); return -EPERM; } @@ -425,13 +425,13 @@ static int may_checkpoint_task(struct ckpt_ctx *ctx, struct task_struct *t) /* verify that all tasks belongs to same freezer cgroup */ if (t != current && !in_same_cgroup_freezer(t, ctx->root_freezer)) { - __ckpt_write_err(ctx, "TE", "unfrozen or wrong cgroup", -EBUSY); + _ckpt_err(ctx, "%(T)%(E)Unfrozen or wrong cgroup\n", -EBUSY); return -EBUSY; } /* FIX: add support for ptraced tasks */ if (task_ptrace(t)) { - __ckpt_write_err(ctx, "TE", "task is ptraced", -EBUSY); + _ckpt_err(ctx, "%(T)%(E)Task is ptraced\n", -EBUSY); return -EBUSY; } @@ -441,22 +441,22 @@ static int may_checkpoint_task(struct ckpt_ctx *ctx, struct task_struct *t) */ if (ctx->root_init && t != root && t->real_parent == root->real_parent && t->tgid != root->tgid) { - __ckpt_write_err(ctx, "TE", "task is sibling of root", -EINVAL); + _ckpt_err(ctx, "%(T)%(E)Task is sibling of root\n", -EINVAL); return -EINVAL; } rcu_read_lock(); nsproxy = task_nsproxy(t); if (nsproxy->mnt_ns != ctx->root_nsproxy->mnt_ns) { - __ckpt_write_err(ctx, "TE", "bad mnt_ns", -EPERM); + _ckpt_err(ctx, "%(T)%(E)Bad mnt_ns\n", -EPERM); ret = -EPERM; } if (nsproxy->pid_ns != ctx->root_nsproxy->pid_ns) { - __ckpt_write_err(ctx, "TE", "bad pid_ns", -EPERM); + _ckpt_err(ctx, "%(T)%(E)Bad pid_ns\n", -EPERM); ret = -EPERM; } if (nsproxy->net_ns != ctx->root_nsproxy->net_ns) { - __ckpt_write_err(ctx, "TE", "bad net_ns", -EPERM); + _ckpt_err(ctx, "%(T)%(E)Bad net_ns\n", -EPERM); ret = -EPERM; } rcu_read_unlock(); @@ -526,7 +526,7 @@ static int collect_objects(struct ckpt_ctx *ctx) ret = ckpt_collect_task(ctx, ctx->tasks_arr[n]); if (ret < 0) { ctx->tsk = ctx->tasks_arr[n]; - ckpt_write_err(ctx, "TE", "collect failed", ret); + ckpt_err(ctx, "%(T)%(E)Collect failed\n", ret); ctx->tsk = NULL; break; } @@ -547,7 +547,7 @@ static int __tree_count_tasks(struct task_struct *task, void *data) struct ckpt_ctx *ctx = d->ctx; int ret; - ctx->tsk = task; /* (for ckpt_write_err) */ + ctx->tsk = task; /* (for _ckpt_err()) */ /* is this task cool ? */ ret = may_checkpoint_task(ctx, task); @@ -556,7 +556,8 @@ static int __tree_count_tasks(struct task_struct *task, void *data) if (ctx->tasks_arr) { if (d->nr == ctx->nr_tasks) { /* unlikely... try again later */ - __ckpt_write_err(ctx, "TE", "bad task count\n", -EBUSY); + _ckpt_err(ctx, "%(T)%(E)Bad task count (d->nr = %d)\n", + -EBUSY, d->nr); ret = -EBUSY; goto out; } @@ -566,8 +567,6 @@ static int __tree_count_tasks(struct task_struct *task, void *data) ret = 1; out: - if (ret < 0) - ckpt_write_err(ctx, "", NULL); ctx->tsk = NULL; return ret; } @@ -575,11 +574,17 @@ static int __tree_count_tasks(struct task_struct *task, void *data) static int tree_count_tasks(struct ckpt_ctx *ctx) { struct ckpt_cnt_tasks data; + int ret; data.ctx = ctx; data.nr = 0; - return walk_task_subtree(ctx->root_task, __tree_count_tasks, &data); + ckpt_msg_lock(ctx); + ret = walk_task_subtree(ctx->root_task, __tree_count_tasks, &data); + ckpt_msg_unlock(ctx); + if (ret < 0) + _ckpt_msg_complete(ctx); + return ret; } /* @@ -726,7 +731,7 @@ static int init_checkpoint_ctx(struct ckpt_ctx *ctx, pid_t pid) ctx->root_init = is_container_init(task); if (!(ctx->uflags & CHECKPOINT_SUBTREE) && !ctx->root_init) { - ckpt_write_err(ctx, "E", "not container init", -EINVAL); + ckpt_err(ctx, "%(E)Not container init\n", -EINVAL); return -EINVAL; /* cleanup by ckpt_ctx_free() */ } @@ -753,7 +758,7 @@ long do_checkpoint(struct ckpt_ctx *ctx, pid_t pid) if (ctx->root_freezer) { ret = cgroup_freezer_begin_checkpoint(ctx->root_freezer); if (ret < 0) { - ckpt_write_err(ctx, "E", "freezer cgroup failed", ret); + ckpt_err(ctx, "%(E)Freezer cgroup failed\n", ret); return ret; } } @@ -796,7 +801,7 @@ long do_checkpoint(struct ckpt_ctx *ctx, pid_t pid) /* verify that all objects were indeed visited */ if (!ckpt_obj_visited(ctx)) { - ckpt_write_err(ctx, "E", "leak: unvisited", -EBUSY); + ckpt_err(ctx, "%(E)Leak: unvisited\n", -EBUSY); ret = -EBUSY; goto out; } -- 1.6.1 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers