summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/btree_io.c9
-rw-r--r--drivers/md/bcache/io.c30
-rw-r--r--drivers/md/bcache/util.c31
-rw-r--r--drivers/md/bcache/util.h3
4 files changed, 25 insertions, 48 deletions
diff --git a/drivers/md/bcache/btree_io.c b/drivers/md/bcache/btree_io.c
index a9dbf4a8ad87..4a7a5275696e 100644
--- a/drivers/md/bcache/btree_io.c
+++ b/drivers/md/bcache/btree_io.c
@@ -640,15 +640,8 @@ static void do_btree_node_write(struct closure *cl)
b->written += sectors_to_write;
if (!bio_alloc_pages(bio, __GFP_NOWARN|GFP_NOWAIT)) {
- int j;
- struct bio_vec *bv;
- void *base = (void *) ((unsigned long) data & ~(PAGE_SIZE - 1));
-
- bio_for_each_segment_all(bv, bio, j)
- memcpy(page_address(bv->bv_page),
- base + (j << PAGE_SHIFT), PAGE_SIZE);
-
wbio->bounce = true;
+ memcpy_to_bio(bio, bio->bi_iter, data);
bch_submit_bbio_replicas(wbio, c, &k.key, 0, true);
continue_at(cl, btree_node_write_done, NULL);
diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c
index 4ba104e0c026..2f1d2f845d3f 100644
--- a/drivers/md/bcache/io.c
+++ b/drivers/md/bcache/io.c
@@ -200,36 +200,6 @@ void bch_bbio_endio(struct bbio *bio)
/* Writes */
-static void memcpy_to_bio(struct bio *dst, struct bvec_iter dst_iter,
- void *src)
-{
- struct bio_vec bv;
- struct bvec_iter iter;
-
- __bio_for_each_segment(bv, dst, iter, dst_iter) {
- void *dstp = kmap_atomic(bv.bv_page);
- memcpy(dstp + bv.bv_offset, src, bv.bv_len);
- kunmap_atomic(dstp);
-
- src += bv.bv_len;
- }
-}
-
-static void memcpy_from_bio(void *dst, struct bio *src,
- struct bvec_iter src_iter)
-{
- struct bio_vec bv;
- struct bvec_iter iter;
-
- __bio_for_each_segment(bv, src, iter, src_iter) {
- void *srcp = kmap_atomic(bv.bv_page);
- memcpy(dst, srcp + bv.bv_offset, bv.bv_len);
- kunmap_atomic(srcp);
-
- dst += bv.bv_len;
- }
-}
-
enum bounced {
BOUNCED_MAPPED,
BOUNCED_KMALLOCED,
diff --git a/drivers/md/bcache/util.c b/drivers/md/bcache/util.c
index 4855a1da9bb9..9a0d89d6223c 100644
--- a/drivers/md/bcache/util.c
+++ b/drivers/md/bcache/util.c
@@ -400,17 +400,30 @@ size_t bch_rand_range(size_t max)
return rand;
}
-void bch_semaphore_resize(struct semaphore *sem, int delta)
+void memcpy_to_bio(struct bio *dst, struct bvec_iter dst_iter, void *src)
{
- while (delta > 0) {
- /* This should not block */
- up(sem);
- delta -= 1;
+ struct bio_vec bv;
+ struct bvec_iter iter;
+
+ __bio_for_each_segment(bv, dst, iter, dst_iter) {
+ void *dstp = kmap_atomic(bv.bv_page);
+ memcpy(dstp + bv.bv_offset, src, bv.bv_len);
+ kunmap_atomic(dstp);
+
+ src += bv.bv_len;
}
+}
+
+void memcpy_from_bio(void *dst, struct bio *src, struct bvec_iter src_iter)
+{
+ struct bio_vec bv;
+ struct bvec_iter iter;
+
+ __bio_for_each_segment(bv, src, iter, src_iter) {
+ void *srcp = kmap_atomic(bv.bv_page);
+ memcpy(dst, srcp + bv.bv_offset, bv.bv_len);
+ kunmap_atomic(srcp);
- while (delta < 0) {
- /* This can block */
- down(sem);
- delta += 1;
+ dst += bv.bv_len;
}
}
diff --git a/drivers/md/bcache/util.h b/drivers/md/bcache/util.h
index ff585aecf756..f451e4a08e39 100644
--- a/drivers/md/bcache/util.h
+++ b/drivers/md/bcache/util.h
@@ -629,6 +629,7 @@ do { \
size_t bch_rand_range(size_t);
-void bch_semaphore_resize(struct semaphore *sem, int delta);
+void memcpy_to_bio(struct bio *, struct bvec_iter, void *);
+void memcpy_from_bio(void *, struct bio *, struct bvec_iter);
#endif /* _BCACHE_UTIL_H */