diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index b1341205be27..03975d0467f9 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -1315,17 +1315,19 @@ long do_fork(unsigned long clone_flags, | |||
1315 | { | 1315 | { |
1316 | struct task_struct *p; | 1316 | struct task_struct *p; |
1317 | int trace = 0; | 1317 | int trace = 0; |
1318 | long pid = alloc_pidmap(); | 1318 | struct pid *pid = alloc_pid(); |
1319 | long nr; | ||
1319 | 1320 | ||
1320 | if (pid < 0) | 1321 | if (!pid) |
1321 | return -EAGAIN; | 1322 | return -EAGAIN; |
1323 | nr = pid->nr; | ||
1322 | if (unlikely(current->ptrace)) { | 1324 | if (unlikely(current->ptrace)) { |
1323 | trace = fork_traceflag (clone_flags); | 1325 | trace = fork_traceflag (clone_flags); |
1324 | if (trace) | 1326 | if (trace) |
1325 | clone_flags |= CLONE_PTRACE; | 1327 | clone_flags |= CLONE_PTRACE; |
1326 | } | 1328 | } |
1327 | 1329 | ||
1328 | 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); |
1329 | /* | 1331 | /* |
1330 | * Do this prior waking up the new thread - the thread pointer | 1332 | * Do this prior waking up the new thread - the thread pointer |
1331 | * might get invalid after that point, if the thread exits quickly. | 1333 | * might get invalid after that point, if the thread exits quickly. |
@@ -1352,7 +1354,7 @@ long do_fork(unsigned long clone_flags, | |||
1352 | p->state = TASK_STOPPED; | 1354 | p->state = TASK_STOPPED; |
1353 | 1355 | ||
1354 | if (unlikely (trace)) { | 1356 | if (unlikely (trace)) { |
1355 | current->ptrace_message = pid; | 1357 | current->ptrace_message = nr; |
1356 | ptrace_notify ((trace << 8) | SIGTRAP); | 1358 | ptrace_notify ((trace << 8) | SIGTRAP); |
1357 | } | 1359 | } |
1358 | 1360 | ||
@@ -1362,10 +1364,10 @@ long do_fork(unsigned long clone_flags, | |||
1362 | ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP); | 1364 | ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP); |
1363 | } | 1365 | } |
1364 | } else { | 1366 | } else { |
1365 | free_pidmap(pid); | 1367 | free_pid(pid); |
1366 | pid = PTR_ERR(p); | 1368 | nr = PTR_ERR(p); |
1367 | } | 1369 | } |
1368 | return pid; | 1370 | return nr; |
1369 | } | 1371 | } |
1370 | 1372 | ||
1371 | #ifndef ARCH_MIN_MMSTRUCT_ALIGN | 1373 | #ifndef ARCH_MIN_MMSTRUCT_ALIGN |