static void client_free_pages(struct dm_kcopyd_client *kc) { BUG_ON(kc->nr_free_pages != kc->nr_pages); drop_pages(kc->pages); kc->pages = NULL; kc->nr_free_pages = kc->nr_pages = 0; }
static void free_bio_pages(struct cache_c *dmc) { BUG_ON(dmc->nr_free_pages != dmc->nr_pages); drop_pages(dmc->pages); dmc->pages = NULL; dmc->nr_free_pages = dmc->nr_pages = 0; }
static int client_alloc_pages(struct dm_kcopyd_client *kc, unsigned int nr) { unsigned int i; struct page_list *pl = NULL, *next; for (i = 0; i < nr; i++) { next = alloc_pl(); if (!next) { if (pl) drop_pages(pl); return -ENOMEM; } next->next = pl; pl = next; } kcopyd_put_pages(kc, pl); kc->nr_pages += nr; return 0; }
/* * Allocate and reserve nr_pages for the use of a specific client. */ static int client_reserve_pages(struct dm_kcopyd_client *kc, unsigned nr_pages) { unsigned i; struct page_list *pl = NULL, *next; for (i = 0; i < nr_pages; i++) { next = alloc_pl(GFP_KERNEL); if (!next) { if (pl) drop_pages(pl); return -ENOMEM; } next->next = pl; pl = next; } kc->nr_reserved_pages += nr_pages; kcopyd_put_pages(kc, pl); return 0; }
static int alloc_bio_pages(struct cache_c *dmc, unsigned int nr) { unsigned int i; struct page_list *pl = NULL, *next; for (i = 0; i < nr; i++) { next = alloc_pl(); if (!next) { if (pl) drop_pages(pl); return -ENOMEM; } next->next = pl; pl = next; } kcached_put_pages(dmc, pl); dmc->nr_pages += nr; return 0; }