Skip to content

Commit 510fd8e

Browse files
hlitzaxboe
authored andcommitted
lightnvm: pblk: fix freeing of merged pages
bio_add_pc_page() may merge pages when a bio is padded due to a flush. Fix iteration over the bio to free the correct pages in case of a merge. Signed-off-by: Heiner Litz <[email protected]> Reviewed-by: Javier González <[email protected]> Signed-off-by: Matias Bjørling <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 474a280 commit 510fd8e

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

drivers/lightnvm/pblk-core.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -323,14 +323,16 @@ void pblk_free_rqd(struct pblk *pblk, struct nvm_rq *rqd, int type)
323323
void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off,
324324
int nr_pages)
325325
{
326-
struct bio_vec bv;
327-
int i;
328-
329-
WARN_ON(off + nr_pages != bio->bi_vcnt);
330-
331-
for (i = off; i < nr_pages + off; i++) {
332-
bv = bio->bi_io_vec[i];
333-
mempool_free(bv.bv_page, &pblk->page_bio_pool);
326+
struct bio_vec *bv;
327+
struct page *page;
328+
int i, e, nbv = 0;
329+
330+
for (i = 0; i < bio->bi_vcnt; i++) {
331+
bv = &bio->bi_io_vec[i];
332+
page = bv->bv_page;
333+
for (e = 0; e < bv->bv_len; e += PBLK_EXPOSED_PAGE_SIZE, nbv++)
334+
if (nbv >= off)
335+
mempool_free(page++, &pblk->page_bio_pool);
334336
}
335337
}
336338

0 commit comments

Comments
 (0)