On 2020/04/07 8:25, Chaitanya Kulkarni wrote: > The existing routine xfs_rw_bdev has block layer bio-based code which > maps the data buffer allocated with kmalloc or vmalloc to the READ/WRITE > bios. Use a block layer helper from the previous patch to avoid code > duplication. > > Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@xxxxxxx> > --- > fs/xfs/xfs_bio_io.c | 47 ++------------------------------------------- > 1 file changed, 2 insertions(+), 45 deletions(-) > > diff --git a/fs/xfs/xfs_bio_io.c b/fs/xfs/xfs_bio_io.c > index e2148f2d5d6b..b04c398fb99c 100644 > --- a/fs/xfs/xfs_bio_io.c > +++ b/fs/xfs/xfs_bio_io.c > @@ -4,11 +4,6 @@ > */ > #include "xfs.h" > > -static inline unsigned int bio_max_vecs(unsigned int count) > -{ > - return min_t(unsigned, howmany(count, PAGE_SIZE), BIO_MAX_PAGES); > -} > - > int > xfs_rw_bdev( > struct block_device *bdev, > @@ -18,44 +13,6 @@ xfs_rw_bdev( > unsigned int op) > > { > - unsigned int is_vmalloc = is_vmalloc_addr(data); > - unsigned int left = count; > - int error; > - struct bio *bio; > - > - if (is_vmalloc && op == REQ_OP_WRITE) > - flush_kernel_vmap_range(data, count); > - > - bio = bio_alloc(GFP_KERNEL, bio_max_vecs(left)); > - bio_set_dev(bio, bdev); > - bio->bi_iter.bi_sector = sector; > - bio->bi_opf = op | REQ_META | REQ_SYNC; > - > - do { > - struct page *page = kmem_to_page(data); > - unsigned int off = offset_in_page(data); > - unsigned int len = min_t(unsigned, left, PAGE_SIZE - off); > - > - while (bio_add_page(bio, page, len, off) != len) { > - struct bio *prev = bio; > - > - bio = bio_alloc(GFP_KERNEL, bio_max_vecs(left)); > - bio_copy_dev(bio, prev); > - bio->bi_iter.bi_sector = bio_end_sector(prev); > - bio->bi_opf = prev->bi_opf; > - bio_chain(prev, bio); > - > - submit_bio(prev); > - } > - > - data += len; > - left -= len; > - } while (left > 0); Your helper could use a similar loop structure. This is very easy to read. > - > - error = submit_bio_wait(bio); > - bio_put(bio); > - > - if (is_vmalloc && op == REQ_OP_READ) > - invalidate_kernel_vmap_range(data, count); > - return error; > + return blkdev_issue_rw(bdev, data, sector, count, op, REQ_META, > + GFP_KERNEL); > } > -- Damien Le Moal Western Digital Research