mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 04:34:08 +08:00
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 <hlitz@ucsc.edu> Reviewed-by: Javier González <javier@javigon.com> Signed-off-by: Matias Bjørling <mb@lightnvm.io> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
474a280036
commit
510fd8ea98
@ -323,14 +323,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;
|
||||
struct bio_vec *bv;
|
||||
struct page *page;
|
||||
int i, e, nbv = 0;
|
||||
|
||||
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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user