Commit c443b03e authored by Pavel Emelyanov's avatar Pavel Emelyanov

rst: Rework the rst_info referencing

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 3c7d01f6
...@@ -968,22 +968,22 @@ int prepare_task_cgroup(struct pstree_item *me) ...@@ -968,22 +968,22 @@ int prepare_task_cgroup(struct pstree_item *me)
CgSetEntry *se; CgSetEntry *se;
u32 current_cgset; u32 current_cgset;
if (!me->rst->cg_set) if (!rsti(me)->cg_set)
return 0; return 0;
if (me->parent) if (me->parent)
current_cgset = me->parent->rst->cg_set; current_cgset = rsti(me->parent)->cg_set;
else else
current_cgset = root_cg_set; current_cgset = root_cg_set;
if (me->rst->cg_set == current_cgset) { if (rsti(me)->cg_set == current_cgset) {
pr_info("Cgroups %d inherited from parent\n", current_cgset); pr_info("Cgroups %d inherited from parent\n", current_cgset);
return 0; return 0;
} }
se = find_rst_set_by_id(me->rst->cg_set); se = find_rst_set_by_id(rsti(me)->cg_set);
if (!se) { if (!se) {
pr_err("No set %d found\n", me->rst->cg_set); pr_err("No set %d found\n", rsti(me)->cg_set);
return -1; return -1;
} }
......
...@@ -339,7 +339,7 @@ static int restore_priv_vma_content(pid_t pid) ...@@ -339,7 +339,7 @@ static int restore_priv_vma_content(pid_t pid)
{ {
struct vma_area *vma; struct vma_area *vma;
int ret = 0; int ret = 0;
struct list_head *vmas = &current->rst->vmas.h; struct list_head *vmas = &rsti(current)->vmas.h;
unsigned int nr_restored = 0; unsigned int nr_restored = 0;
unsigned int nr_shared = 0; unsigned int nr_shared = 0;
...@@ -491,7 +491,7 @@ static int prepare_mappings(int pid) ...@@ -491,7 +491,7 @@ static int prepare_mappings(int pid)
void *old_premmapped_addr = NULL; void *old_premmapped_addr = NULL;
unsigned long old_premmapped_len, pstart = 0; unsigned long old_premmapped_len, pstart = 0;
vmas = &current->rst->vmas; vmas = &rsti(current)->vmas;
if (vmas->nr == 0) /* Zombie */ if (vmas->nr == 0) /* Zombie */
goto out; goto out;
...@@ -500,7 +500,7 @@ static int prepare_mappings(int pid) ...@@ -500,7 +500,7 @@ static int prepare_mappings(int pid)
* See comments in map_private_vma. * See comments in map_private_vma.
*/ */
if (current->parent) if (current->parent)
parent_vmas = &current->parent->rst->vmas.h; parent_vmas = &rsti(current->parent)->vmas.h;
else else
parent_vmas = &empty; parent_vmas = &empty;
...@@ -511,10 +511,10 @@ static int prepare_mappings(int pid) ...@@ -511,10 +511,10 @@ static int prepare_mappings(int pid)
return -1; return -1;
} }
old_premmapped_addr = current->rst->premmapped_addr; old_premmapped_addr = rsti(current)->premmapped_addr;
old_premmapped_len = current->rst->premmapped_len; old_premmapped_len = rsti(current)->premmapped_len;
current->rst->premmapped_addr = addr; rsti(current)->premmapped_addr = addr;
current->rst->premmapped_len = vmas->priv_size; rsti(current)->premmapped_len = vmas->priv_size;
pvma = list_first_entry(parent_vmas, struct vma_area, list); pvma = list_first_entry(parent_vmas, struct vma_area, list);
...@@ -556,7 +556,7 @@ out: ...@@ -556,7 +556,7 @@ out:
static int unmap_guard_pages() static int unmap_guard_pages()
{ {
struct vma_area *vma; struct vma_area *vma;
struct list_head *vmas = &current->rst->vmas.h; struct list_head *vmas = &rsti(current)->vmas.h;
list_for_each_entry(vma, vmas, list) { list_for_each_entry(vma, vmas, list) {
if (!vma_priv(vma->e)) if (!vma_priv(vma->e))
...@@ -579,7 +579,7 @@ static int open_vmas(int pid) ...@@ -579,7 +579,7 @@ static int open_vmas(int pid)
{ {
struct vma_area *vma; struct vma_area *vma;
int ret = 0; int ret = 0;
struct list_head *vmas = &current->rst->vmas.h; struct list_head *vmas = &rsti(current)->vmas.h;
list_for_each_entry(vma, vmas, list) { list_for_each_entry(vma, vmas, list) {
if (!(vma_area_is(vma, VMA_AREA_REGULAR))) if (!(vma_area_is(vma, VMA_AREA_REGULAR)))
...@@ -989,9 +989,9 @@ static void maybe_clone_parent(struct pstree_item *item, ...@@ -989,9 +989,9 @@ static void maybe_clone_parent(struct pstree_item *item,
* versions of the kernels, but we treat 3.11 as a base, so at * versions of the kernels, but we treat 3.11 as a base, so at
* least warn a user about potential problems. * least warn a user about potential problems.
*/ */
item->rst->clone_flags |= CLONE_PARENT; rsti(item)->clone_flags |= CLONE_PARENT;
root_as_sibling = 1; root_as_sibling = 1;
if (item->rst->clone_flags & CLONE_NEWPID) if (rsti(item)->clone_flags & CLONE_NEWPID)
pr_warn("Set CLONE_PARENT | CLONE_NEWPID but it might cause restore problem," pr_warn("Set CLONE_PARENT | CLONE_NEWPID but it might cause restore problem,"
"because not all kernels support such clone flags combinations!\n"); "because not all kernels support such clone flags combinations!\n");
} else if (opts.restore_detach) { } else if (opts.restore_detach) {
...@@ -1024,10 +1024,10 @@ static inline int fork_with_pid(struct pstree_item *item) ...@@ -1024,10 +1024,10 @@ static inline int fork_with_pid(struct pstree_item *item)
return -1; return -1;
item->state = ca.core->tc->task_state; item->state = ca.core->tc->task_state;
item->rst->cg_set = ca.core->tc->cg_set; rsti(item)->cg_set = ca.core->tc->cg_set;
if (item->state == TASK_DEAD) if (item->state == TASK_DEAD)
item->parent->rst->nr_zombies++; rsti(item->parent)->nr_zombies++;
else if (!task_alive(item)) { else if (!task_alive(item)) {
pr_err("Unknown task state %d\n", item->state); pr_err("Unknown task state %d\n", item->state);
return -1; return -1;
...@@ -1040,14 +1040,14 @@ static inline int fork_with_pid(struct pstree_item *item) ...@@ -1040,14 +1040,14 @@ static inline int fork_with_pid(struct pstree_item *item)
* Helper entry will not get moved around and thus * Helper entry will not get moved around and thus
* will live in the parent's cgset. * will live in the parent's cgset.
*/ */
item->rst->cg_set = item->parent->rst->cg_set; rsti(item)->cg_set = rsti(item->parent)->cg_set;
ca.core = NULL; ca.core = NULL;
} }
ret = -1; ret = -1;
ca.item = item; ca.item = item;
ca.clone_flags = item->rst->clone_flags; ca.clone_flags = rsti(item)->clone_flags;
BUG_ON(ca.clone_flags & CLONE_VM); BUG_ON(ca.clone_flags & CLONE_VM);
...@@ -1282,10 +1282,10 @@ static void restore_pgid(void) ...@@ -1282,10 +1282,10 @@ static void restore_pgid(void)
* group (-j option). * group (-j option).
*/ */
leader = current->rst->pgrp_leader; leader = rsti(current)->pgrp_leader;
if (leader) { if (leader) {
BUG_ON(my_pgid != leader->pid.virt); BUG_ON(my_pgid != leader->pid.virt);
futex_wait_until(&leader->rst->pgrp_set, 1); futex_wait_until(&rsti(leader)->pgrp_set, 1);
} }
} }
...@@ -1296,7 +1296,7 @@ static void restore_pgid(void) ...@@ -1296,7 +1296,7 @@ static void restore_pgid(void)
} }
if (my_pgid == current->pid.virt) if (my_pgid == current->pid.virt)
futex_set_and_wake(&current->rst->pgrp_set, 1); futex_set_and_wake(&rsti(current)->pgrp_set, 1);
} }
static int mount_proc(void) static int mount_proc(void)
...@@ -1396,7 +1396,7 @@ static int restore_task_with_children(void *_arg) ...@@ -1396,7 +1396,7 @@ static int restore_task_with_children(void *_arg)
close_safe(&ca->fd); close_safe(&ca->fd);
if (current->state != TASK_HELPER) { if (current->state != TASK_HELPER) {
ret = clone_service_fd(current->rst->service_fd_id); ret = clone_service_fd(rsti(current)->service_fd_id);
if (ret) if (ret)
goto err; goto err;
} }
...@@ -1585,7 +1585,7 @@ static int attach_to_tasks(bool root_seized, enum trace_flags *flag) ...@@ -1585,7 +1585,7 @@ static int attach_to_tasks(bool root_seized, enum trace_flags *flag)
return -1; return -1;
} }
ret = ptrace_stop_pie(pid, item->rst->breakpoint, flag); ret = ptrace_stop_pie(pid, rsti(item)->breakpoint, flag);
if (ret < 0) if (ret < 0)
return -1; return -1;
} }
...@@ -1626,7 +1626,7 @@ static void finalize_restore(int status) ...@@ -1626,7 +1626,7 @@ static void finalize_restore(int status)
if (ctl == NULL) if (ctl == NULL)
goto detach; goto detach;
parasite_unmap(ctl, (unsigned long) item->rst->munmap_restorer); parasite_unmap(ctl, (unsigned long)rsti(item)->munmap_restorer);
xfree(ctl); xfree(ctl);
...@@ -2236,7 +2236,7 @@ static int prepare_creds(int pid, struct task_restore_args *args) ...@@ -2236,7 +2236,7 @@ static int prepare_creds(int pid, struct task_restore_args *args)
static int prepare_mm(pid_t pid, struct task_restore_args *args) static int prepare_mm(pid_t pid, struct task_restore_args *args)
{ {
int exe_fd, i, ret = -1; int exe_fd, i, ret = -1;
MmEntry *mm = current->rst->mm; MmEntry *mm = rsti(current)->mm;
args->mm = *mm; args->mm = *mm;
args->mm.n_mm_saved_auxv = 0; args->mm.n_mm_saved_auxv = 0;
...@@ -2568,7 +2568,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2568,7 +2568,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
#endif #endif
struct vm_area_list self_vmas; struct vm_area_list self_vmas;
struct vm_area_list *vmas = &current->rst->vmas; struct vm_area_list *vmas = &rsti(current)->vmas;
int i; int i;
pr_info("Restore via sigreturn\n"); pr_info("Restore via sigreturn\n");
...@@ -2683,7 +2683,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2683,7 +2683,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
*/ */
restore_thread_exec_start = restorer_sym(exec_mem_hint, __export_restore_thread); restore_thread_exec_start = restorer_sym(exec_mem_hint, __export_restore_thread);
restore_task_exec_start = restorer_sym(exec_mem_hint, __export_restore_task); restore_task_exec_start = restorer_sym(exec_mem_hint, __export_restore_task);
current->rst->munmap_restorer = restorer_sym(exec_mem_hint, __export_unmap); rsti(current)->munmap_restorer = restorer_sym(exec_mem_hint, __export_unmap);
exec_mem_hint += restorer_len; exec_mem_hint += restorer_len;
...@@ -2717,7 +2717,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2717,7 +2717,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
if (rst_mem_remap(mem)) if (rst_mem_remap(mem))
goto err; goto err;
task_args->breakpoint = &current->rst->breakpoint; task_args->breakpoint = &rsti(current)->breakpoint;
task_args->task_entries = rst_mem_remap_ptr(task_entries_pos, RM_SHREMAP); task_args->task_entries = rst_mem_remap_ptr(task_entries_pos, RM_SHREMAP);
task_args->rst_mem = mem; task_args->rst_mem = mem;
...@@ -2729,8 +2729,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2729,8 +2729,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
task_args->vdso_rt_size = vdso_rt_size; task_args->vdso_rt_size = vdso_rt_size;
#endif #endif
task_args->premmapped_addr = (unsigned long) current->rst->premmapped_addr; task_args->premmapped_addr = (unsigned long)rsti(current)->premmapped_addr;
task_args->premmapped_len = current->rst->premmapped_len; task_args->premmapped_len = rsti(current)->premmapped_len;
task_args->shmems = rst_mem_remap_ptr(rst_shmems, RM_SHREMAP); task_args->shmems = rst_mem_remap_ptr(rst_shmems, RM_SHREMAP);
task_args->nr_shmems = nr_shmems; task_args->nr_shmems = nr_shmems;
...@@ -2882,7 +2882,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2882,7 +2882,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
* Now prepare run-time data for threads restore. * Now prepare run-time data for threads restore.
*/ */
task_args->nr_threads = current->nr_threads; task_args->nr_threads = current->nr_threads;
task_args->nr_zombies = current->rst->nr_zombies; task_args->nr_zombies = rsti(current)->nr_zombies;
task_args->clone_restore_fn = (void *)restore_thread_exec_start; task_args->clone_restore_fn = (void *)restore_thread_exec_start;
task_args->thread_args = thread_args; task_args->thread_args = thread_args;
......
...@@ -591,7 +591,7 @@ int prepare_fd_pid(struct pstree_item *item) ...@@ -591,7 +591,7 @@ int prepare_fd_pid(struct pstree_item *item)
int ret = 0; int ret = 0;
struct cr_img *img; struct cr_img *img;
pid_t pid = item->pid.virt; pid_t pid = item->pid.virt;
struct rst_info *rst_info = item->rst; struct rst_info *rst_info = rsti(item);
INIT_LIST_HEAD(&rst_info->fds); INIT_LIST_HEAD(&rst_info->fds);
INIT_LIST_HEAD(&rst_info->eventpoll); INIT_LIST_HEAD(&rst_info->eventpoll);
...@@ -608,7 +608,7 @@ int prepare_fd_pid(struct pstree_item *item) ...@@ -608,7 +608,7 @@ int prepare_fd_pid(struct pstree_item *item)
if (item->ids == NULL) /* zombie */ if (item->ids == NULL) /* zombie */
return 0; return 0;
if (item->rst->fdt && item->rst->fdt->pid != item->pid.virt) if (rsti(item)->fdt && rsti(item)->fdt->pid != item->pid.virt)
return 0; return 0;
img = open_image(CR_FD_FDINFO, O_RSTR, item->ids->files_id); img = open_image(CR_FD_FDINFO, O_RSTR, item->ids->files_id);
...@@ -951,8 +951,8 @@ int prepare_fds(struct pstree_item *me) ...@@ -951,8 +951,8 @@ int prepare_fds(struct pstree_item *me)
close_pid_proc(); /* flush any proc cached fds we may have */ close_pid_proc(); /* flush any proc cached fds we may have */
if (me->rst->fdt) { if (rsti(me)->fdt) {
struct fdt *fdt = me->rst->fdt; struct fdt *fdt = rsti(me)->fdt;
/* /*
* Wait all tasks, who share a current fd table. * Wait all tasks, who share a current fd table.
...@@ -975,7 +975,7 @@ int prepare_fds(struct pstree_item *me) ...@@ -975,7 +975,7 @@ int prepare_fds(struct pstree_item *me)
continue; continue;
} }
ret = open_fdinfos(me->pid.virt, &me->rst->fds, state); ret = open_fdinfos(me->pid.virt, &rsti(me)->fds, state);
if (ret) if (ret)
break; break;
...@@ -983,7 +983,7 @@ int prepare_fds(struct pstree_item *me) ...@@ -983,7 +983,7 @@ int prepare_fds(struct pstree_item *me)
* Now handle TTYs. Slaves are delayed to be sure masters * Now handle TTYs. Slaves are delayed to be sure masters
* are already opened. * are already opened.
*/ */
ret = open_fdinfos(me->pid.virt, &me->rst->tty_slaves, state); ret = open_fdinfos(me->pid.virt, &rsti(me)->tty_slaves, state);
if (ret) if (ret)
break; break;
...@@ -992,13 +992,13 @@ int prepare_fds(struct pstree_item *me) ...@@ -992,13 +992,13 @@ int prepare_fds(struct pstree_item *me)
* to be already restored, thus we store them in a separate * to be already restored, thus we store them in a separate
* list and restore at the very end. * list and restore at the very end.
*/ */
ret = open_fdinfos(me->pid.virt, &me->rst->eventpoll, state); ret = open_fdinfos(me->pid.virt, &rsti(me)->eventpoll, state);
if (ret) if (ret)
break; break;
} }
if (me->rst->fdt) if (rsti(me)->fdt)
futex_inc_and_wake(&me->rst->fdt->fdt_lock); futex_inc_and_wake(&rsti(me)->fdt->fdt_lock);
out: out:
close_service_fd(CR_PROC_FD_OFF); close_service_fd(CR_PROC_FD_OFF);
tty_fini_fds(); tty_fini_fds();
...@@ -1032,7 +1032,7 @@ static int fchroot(int fd) ...@@ -1032,7 +1032,7 @@ static int fchroot(int fd)
int restore_fs(struct pstree_item *me) int restore_fs(struct pstree_item *me)
{ {
int dd_root, dd_cwd, ret, err = -1; int dd_root, dd_cwd, ret, err = -1;
struct rst_info *ri = me->rst; struct rst_info *ri = rsti(me);
/* /*
* First -- open both descriptors. We will not * First -- open both descriptors. We will not
...@@ -1084,7 +1084,7 @@ out: ...@@ -1084,7 +1084,7 @@ out:
int prepare_fs_pid(struct pstree_item *item) int prepare_fs_pid(struct pstree_item *item)
{ {
pid_t pid = item->pid.virt; pid_t pid = item->pid.virt;
struct rst_info *ri = item->rst; struct rst_info *ri = rsti(item);
struct cr_img *img; struct cr_img *img;
FsEntry *fe; FsEntry *fe;
...@@ -1135,21 +1135,21 @@ int shared_fdt_prepare(struct pstree_item *item) ...@@ -1135,21 +1135,21 @@ int shared_fdt_prepare(struct pstree_item *item)
struct pstree_item *parent = item->parent; struct pstree_item *parent = item->parent;
struct fdt *fdt; struct fdt *fdt;
if (!parent->rst->fdt) { if (!rsti(parent)->fdt) {
fdt = shmalloc(sizeof(*item->rst->fdt)); fdt = shmalloc(sizeof(*rsti(item)->fdt));
if (fdt == NULL) if (fdt == NULL)
return -1; return -1;
parent->rst->fdt = fdt; rsti(parent)->fdt = fdt;
futex_init(&fdt->fdt_lock); futex_init(&fdt->fdt_lock);
fdt->nr = 1; fdt->nr = 1;
fdt->pid = parent->pid.virt; fdt->pid = parent->pid.virt;
} else } else
fdt = parent->rst->fdt; fdt = rsti(parent)->fdt;
item->rst->fdt = fdt; rsti(item)->fdt = fdt;
item->rst->service_fd_id = fdt->nr; rsti(item)->service_fd_id = fdt->nr;
fdt->nr++; fdt->nr++;
if (pid_rst_prio(item->pid.virt, fdt->pid)) if (pid_rst_prio(item->pid.virt, fdt->pid))
fdt->pid = item->pid.virt; fdt->pid = item->pid.virt;
......
...@@ -28,10 +28,14 @@ struct pstree_item { ...@@ -28,10 +28,14 @@ struct pstree_item {
struct pid *threads; /* array of threads */ struct pid *threads; /* array of threads */
CoreEntry **core; CoreEntry **core;
TaskKobjIdsEntry *ids; TaskKobjIdsEntry *ids;
struct rst_info rst[0];
}; };
/* See alloc_pstree_item() for details */
static inline struct rst_info *rsti(struct pstree_item *i)
{
return (struct rst_info *)(i + 1);
}
/* ids is alocated and initialized for all alive tasks */ /* ids is alocated and initialized for all alive tasks */
static inline int shared_fdtable(struct pstree_item *item) static inline int shared_fdtable(struct pstree_item *item)
{ {
......
...@@ -386,7 +386,7 @@ int prepare_mm_pid(struct pstree_item *i) ...@@ -386,7 +386,7 @@ int prepare_mm_pid(struct pstree_item *i)
pid_t pid = i->pid.virt; pid_t pid = i->pid.virt;
int ret = -1, vn = 0; int ret = -1, vn = 0;
struct cr_img *img; struct cr_img *img;
struct rst_info *ri = i->rst; struct rst_info *ri = rsti(i);
img = open_image(CR_FD_MM, O_RSTR | O_OPT, pid); img = open_image(CR_FD_MM, O_RSTR | O_OPT, pid);
if (!img) { if (!img) {
......
...@@ -168,11 +168,15 @@ struct pstree_item *__alloc_pstree_item(bool rst) ...@@ -168,11 +168,15 @@ struct pstree_item *__alloc_pstree_item(bool rst)
if (!item) if (!item)
return NULL; return NULL;
} else { } else {
item = shmalloc(sizeof(*item) + sizeof(item->rst[0])); int sz;
sz = sizeof(*item) + sizeof(struct rst_info);
item = shmalloc(sz);
if (!item) if (!item)
return NULL; return NULL;
memset(item, 0, sizeof(*item) + sizeof(item->rst[0]));
vm_area_list_init(&item->rst[0].vmas); memset(item, 0, sz);
vm_area_list_init(&rsti(item)->vmas);
} }
INIT_LIST_HEAD(&item->children); INIT_LIST_HEAD(&item->children);
...@@ -461,7 +465,7 @@ static int prepare_pstree_ids(void) ...@@ -461,7 +465,7 @@ static int prepare_pstree_ids(void)
helper->pid.virt = item->sid; helper->pid.virt = item->sid;
helper->state = TASK_HELPER; helper->state = TASK_HELPER;
helper->parent = root_item; helper->parent = root_item;
helper->rst->clone_flags = CLONE_FILES | CLONE_FS; rsti(helper)->clone_flags = CLONE_FILES | CLONE_FS;
list_add_tail(&helper->sibling, &helpers); list_add_tail(&helper->sibling, &helpers);
task_entries->nr_helpers++; task_entries->nr_helpers++;
...@@ -562,7 +566,7 @@ static int prepare_pstree_ids(void) ...@@ -562,7 +566,7 @@ static int prepare_pstree_ids(void)
} }
if (gleader) { if (gleader) {
item->rst->pgrp_leader = gleader; rsti(item)->pgrp_leader = gleader;
continue; continue;
} }
...@@ -582,10 +586,10 @@ static int prepare_pstree_ids(void) ...@@ -582,10 +586,10 @@ static int prepare_pstree_ids(void)
helper->pid.virt = item->pgid; helper->pid.virt = item->pgid;
helper->state = TASK_HELPER; helper->state = TASK_HELPER;
helper->parent = item; helper->parent = item;
helper->rst->clone_flags = CLONE_FILES | CLONE_FS; rsti(helper)->clone_flags = CLONE_FILES | CLONE_FS;
list_add(&helper->sibling, &item->children); list_add(&helper->sibling, &item->children);
task_entries->nr_helpers++; task_entries->nr_helpers++;
item->rst->pgrp_leader = helper; rsti(item)->pgrp_leader = helper;
pr_info("Add a helper %d for restoring PGID %d\n", pr_info("Add a helper %d for restoring PGID %d\n",
helper->pid.virt, helper->pgid); helper->pid.virt, helper->pgid);
...@@ -669,7 +673,7 @@ static int prepare_pstree_kobj_ids(void) ...@@ -669,7 +673,7 @@ static int prepare_pstree_kobj_ids(void)
} }
set_mask: set_mask:
item->rst->clone_flags = cflags; rsti(item)->clone_flags = cflags;
if (parent) if (parent)
/* /*
* Mount namespaces are setns()-ed at * Mount namespaces are setns()-ed at
...@@ -677,7 +681,7 @@ set_mask: ...@@ -677,7 +681,7 @@ set_mask:
* no need in creating it with its own * no need in creating it with its own
* temporary namespace * temporary namespace
*/ */
item->rst->clone_flags &= ~CLONE_NEWNS; rsti(item)->clone_flags &= ~CLONE_NEWNS;
cflags &= CLONE_ALLNS; cflags &= CLONE_ALLNS;
......
...@@ -764,7 +764,7 @@ static int tty_find_restoring_task(struct tty_info *info) ...@@ -764,7 +764,7 @@ static int tty_find_restoring_task(struct tty_info *info)
pr_info("Set a control terminal %x to %d\n", pr_info("Set a control terminal %x to %d\n",
info->tfe->id, info->tie->sid); info->tfe->id, info->tie->sid);
return prepare_ctl_tty(item->pid.virt, return prepare_ctl_tty(item->pid.virt,
item->rst, rsti(item),
info->tfe->id); info->tfe->id);
} }
......
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