diff options
Diffstat (limited to 'mm/mremap.c')
| -rw-r--r-- | mm/mremap.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/mm/mremap.c b/mm/mremap.c index 91b13d6a16d..05f1180e9f2 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -25,7 +25,6 @@  #include <asm/uaccess.h>  #include <asm/cacheflush.h>  #include <asm/tlbflush.h> -#include <asm/pgalloc.h>  #include "internal.h" @@ -63,10 +62,8 @@ static pmd_t *alloc_new_pmd(struct mm_struct *mm, struct vm_area_struct *vma,  		return NULL;  	pmd = pmd_alloc(mm, pud, addr); -	if (!pmd) { -		pud_free(mm, pud); +	if (!pmd)  		return NULL; -	}  	VM_BUG_ON(pmd_trans_huge(*pmd)); @@ -197,10 +194,17 @@ unsigned long move_page_tables(struct vm_area_struct *vma,  			break;  		if (pmd_trans_huge(*old_pmd)) {  			int err = 0; -			if (extent == HPAGE_PMD_SIZE) +			if (extent == HPAGE_PMD_SIZE) { +				VM_BUG_ON(vma->vm_file || !vma->anon_vma); +				/* See comment in move_ptes() */ +				if (need_rmap_locks) +					anon_vma_lock_write(vma->anon_vma);  				err = move_huge_pmd(vma, new_vma, old_addr,  						    new_addr, old_end,  						    old_pmd, new_pmd); +				if (need_rmap_locks) +					anon_vma_unlock_write(vma->anon_vma); +			}  			if (err > 0) {  				need_flush = true;  				continue;  | 
