lightnvm: pblk: fix freeing of merged pages
[platform/kernel/linux-rpi.git] / drivers / lightnvm / pblk-core.c
index 95be6e3..80710c6 100644 (file)
@@ -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);
        }
 }