X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Ffork.c;h=be07582f0d719e17bd0613ebb39414f13ab6cb4a;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=bfb4ad6672b322e103099af112441e40f4832e86;hpb=db216c3d5e4c040e557a50f8f5d35d5c415e8c1c;p=linux-2.6.git diff --git a/kernel/fork.c b/kernel/fork.c index bfb4ad667..be07582f0 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -80,7 +81,6 @@ static kmem_cache_t *task_struct_cachep; static void free_task(struct task_struct *tsk) { free_thread_info(tsk->thread_info); - vxdprintk("freeing up task %p\n", tsk); clr_vx_info(&tsk->vx_info); clr_nx_info(&tsk->nx_info); free_task_struct(tsk); @@ -906,7 +906,6 @@ struct task_struct *copy_process(unsigned long clone_flags, goto fork_out; retval = -ENOMEM; - p = dup_task_struct(current); if (!p) goto fork_out; @@ -925,18 +924,18 @@ struct task_struct *copy_process(unsigned long clone_flags, } if (p->mm && vx_flags(VXF_FORK_RSS, 0)) { if (!vx_rsspages_avail(p->mm, p->mm->rss)) - goto bad_fork_free; + goto bad_fork_cleanup_vm; } retval = -EAGAIN; if (!vx_nproc_avail(1)) - goto bad_fork_free; + goto bad_fork_cleanup_vm; if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur) { if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) && p->user != &root_user) - goto bad_fork_free; + goto bad_fork_cleanup_vm; } atomic_inc(&p->user->__count); @@ -1004,7 +1003,6 @@ struct task_struct *copy_process(unsigned long clone_flags, } #endif - retval = -ENOMEM; if ((retval = security_task_alloc(p))) goto bad_fork_cleanup_policy; if ((retval = audit_alloc(p))) @@ -1124,12 +1122,12 @@ struct task_struct *copy_process(unsigned long clone_flags, link_pid(p, p->pids + PIDTYPE_TGID, &p->group_leader->pids[PIDTYPE_TGID].pid); nr_threads++; - vxi = current->vx_info; + /* p is copy of current */ + vxi = p->vx_info; if (vxi) { atomic_inc(&vxi->cacct.nr_threads); - // atomic_inc(&vxi->limit.rcur[RLIMIT_NPROC]); + atomic_inc(&vxi->limit.rcur[RLIMIT_NPROC]); } - vx_nproc_inc(); write_unlock_irq(&tasklist_lock); retval = 0; @@ -1173,6 +1171,9 @@ bad_fork_cleanup_count: put_group_info(p->group_info); atomic_dec(&p->user->processes); free_uid(p->user); +bad_fork_cleanup_vm: + if (p->mm && !(clone_flags & CLONE_VM)) + vx_pages_sub(p->mm->mm_vx_info, RLIMIT_AS, p->mm->total_vm); bad_fork_free: free_task(p); goto fork_out;