diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-11-10 05:33:39 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2021-12-25 17:37:09 -0500 |
commit | 9218f892ed9255a8d25009de5156ccc9e6a121af (patch) | |
tree | 31df82dd75418bb9c14b95e713027c48c1020097 | |
parent | d979d8691e88d2230212d1322aa8d599f2cd9904 (diff) |
Revert "block: rewrite bio_copy_data_iter to use bvec_kmap_local and memcpy_to_bvec"
This reverts commit f8b679a070c536600c64a78c83b96aa617f8fa71.
-rw-r--r-- | block/bio.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/block/bio.c b/block/bio.c index 681142a6b01a..3c9cc0000168 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1284,15 +1284,27 @@ 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) { - 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); + 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); bio_advance_iter_single(src, src_iter, bytes); bio_advance_iter_single(dst, dst_iter, bytes); |