From f1bb01ab48f1bed95d7d1b3376da33d99a580beb Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Sun, 17 Nov 2019 04:59:54 +0100 Subject: [PATCH] Use bio_chain instead of rolling our own --- dm-compress/util.c | 64 +++++++++++++--------------------------------- 1 file changed, 18 insertions(+), 46 deletions(-) diff --git a/dm-compress/util.c b/dm-compress/util.c index 160bfee..fc86548 100644 --- a/dm-compress/util.c +++ b/dm-compress/util.c @@ -230,53 +230,21 @@ pblk_write(struct compress_params* kparams, submit_bio(bio); } -struct pblk_iov -{ - struct compress_params* kparams; - atomic_t remain; -}; - -void -pblk_writev_endio(struct bio* bio) -{ - struct pblk_iov* iov = bio->bi_private; - struct compress_params* kparams = iov->kparams; - struct page* page = bio->bi_io_vec[0].bv_page; - - if (bio->bi_status != BLK_STS_OK) { - printk(KERN_ERR "%s: I/O error\n", __func__); - kparams->params.flags |= CBD_FLAG_ERROR; - SetPageError(page); - } - if (atomic_dec_and_test(&iov->remain)) { - ClearPageDirty(page); - unlock_page(page); - kfree(iov); - } - bio_put(bio); -} - void pblk_writev(struct compress_params* kparams, u64* pblkv, u32 count, struct page* page) { u32 pblk_len = pblk_size(&kparams->params); - struct pblk_iov* iov; u32 idx; u32 page_off; u32 nr_bio; u64 pblk; u32 iov_nr_pblk; + struct bio* parent_bio; struct bio* bio; BUG_ON(pblk_len * count > PAGE_SIZE); - iov = kmalloc(sizeof(struct pblk_iov), GFP_KERNEL); - if (!iov) { - printk(KERN_ERR "%s: out of memory\n", __func__); - goto err; - } - iov->kparams = kparams; - atomic_set(&iov->remain, count); + parent_bio = NULL; idx = 0; page_off = 0; nr_bio = 0; @@ -292,25 +260,29 @@ pblk_writev(struct compress_params* kparams, pblk_len, pblk, iov_nr_pblk, page, page_off); if (!bio) { printk(KERN_ERR "%s: out of memory\n", __func__); - goto err_free; + goto err; + } + if (!parent_bio) { + bio->bi_end_io = pblk_write_endio; + bio->bi_private = kparams; + parent_bio = bio; + } + else { + bio_chain(bio, parent_bio); + parent_bio = bio; } - ++nr_bio; - bio->bi_end_io = pblk_writev_endio; - bio->bi_private = iov; - submit_bio(bio); page_off += pblk_len * iov_nr_pblk; - } - if (atomic_sub_and_test(count - nr_bio, &iov->remain)) { - ClearPageDirty(page); - unlock_page(page); - kfree(iov); + submit_bio(bio); } return; -err_free: - kfree(iov); err: + while (parent_bio) { + bio = parent_bio; + parent_bio = bio->bi_private; + bio_put(bio); + } kparams->params.flags |= CBD_FLAG_ERROR; SetPageError(page); unlock_page(page);