diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 38badc50bebc..f2d3115483da 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -305,7 +305,7 @@ out: return retval; fail_nomem: retval = -ENOMEM; - fail: +fail: vm_unacct_memory(charge); goto out; } @@ -499,7 +499,7 @@ static int copy_mm(unsigned long clone_flags, struct task_struct * tsk) goto fail_nomem; if (init_new_context(tsk,mm)) - goto free_pt; + goto fail_nocontext; retval = dup_mmap(mm, oldmm); if (retval) @@ -514,6 +514,15 @@ free_pt: mmput(mm); fail_nomem: return retval; + +fail_nocontext: + /* + * If init_new_context() failed, we cannot use mmput() to free the mm + * because it calls destroy_context() + */ + mm_free_pgd(mm); + free_mm(mm); + return retval; } static inline struct fs_struct *__copy_fs_struct(struct fs_struct *old) |
