diff options
author | Christoph Hellwig <hch@lst.de> | 2025-04-28 07:09:47 -0700 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2025-04-28 11:45:40 -0600 |
commit | 75d99aa279561fc6d91afec8bdd1b56548f860a2 (patch) | |
tree | 66be071dd6b47cc88cf921a495b11969e24ba581 /drivers/block | |
parent | bf4b8794de2019d6d8355a6bb220d806c7012e32 (diff) |
brd: pass a bvec pointer to brd_do_bvec
Pass the bvec to brd_do_bvec instead of marshalling the information into
individual arguments.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Link: https://lore.kernel.org/r/20250428141014.2360063-2-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/brd.c | 35 |
1 files changed, 13 insertions, 22 deletions
diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 292f127cae0a..c8974bc545fb 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -189,12 +189,10 @@ static void copy_from_brd(void *dst, struct brd_device *brd, /* * Process a single bvec of a bio. */ -static int brd_do_bvec(struct brd_device *brd, struct page *page, - unsigned int len, unsigned int off, blk_opf_t opf, - sector_t sector) +static int brd_rw_bvec(struct brd_device *brd, struct bio_vec *bv, + blk_opf_t opf, sector_t sector) { void *mem; - int err = 0; if (op_is_write(opf)) { /* @@ -202,24 +200,23 @@ static int brd_do_bvec(struct brd_device *brd, struct page *page, * block or filesystem layers from page reclaim. */ gfp_t gfp = opf & REQ_NOWAIT ? GFP_NOWAIT : GFP_NOIO; + int err; - err = copy_to_brd_setup(brd, sector, len, gfp); + err = copy_to_brd_setup(brd, sector, bv->bv_len, gfp); if (err) - goto out; + return err; } - mem = kmap_atomic(page); + mem = kmap_atomic(bv->bv_page); if (!op_is_write(opf)) { - copy_from_brd(mem + off, brd, sector, len); - flush_dcache_page(page); + copy_from_brd(mem + bv->bv_offset, brd, sector, bv->bv_len); + flush_dcache_page(bv->bv_page); } else { - flush_dcache_page(page); - copy_to_brd(brd, mem + off, sector, len); + flush_dcache_page(bv->bv_page); + copy_to_brd(brd, mem + bv->bv_offset, sector, bv->bv_len); } kunmap_atomic(mem); - -out: - return err; + return 0; } static void brd_do_discard(struct brd_device *brd, sector_t sector, u32 size) @@ -255,15 +252,9 @@ static void brd_submit_bio(struct bio *bio) } bio_for_each_segment(bvec, bio, iter) { - unsigned int len = bvec.bv_len; int err; - /* Don't support un-aligned buffer */ - WARN_ON_ONCE((bvec.bv_offset & (SECTOR_SIZE - 1)) || - (len & (SECTOR_SIZE - 1))); - - err = brd_do_bvec(brd, bvec.bv_page, len, bvec.bv_offset, - bio->bi_opf, sector); + err = brd_rw_bvec(brd, &bvec, bio->bi_opf, sector); if (err) { if (err == -ENOMEM && bio->bi_opf & REQ_NOWAIT) { bio_wouldblock_error(bio); @@ -272,7 +263,7 @@ static void brd_submit_bio(struct bio *bio) bio_io_error(bio); return; } - sector += len >> SECTOR_SHIFT; + sector += bvec.bv_len >> SECTOR_SHIFT; } bio_endio(bio); |