diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index ab5211b9e622..ff1cad3b7bdc 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -304,12 +304,17 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) | |||
304 | } | 304 | } |
305 | 305 | ||
306 | err = arch_dup_task_struct(tsk, orig); | 306 | err = arch_dup_task_struct(tsk, orig); |
307 | if (err) | ||
308 | goto out; | ||
309 | 307 | ||
308 | /* | ||
309 | * We defer looking at err, because we will need this setup | ||
310 | * for the clean up path to work correctly. | ||
311 | */ | ||
310 | tsk->stack = ti; | 312 | tsk->stack = ti; |
311 | |||
312 | setup_thread_stack(tsk, orig); | 313 | setup_thread_stack(tsk, orig); |
314 | |||
315 | if (err) | ||
316 | goto out; | ||
317 | |||
313 | clear_user_return_notifier(tsk); | 318 | clear_user_return_notifier(tsk); |
314 | clear_tsk_need_resched(tsk); | 319 | clear_tsk_need_resched(tsk); |
315 | stackend = end_of_stack(tsk); | 320 | stackend = end_of_stack(tsk); |
@@ -1415,7 +1420,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1415 | */ | 1420 | */ |
1416 | p->group_leader = p; | 1421 | p->group_leader = p; |
1417 | INIT_LIST_HEAD(&p->thread_group); | 1422 | INIT_LIST_HEAD(&p->thread_group); |
1418 | INIT_HLIST_HEAD(&p->task_works); | 1423 | p->task_works = NULL; |
1419 | 1424 | ||
1420 | /* Now that the task is set up, run cgroup callbacks if | 1425 | /* Now that the task is set up, run cgroup callbacks if |
1421 | * necessary. We need to run them before the task is visible | 1426 | * necessary. We need to run them before the task is visible |