|
|
@@ -288,14 +288,16 @@ void pblk_free_rqd(struct pblk *pblk, struct nvm_rq *rqd, int type)
|
|
|
void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off,
|
|
|
int nr_pages)
|
|
|
{
|
|
|
- struct bio_vec bv;
|
|
|
- int i;
|
|
|
-
|
|
|
- WARN_ON(off + nr_pages != bio->bi_vcnt);
|
|
|
-
|
|
|
- for (i = off; i < nr_pages + off; i++) {
|
|
|
- bv = bio->bi_io_vec[i];
|
|
|
- mempool_free(bv.bv_page, &pblk->page_bio_pool);
|
|
|
+ struct bio_vec *bv;
|
|
|
+ struct page *page;
|
|
|
+ int i, e, nbv = 0;
|
|
|
+
|
|
|
+ for (i = 0; i < bio->bi_vcnt; i++) {
|
|
|
+ bv = &bio->bi_io_vec[i];
|
|
|
+ page = bv->bv_page;
|
|
|
+ for (e = 0; e < bv->bv_len; e += PBLK_EXPOSED_PAGE_SIZE, nbv++)
|
|
|
+ if (nbv >= off)
|
|
|
+ mempool_free(page++, &pblk->page_bio_pool);
|
|
|
}
|
|
|
}
|
|
|
|