diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/fork.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 7616bcf107b9..bab7b254ad39 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -329,15 +329,17 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
329 | if (!tmp) | 329 | if (!tmp) |
330 | goto fail_nomem; | 330 | goto fail_nomem; |
331 | *tmp = *mpnt; | 331 | *tmp = *mpnt; |
332 | INIT_LIST_HEAD(&tmp->anon_vma_chain); | ||
332 | pol = mpol_dup(vma_policy(mpnt)); | 333 | pol = mpol_dup(vma_policy(mpnt)); |
333 | retval = PTR_ERR(pol); | 334 | retval = PTR_ERR(pol); |
334 | if (IS_ERR(pol)) | 335 | if (IS_ERR(pol)) |
335 | goto fail_nomem_policy; | 336 | goto fail_nomem_policy; |
336 | vma_set_policy(tmp, pol); | 337 | vma_set_policy(tmp, pol); |
338 | if (anon_vma_fork(tmp, mpnt)) | ||
339 | goto fail_nomem_anon_vma_fork; | ||
337 | tmp->vm_flags &= ~VM_LOCKED; | 340 | tmp->vm_flags &= ~VM_LOCKED; |
338 | tmp->vm_mm = mm; | 341 | tmp->vm_mm = mm; |
339 | tmp->vm_next = NULL; | 342 | tmp->vm_next = NULL; |
340 | anon_vma_link(tmp); | ||
341 | file = tmp->vm_file; | 343 | file = tmp->vm_file; |
342 | if (file) { | 344 | if (file) { |
343 | struct inode *inode = file->f_path.dentry->d_inode; | 345 | struct inode *inode = file->f_path.dentry->d_inode; |
@@ -392,6 +394,8 @@ out: | |||
392 | flush_tlb_mm(oldmm); | 394 | flush_tlb_mm(oldmm); |
393 | up_write(&oldmm->mmap_sem); | 395 | up_write(&oldmm->mmap_sem); |
394 | return retval; | 396 | return retval; |
397 | fail_nomem_anon_vma_fork: | ||
398 | mpol_put(pol); | ||
395 | fail_nomem_policy: | 399 | fail_nomem_policy: |
396 | kmem_cache_free(vm_area_cachep, tmp); | 400 | kmem_cache_free(vm_area_cachep, tmp); |
397 | fail_nomem: | 401 | fail_nomem: |