- want = (size + getpagesize() - 1) / getpagesize();
- metalen = metadata_length(pool, poolsize);
+ /* First comes the metadata length, then 2 bits per page, then
+ * the next pointer. */
+ pagestatebytes = div_up(pages * BITS_PER_PAGE, CHAR_BIT);
+ *metalen = sizeof(*metalen)
+ + align_up(pagestatebytes, ALIGNOF(unsigned long))
+ + sizeof(unsigned long);
+
+ /* Mark all the bits FREE to start, and zero the next pointer. */
+ BUILD_ASSERT(FREE == 0);
+ memset(metalen + 1, 0, *metalen - sizeof(*metalen));
+
+ /* Mark the metadata page(s) allocated. */
+ set_page_state(pool, 0, TAKEN_START);
+ for (i = 1; i < div_up(*metalen, getpagesize()); i++)
+ set_page_state(pool, i, TAKEN);
+}
+
+static void *alloc_get_pages(void *pool, unsigned long poolsize,
+ unsigned long pages, unsigned long align)
+{
+ long i;
+ unsigned long free;