|
@@ -384,8 +384,10 @@ static void __vunmap(const void *addr, int deallocate_pages)
|
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < area->nr_pages; i++) {
|
|
|
- BUG_ON(!area->pages[i]);
|
|
|
- __free_page(area->pages[i]);
|
|
|
+ struct page *page = area->pages[i];
|
|
|
+
|
|
|
+ BUG_ON(!page);
|
|
|
+ __free_page(page);
|
|
|
}
|
|
|
|
|
|
if (area->flags & VM_VPAGES)
|
|
@@ -489,15 +491,19 @@ void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < area->nr_pages; i++) {
|
|
|
+ struct page *page;
|
|
|
+
|
|
|
if (node < 0)
|
|
|
- area->pages[i] = alloc_page(gfp_mask);
|
|
|
+ page = alloc_page(gfp_mask);
|
|
|
else
|
|
|
- area->pages[i] = alloc_pages_node(node, gfp_mask, 0);
|
|
|
- if (unlikely(!area->pages[i])) {
|
|
|
+ page = alloc_pages_node(node, gfp_mask, 0);
|
|
|
+
|
|
|
+ if (unlikely(!page)) {
|
|
|
/* Successfully allocated i pages, free them in __vunmap() */
|
|
|
area->nr_pages = i;
|
|
|
goto fail;
|
|
|
}
|
|
|
+ area->pages[i] = page;
|
|
|
}
|
|
|
|
|
|
if (map_vm_area(area, prot, &pages))
|