fork: report pid reservation failure properly
[linux-2.6-block.git] / kernel / fork.c
index cf65139615a0d38e3fef37ee3a6e2e270c01ccaf..d778016ac1e35a374988bb8a8663499bb310e26b 100644 (file)
@@ -1279,9 +1279,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,
        if (nr_threads >= max_threads)
                goto bad_fork_cleanup_count;
 
-       if (!try_module_get(task_thread_info(p)->exec_domain->module))
-               goto bad_fork_cleanup_count;
-
        delayacct_tsk_init(p);  /* Must remain after dup_task_struct() */
        p->flags &= ~(PF_SUPERPRIV | PF_WQ_WORKER);
        p->flags |= PF_FORKNOEXEC;
@@ -1406,10 +1403,11 @@ static struct task_struct *copy_process(unsigned long clone_flags,
                goto bad_fork_cleanup_io;
 
        if (pid != &init_struct_pid) {
-               retval = -ENOMEM;
                pid = alloc_pid(p->nsproxy->pid_ns_for_children);
-               if (!pid)
+               if (IS_ERR(pid)) {
+                       retval = PTR_ERR(pid);
                        goto bad_fork_cleanup_io;
+               }
        }
 
        p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL;
@@ -1590,7 +1588,6 @@ bad_fork_cleanup_threadgroup_lock:
        if (clone_flags & CLONE_THREAD)
                threadgroup_change_end(current);
        delayacct_tsk_free(p);
-       module_put(task_thread_info(p)->exec_domain->module);
 bad_fork_cleanup_count:
        atomic_dec(&p->cred->user->processes);
        exit_creds(p);