fix -ESRCH on self-restart
PATCH 1/1 fix -ESRCH on self-restart
when doing a self-restart, we can't search for ourselves on our list of children...
Signed-off-by Serge E. Hallyn <serue-r/[email protected]>
--- checkpoint/restart.c | 32 +++++++++++++++++++++++--------- 1 files changed, 23 insertions(+), 9 deletions(-)
checkpoint/restart.c +23 -9
@@ -569,16 +569,16 @@ static int wait_all_tasks_finish(struct ckpt_ctx *ctx)return ret; } -/* setup restart-specific parts of ctx */ -static int init_restart_ctx (struct ckpt_ctx *ctx,pid_t pid) +static struct task_struct *choose_root_task (struct ckpt_ctx *ctx,pid_t pid) { -struct task_struct *task; -struct nsproxy *nsproxy; +struct task_struct *task = current; -/* -* No need for explicit cleanup here, because if an error -* occurs then ckpt_ctx_free() is eventually called. -*/ +if (ctx->uflags &RESTART_TASKSELF ) { + ctx->root_pid = pid; + ctx->root_task = task; +get_task_struct (current); +return current; + }read_lock (&tasklist_lock);list_for_each_entry (task, ¤t->children, sibling) {
@@ -590,11 +590,25 @@ static int init_restart_ctx(struct ckpt_ctx *ctx, pid_t pid) } }read_unlock (&tasklist_lock); +return task; +} + +/* setup restart-specific parts of ctx */ +static int init_restart_ctx (struct ckpt_ctx *ctx,pid_t pid) +{ +struct nsproxy *nsproxy; + +/* +* No need for explicit cleanup here, because if an error +* occurs then ckpt_ctx_free() is eventually called. +*/ + + ctx->root_task =choose_root_task (ctx, pid);if (!ctx->root_task)return -ESRCH ;rcu_read_lock (); - nsproxy =task_nsproxy (task); + nsproxy =task_nsproxy (ctx->root_task);if (nsproxy) {get_nsproxy (nsproxy); ctx->root_nsproxy = nsproxy;
Signature · 1 line
1.6.1
A message that is not in the archive (sent off-list or not yet received): 20090615202022.GA18223-r/[email protected]
Oren Laadan
AppliedApplied, thanks.
Quoted 64 lines · Serge E. Hallyn
when doing a self-restart, we can't search for ourselves on our list of children...
Signed-off-by Serge E. Hallyn <serue-r/[email protected]>--- checkpoint/restart.c | 32 +++++++++++++++++++++++--------- 1 files changed, 23 insertions(+), 9 deletions(-)checkpoint/restart.c +23
-9@@ -569,16 +569,16 @@ static int wait_all_tasks_finish(struct ckpt_ctx *ctx)return ret; } -/* setup restart-specific parts of ctx */ -static int init_restart_ctx (struct ckpt_ctx *ctx,pid_t pid) +static struct task_struct *choose_root_task (struct ckpt_ctx *ctx,pid_t pid) { -struct task_struct *task; -struct nsproxy *nsproxy; +struct task_struct *task = current; -/* -* No need for explicit cleanup here, because if an error -* occurs then ckpt_ctx_free() is eventually called. -*/ +if (ctx->uflags &RESTART_TASKSELF ) { + ctx->root_pid = pid; + ctx->root_task = task; +get_task_struct (current); +return current; + }read_lock (&tasklist_lock);list_for_each_entry (task, ¤t->children, sibling) {@@ -590,11 +590,25 @@ static int init_restart_ctx(struct ckpt_ctx *ctx, pid_t pid) } }read_unlock (&tasklist_lock); +return task; +} + +/* setup restart-specific parts of ctx */ +static int init_restart_ctx (struct ckpt_ctx *ctx,pid_t pid) +{ +struct nsproxy *nsproxy; + +/* +* No need for explicit cleanup here, because if an error +* occurs then ckpt_ctx_free() is eventually called. +*/ + + ctx->root_task =choose_root_task (ctx, pid);if (!ctx->root_task)return -ESRCH ;rcu_read_lock (); - nsproxy =task_nsproxy (task); + nsproxy =task_nsproxy (ctx->root_task);if (nsproxy) {get_nsproxy (nsproxy); ctx->root_nsproxy = nsproxy;