summaryrefslogtreecommitdiff
path: root/fs/bcachefs/io.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-11-09 13:30:14 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2021-11-09 16:18:28 -0500
commit34ec443419071970cd65ec18f7df45d52a85bf8b (patch)
treea822ac284b05607701a17b4e23d749e38580e33b /fs/bcachefs/io.c
parentb3173e62cb2560a11e956ce26dbce52c8a1db299 (diff)
bcachefs: revert bio_copy_data to v5.13bio_copy_data_revert
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/io.c')
-rw-r--r--fs/bcachefs/io.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c
index 3026daa7f9c2..fc4661d05826 100644
--- a/fs/bcachefs/io.c
+++ b/fs/bcachefs/io.c
@@ -877,6 +877,44 @@ static enum prep_encoded_ret {
return PREP_ENCODED_OK;
}
+static void old_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);
+
+ bio_advance_iter_single(src, src_iter, bytes);
+ bio_advance_iter_single(dst, dst_iter, bytes);
+ }
+}
+
+static void old_bio_copy_data(struct bio *dst, struct bio *src)
+{
+ struct bvec_iter src_iter = src->bi_iter;
+ struct bvec_iter dst_iter = dst->bi_iter;
+
+ old_bio_copy_data_iter(dst, &dst_iter, src, &src_iter);
+}
+
static int bch2_write_extent(struct bch_write_op *op, struct write_point *wp,
struct bio **_dst)
{
@@ -907,7 +945,7 @@ static int bch2_write_extent(struct bch_write_op *op, struct write_point *wp,
dst = bch2_write_bio_alloc(c, wp, src,
&page_alloc_failed,
ec_buf);
- bio_copy_data(dst, src);
+ old_bio_copy_data(dst, src);
bounce = true;
}
init_append_extent(op, wp, op->version, op->crc);
@@ -960,7 +998,7 @@ static int bch2_write_extent(struct bch_write_op *op, struct write_point *wp,
if (bounce) {
swap(dst->bi_iter.bi_size, dst_len);
- bio_copy_data(dst, src);
+ old_bio_copy_data(dst, src);
swap(dst->bi_iter.bi_size, dst_len);
}
@@ -1839,7 +1877,7 @@ static void __bch2_read_endio(struct work_struct *work)
if (rbio->bounce) {
struct bvec_iter src_iter = src->bi_iter;
- bio_copy_data_iter(dst, &dst_iter, src, &src_iter);
+ old_bio_copy_data_iter(dst, &dst_iter, src, &src_iter);
}
}