Skip to content

Commit

Permalink
block: rewrite bio_copy_data_iter to use bvec_kmap_local and memcpy_t…
Browse files Browse the repository at this point in the history
…o_bvec

Use the proper helpers instead of open coding the copy.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20210727055646.118787-11-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Christoph Hellwig authored and axboe committed Aug 2, 2021
1 parent bda135d commit f8b679a
Showing 1 changed file with 8 additions and 20 deletions.
28 changes: 8 additions & 20 deletions block/bio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1186,27 +1186,15 @@ EXPORT_SYMBOL(bio_advance);
void bio_copy_data_iter(struct bio *dst, struct bvec_iter *dst_iter,
struct bio *src, struct bvec_iter *src_iter)
{
struct bio_vec src_bv, dst_bv;
void *src_p, *dst_p;
unsigned bytes;

while (src_iter->bi_size && dst_iter->bi_size) {
src_bv = bio_iter_iovec(src, *src_iter);
dst_bv = bio_iter_iovec(dst, *dst_iter);

bytes = min(src_bv.bv_len, dst_bv.bv_len);

src_p = kmap_atomic(src_bv.bv_page);
dst_p = kmap_atomic(dst_bv.bv_page);

memcpy(dst_p + dst_bv.bv_offset,
src_p + src_bv.bv_offset,
bytes);

kunmap_atomic(dst_p);
kunmap_atomic(src_p);

flush_dcache_page(dst_bv.bv_page);
struct bio_vec src_bv = bio_iter_iovec(src, *src_iter);
struct bio_vec dst_bv = bio_iter_iovec(dst, *dst_iter);
unsigned int bytes = min(src_bv.bv_len, dst_bv.bv_len);
void *src_buf;

src_buf = bvec_kmap_local(&src_bv);
memcpy_to_bvec(&dst_bv, src_buf);
kunmap_local(src_buf);

bio_advance_iter_single(src, src_iter, bytes);
bio_advance_iter_single(dst, dst_iter, bytes);
Expand Down

0 comments on commit f8b679a

Please sign in to comment.