Commit ede980c0 authored by Pavel Emelyanov's avatar Pavel Emelyanov

restore: Move kids (and session) restore into a helper

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 26aa61a3
...@@ -1078,10 +1078,47 @@ static int mount_proc(void) ...@@ -1078,10 +1078,47 @@ static int mount_proc(void)
return ret; return ret;
} }
/*
* Tasks cannot change sid (session id) arbitrary, but can either
* inherit one from ancestor, or create a new one with id equal to
* their pid. Thus sid-s restore is tied with children creation.
*/
static int create_children_and_session(void)
{
int ret;
struct pstree_item *child;
pr_info("Restoring children in alien sessions:\n");
list_for_each_entry(child, &current->children, sibling) {
if (!restore_before_setsid(child))
continue;
BUG_ON(child->born_sid != -1 && getsid(getpid()) != child->born_sid);
ret = fork_with_pid(child);
if (ret < 0)
return ret;
}
restore_sid();
pr_info("Restoring children in our session:\n");
list_for_each_entry(child, &current->children, sibling) {
if (restore_before_setsid(child))
continue;
ret = fork_with_pid(child);
if (ret < 0)
return ret;
}
return 0;
}
static int restore_task_with_children(void *_arg) static int restore_task_with_children(void *_arg)
{ {
struct cr_clone_arg *ca = _arg; struct cr_clone_arg *ca = _arg;
struct pstree_item *child;
pid_t pid; pid_t pid;
int ret; int ret;
sigset_t blockmask; sigset_t blockmask;
...@@ -1151,28 +1188,8 @@ static int restore_task_with_children(void *_arg) ...@@ -1151,28 +1188,8 @@ static int restore_task_with_children(void *_arg)
exit(1); exit(1);
} }
pr_info("Restoring children:\n"); if (create_children_and_session())
list_for_each_entry(child, &current->children, sibling) { exit(1);
if (!restore_before_setsid(child))
continue;
BUG_ON(child->born_sid != -1 && getsid(getpid()) != child->born_sid);
ret = fork_with_pid(child);
if (ret < 0)
exit(1);
}
restore_sid();
pr_info("Restoring children:\n");
list_for_each_entry(child, &current->children, sibling) {
if (restore_before_setsid(child))
continue;
ret = fork_with_pid(child);
if (ret < 0)
exit(1);
}
if (current->pgid == current->pid.virt) if (current->pgid == current->pid.virt)
restore_pgid(); restore_pgid();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment