diff options
-rw-r--r-- | drivers/md/bcache/btree_io.c | 9 | ||||
-rw-r--r-- | drivers/md/bcache/io.c | 30 | ||||
-rw-r--r-- | drivers/md/bcache/util.c | 31 | ||||
-rw-r--r-- | drivers/md/bcache/util.h | 3 |
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 */ |