diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index b3f7a1bb5e55..3384eb89cb1c 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -108,10 +108,8 @@ void free_task(struct task_struct *tsk) | |||
108 | } | 108 | } |
109 | EXPORT_SYMBOL(free_task); | 109 | EXPORT_SYMBOL(free_task); |
110 | 110 | ||
111 | void __put_task_struct_cb(struct rcu_head *rhp) | 111 | void __put_task_struct(struct task_struct *tsk) |
112 | { | 112 | { |
113 | struct task_struct *tsk = container_of(rhp, struct task_struct, rcu); | ||
114 | |||
115 | WARN_ON(!(tsk->exit_state & (EXIT_DEAD | EXIT_ZOMBIE))); | 113 | WARN_ON(!(tsk->exit_state & (EXIT_DEAD | EXIT_ZOMBIE))); |
116 | WARN_ON(atomic_read(&tsk->usage)); | 114 | WARN_ON(atomic_read(&tsk->usage)); |
117 | WARN_ON(tsk == current); | 115 | WARN_ON(tsk == current); |
@@ -126,6 +124,12 @@ void __put_task_struct_cb(struct rcu_head *rhp) | |||
126 | free_task(tsk); | 124 | free_task(tsk); |
127 | } | 125 | } |
128 | 126 | ||
127 | void __put_task_struct_cb(struct rcu_head *rhp) | ||
128 | { | ||
129 | struct task_struct *tsk = container_of(rhp, struct task_struct, rcu); | ||
130 | __put_task_struct(tsk); | ||
131 | } | ||
132 | |||
129 | void __init fork_init(unsigned long mempages) | 133 | void __init fork_init(unsigned long mempages) |
130 | { | 134 | { |
131 | #ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR | 135 | #ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR |
@@ -721,7 +725,7 @@ out_release: | |||
721 | free_fdset (new_fdt->open_fds, new_fdt->max_fdset); | 725 | free_fdset (new_fdt->open_fds, new_fdt->max_fdset); |
722 | free_fd_array(new_fdt->fd, new_fdt->max_fds); | 726 | free_fd_array(new_fdt->fd, new_fdt->max_fds); |
723 | kmem_cache_free(files_cachep, newf); | 727 | kmem_cache_free(files_cachep, newf); |
724 | goto out; | 728 | return NULL; |
725 | } | 729 | } |
726 | 730 | ||
727 | static int copy_files(unsigned long clone_flags, struct task_struct * tsk) | 731 | static int copy_files(unsigned long clone_flags, struct task_struct * tsk) |
@@ -1311,17 +1315,19 @@ long do_fork(unsigned long clone_flags, | |||
1311 | { | 1315 | { |
1312 | struct task_struct *p; | 1316 | struct task_struct *p; |
1313 | int trace = 0; | 1317 | int trace = 0; |
1314 | long pid = alloc_pidmap(); | 1318 | struct pid *pid = alloc_pid(); |
1319 | long nr; | ||
1315 | 1320 | ||
1316 | if (pid < 0) | 1321 | if (!pid) |
1317 | return -EAGAIN; | 1322 | return -EAGAIN; |
1323 | nr = pid->nr; | ||
1318 | if (unlikely(current->ptrace)) { | 1324 | if (unlikely(current->ptrace)) { |
1319 | trace = fork_traceflag (clone_flags); | 1325 | trace = fork_traceflag (clone_flags); |
1320 | if (trace) | 1326 | if (trace) |
1321 | clone_flags |= CLONE_PTRACE; | 1327 | clone_flags |= CLONE_PTRACE; |
1322 | } | 1328 | } |
1323 | 1329 | ||
1324 | p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, pid); | 1330 | p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, nr); |
1325 | /* | 1331 | /* |
1326 | * Do this prior waking up the new thread - the thread pointer | 1332 | * Do this prior waking up the new thread - the thread pointer |
1327 | * might get invalid after that point, if the thread exits quickly. | 1333 | * might get invalid after that point, if the thread exits quickly. |
@@ -1348,7 +1354,7 @@ long do_fork(unsigned long clone_flags, | |||
1348 | p->state = TASK_STOPPED; | 1354 | p->state = TASK_STOPPED; |
1349 | 1355 | ||
1350 | if (unlikely (trace)) { | 1356 | if (unlikely (trace)) { |
1351 | current->ptrace_message = pid; | 1357 | current->ptrace_message = nr; |
1352 | ptrace_notify ((trace << 8) | SIGTRAP); | 1358 | ptrace_notify ((trace << 8) | SIGTRAP); |
1353 | } | 1359 | } |
1354 | 1360 | ||
@@ -1358,10 +1364,10 @@ long do_fork(unsigned long clone_flags, | |||
1358 | ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP); | 1364 | ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP); |
1359 | } | 1365 | } |
1360 | } else { | 1366 | } else { |
1361 | free_pidmap(pid); | 1367 | free_pid(pid); |
1362 | pid = PTR_ERR(p); | 1368 | nr = PTR_ERR(p); |
1363 | } | 1369 | } |
1364 | return pid; | 1370 | return nr; |
1365 | } | 1371 | } |
1366 | 1372 | ||
1367 | #ifndef ARCH_MIN_MMSTRUCT_ALIGN | 1373 | #ifndef ARCH_MIN_MMSTRUCT_ALIGN |