> + if (!bv) > + return -ENOMEM; > + > + pages = (void *)(bv + npages); I think this cast should be to struct page **… not void *. > + npages = alloc_pages_bulk_array(GFP_USER, npages, pages); > + if (!npages) { > + kfree(bv); > + return -ENOMEM; > + } > + reclaim = npages * PAGE_SIZE; > + remain = 0; > + if (ret > 0) { > + reclaim -= ret; > + remain = ret; ... > + /* Free any pages that didn't get touched at all. */ > + reclaim /= PAGE_SIZE; Any reason not to keep reclaim in PAGE_SIZE units to start with?