#define VM_ALLOC       0x00000002      /* vmalloc() */
 #define VM_MAP         0x00000004      /* vmap()ed pages */
 #define VM_USERMAP     0x00000008      /* suitable for remap_vmalloc_range */
+#define VM_VPAGES      0x00000010      /* buffer for pages was vmalloc'ed */
 /* bits [20..32] reserved for arch specific ioremap internals */
 
 /*
 
                        __free_page(area->pages[i]);
                }
 
-               if (area->nr_pages > PAGE_SIZE/sizeof(struct page *))
+               if (area->flags & VM_VPAGES)
                        vfree(area->pages);
                else
                        kfree(area->pages);
 
        area->nr_pages = nr_pages;
        /* Please note that the recursion is strictly bounded. */
-       if (array_size > PAGE_SIZE)
+       if (array_size > PAGE_SIZE) {
                pages = __vmalloc_node(array_size, gfp_mask, PAGE_KERNEL, node);
-       else
+               area->flags |= VM_VPAGES;
+       } else
                pages = kmalloc_node(array_size, (gfp_mask & ~__GFP_HIGHMEM), node);
        area->pages = pages;
        if (!area->pages) {