diff options
Diffstat (limited to 'mm/vmalloc.c')
| -rw-r--r-- | mm/vmalloc.c | 22 | 
1 files changed, 15 insertions, 7 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index ab986dd09b6a..6dbcdceecae1 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -514,6 +514,7 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr,  		unsigned long end, pgprot_t prot, struct page **pages, int *nr,  		pgtbl_mod_mask *mask)  { +	int err = 0;  	pte_t *pte;  	/* @@ -530,12 +531,18 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr,  	do {  		struct page *page = pages[*nr]; -		if (WARN_ON(!pte_none(ptep_get(pte)))) -			return -EBUSY; -		if (WARN_ON(!page)) -			return -ENOMEM; -		if (WARN_ON(!pfn_valid(page_to_pfn(page)))) -			return -EINVAL; +		if (WARN_ON(!pte_none(ptep_get(pte)))) { +			err = -EBUSY; +			break; +		} +		if (WARN_ON(!page)) { +			err = -ENOMEM; +			break; +		} +		if (WARN_ON(!pfn_valid(page_to_pfn(page)))) { +			err = -EINVAL; +			break; +		}  		set_pte_at(&init_mm, addr, pte, mk_pte(page, prot));  		(*nr)++; @@ -543,7 +550,8 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr,  	arch_leave_lazy_mmu_mode();  	*mask |= PGTBL_PTE_MODIFIED; -	return 0; + +	return err;  }  static int vmap_pages_pmd_range(pud_t *pud, unsigned long addr,  | 
