aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2013-08-07 17:26:39 -0400
committerKent Overstreet <kmo@daterainc.com>2013-11-24 01:33:50 -0500
commit1cb9dda4f4332aa560a2db39f92a96e1a8273cf8 (patch)
treeba73cf7643fe3564be9b363cbcaf646d4949c455 /fs
parent4550dd6c6b062fc5e5b647296d55da22616123c3 (diff)
block: Convert bio_copy_data() to bvec_iter
Our fancy new bvec iterator makes code like this much easier to write. Signed-off-by: Kent Overstreet <kmo@daterainc.com> Cc: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs')
-rw-r--r--fs/bio.c60
1 files changed, 25 insertions, 35 deletions
diff --git a/fs/bio.c b/fs/bio.c
index 07b4b7afa695..f61e59b38815 100644
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -852,58 +852,48 @@ EXPORT_SYMBOL(bio_alloc_pages);
852 */ 852 */
853void bio_copy_data(struct bio *dst, struct bio *src) 853void bio_copy_data(struct bio *dst, struct bio *src)
854{ 854{
855 struct bio_vec *src_bv, *dst_bv; 855 struct bvec_iter src_iter, dst_iter;
856 unsigned src_offset, dst_offset, bytes; 856 struct bio_vec src_bv, dst_bv;
857 void *src_p, *dst_p; 857 void *src_p, *dst_p;
858 unsigned bytes;
858 859
859 src_bv = __bio_iovec(src); 860 src_iter = src->bi_iter;
860 dst_bv = __bio_iovec(dst); 861 dst_iter = dst->bi_iter;
861
862 src_offset = src_bv->bv_offset;
863 dst_offset = dst_bv->bv_offset;
864 862
865 while (1) { 863 while (1) {
866 if (src_offset == src_bv->bv_offset + src_bv->bv_len) { 864 if (!src_iter.bi_size) {
867 src_bv++; 865 src = src->bi_next;
868 if (src_bv == bio_iovec_idx(src, src->bi_vcnt)) { 866 if (!src)
869 src = src->bi_next; 867 break;
870 if (!src)
871 break;
872
873 src_bv = __bio_iovec(src);
874 }
875 868
876 src_offset = src_bv->bv_offset; 869 src_iter = src->bi_iter;
877 } 870 }
878 871
879 if (dst_offset == dst_bv->bv_offset + dst_bv->bv_len) { 872 if (!dst_iter.bi_size) {
880 dst_bv++; 873 dst = dst->bi_next;
881 if (dst_bv == bio_iovec_idx(dst, dst->bi_vcnt)) { 874 if (!dst)
882 dst = dst->bi_next; 875 break;
883 if (!dst)
884 break;
885
886 dst_bv = __bio_iovec(dst);
887 }
888 876
889 dst_offset = dst_bv->bv_offset; 877 dst_iter = dst->bi_iter;
890 } 878 }
891 879
892 bytes = min(dst_bv->bv_offset + dst_bv->bv_len - dst_offset, 880 src_bv = bio_iter_iovec(src, src_iter);
893 src_bv->bv_offset + src_bv->bv_len - src_offset); 881 dst_bv = bio_iter_iovec(dst, dst_iter);
882
883 bytes = min(src_bv.bv_len, dst_bv.bv_len);
894 884
895 src_p = kmap_atomic(src_bv->bv_page); 885 src_p = kmap_atomic(src_bv.bv_page);
896 dst_p = kmap_atomic(dst_bv->bv_page); 886 dst_p = kmap_atomic(dst_bv.bv_page);
897 887
898 memcpy(dst_p + dst_offset, 888 memcpy(dst_p + dst_bv.bv_offset,
899 src_p + src_offset, 889 src_p + src_bv.bv_offset,
900 bytes); 890 bytes);
901 891
902 kunmap_atomic(dst_p); 892 kunmap_atomic(dst_p);
903 kunmap_atomic(src_p); 893 kunmap_atomic(src_p);
904 894
905 src_offset += bytes; 895 bio_advance_iter(src, &src_iter, bytes);
906 dst_offset += bytes; 896 bio_advance_iter(dst, &dst_iter, bytes);
907 } 897 }
908} 898}
909EXPORT_SYMBOL(bio_copy_data); 899EXPORT_SYMBOL(bio_copy_data);