summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-11-10 05:33:39 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2021-12-25 17:37:09 -0500
commit9218f892ed9255a8d25009de5156ccc9e6a121af (patch)
tree31df82dd75418bb9c14b95e713027c48c1020097
parentd979d8691e88d2230212d1322aa8d599f2cd9904 (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.c28
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);