Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

block: Convert bio_iovec() to bvec_iter

For immutable biovecs, we'll be introducing a new bio_iovec() that uses
our new bvec iterator to construct a biovec, taking into account
bvec_iter->bi_bvec_done - this patch updates existing users for the new
usage.

Some of the existing users really do need a pointer into the bvec array
- those uses are all going to be removed, but we'll need the
functionality from immutable to remove them - so for now rename the
existing bio_iovec() -> __bio_iovec(), and it'll be removed in a couple
patches.

Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: "Ed L. Cashin" <ecashin@coraid.com>
Cc: Alasdair Kergon <agk@redhat.com>
Cc: dm-devel@redhat.com
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>

+26 -23
+1 -1
drivers/block/aoe/aoecmd.c
··· 932 932 buf->resid = bio->bi_iter.bi_size; 933 933 buf->sector = bio->bi_iter.bi_sector; 934 934 bio_pageinc(bio); 935 - buf->bv = bio_iovec(bio); 935 + buf->bv = __bio_iovec(bio); 936 936 buf->bv_resid = buf->bv->bv_len; 937 937 WARN_ON(buf->bv_resid == 0); 938 938 }
+7 -6
drivers/md/bcache/io.c
··· 22 22 static void bch_generic_make_request_hack(struct bio *bio) 23 23 { 24 24 if (bio->bi_iter.bi_idx) { 25 + int i; 26 + struct bio_vec *bv; 25 27 struct bio *clone = bio_alloc(GFP_NOIO, bio_segments(bio)); 26 28 27 - memcpy(clone->bi_io_vec, 28 - bio_iovec(bio), 29 - bio_segments(bio) * sizeof(struct bio_vec)); 29 + bio_for_each_segment(bv, bio, i) 30 + clone->bi_io_vec[clone->bi_vcnt++] = *bv; 30 31 31 32 clone->bi_iter.bi_sector = bio->bi_iter.bi_sector; 32 33 clone->bi_bdev = bio->bi_bdev; ··· 98 97 if (!ret) 99 98 return NULL; 100 99 101 - memcpy(ret->bi_io_vec, bio_iovec(bio), 100 + memcpy(ret->bi_io_vec, __bio_iovec(bio), 102 101 sizeof(struct bio_vec) * vcnt); 103 102 104 103 break; ··· 107 106 if (!ret) 108 107 return NULL; 109 108 110 - memcpy(ret->bi_io_vec, bio_iovec(bio), 109 + memcpy(ret->bi_io_vec, __bio_iovec(bio), 111 110 sizeof(struct bio_vec) * vcnt); 112 111 113 112 ret->bi_io_vec[vcnt - 1].bv_len = nbytes; ··· 183 182 ret = min(ret, queue_max_sectors(q)); 184 183 185 184 WARN_ON(!ret); 186 - ret = max_t(int, ret, bio_iovec(bio)->bv_len >> 9); 185 + ret = max_t(int, ret, bio_iovec(bio).bv_len >> 9); 187 186 188 187 return ret; 189 188 }
+1 -1
drivers/md/dm-verity.c
··· 524 524 io->io_vec = io->io_vec_inline; 525 525 else 526 526 io->io_vec = mempool_alloc(v->vec_mempool, GFP_NOIO); 527 - memcpy(io->io_vec, bio_iovec(bio), 527 + memcpy(io->io_vec, __bio_iovec(bio), 528 528 io->io_vec_size * sizeof(struct bio_vec)); 529 529 530 530 verity_submit_prefetch(v, io);
+1 -1
drivers/scsi/sd.c
··· 801 801 if (sdkp->device->no_write_same) 802 802 return BLKPREP_KILL; 803 803 804 - BUG_ON(bio_offset(bio) || bio_iovec(bio)->bv_len != sdp->sector_size); 804 + BUG_ON(bio_offset(bio) || bio_iovec(bio).bv_len != sdp->sector_size); 805 805 806 806 sector >>= ilog2(sdp->sector_size) - 9; 807 807 nr_sectors >>= ilog2(sdp->sector_size) - 9;
+10 -10
fs/bio.c
··· 821 821 break; 822 822 } 823 823 824 - if (bytes >= bio_iovec(bio)->bv_len) { 825 - bytes -= bio_iovec(bio)->bv_len; 824 + if (bytes >= bio_iovec(bio).bv_len) { 825 + bytes -= bio_iovec(bio).bv_len; 826 826 bio->bi_iter.bi_idx++; 827 827 } else { 828 - bio_iovec(bio)->bv_len -= bytes; 829 - bio_iovec(bio)->bv_offset += bytes; 828 + bio_iovec(bio).bv_len -= bytes; 829 + bio_iovec(bio).bv_offset += bytes; 830 830 bytes = 0; 831 831 } 832 832 } ··· 879 879 unsigned src_offset, dst_offset, bytes; 880 880 void *src_p, *dst_p; 881 881 882 - src_bv = bio_iovec(src); 883 - dst_bv = bio_iovec(dst); 882 + src_bv = __bio_iovec(src); 883 + dst_bv = __bio_iovec(dst); 884 884 885 885 src_offset = src_bv->bv_offset; 886 886 dst_offset = dst_bv->bv_offset; ··· 893 893 if (!src) 894 894 break; 895 895 896 - src_bv = bio_iovec(src); 896 + src_bv = __bio_iovec(src); 897 897 } 898 898 899 899 src_offset = src_bv->bv_offset; ··· 906 906 if (!dst) 907 907 break; 908 908 909 - dst_bv = bio_iovec(dst); 909 + dst_bv = __bio_iovec(dst); 910 910 } 911 911 912 912 dst_offset = dst_bv->bv_offset; ··· 1776 1776 bp->bio1.bi_iter.bi_size = first_sectors << 9; 1777 1777 1778 1778 if (bi->bi_vcnt != 0) { 1779 - bp->bv1 = *bio_iovec(bi); 1780 - bp->bv2 = *bio_iovec(bi); 1779 + bp->bv1 = bio_iovec(bi); 1780 + bp->bv2 = bio_iovec(bi); 1781 1781 1782 1782 if (bio_is_rw(bi)) { 1783 1783 bp->bv2.bv_offset += first_sectors << 9;
+6 -4
include/linux/bio.h
··· 62 62 * on highmem page vectors 63 63 */ 64 64 #define bio_iovec_idx(bio, idx) (&((bio)->bi_io_vec[(idx)])) 65 - #define bio_iovec(bio) bio_iovec_idx((bio), (bio)->bi_iter.bi_idx) 66 - #define bio_page(bio) bio_iovec((bio))->bv_page 67 - #define bio_offset(bio) bio_iovec((bio))->bv_offset 65 + #define __bio_iovec(bio) bio_iovec_idx((bio), (bio)->bi_iter.bi_idx) 66 + #define bio_iovec(bio) (*__bio_iovec(bio)) 67 + 68 + #define bio_page(bio) (bio_iovec((bio)).bv_page) 69 + #define bio_offset(bio) (bio_iovec((bio)).bv_offset) 68 70 #define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_iter.bi_idx) 69 71 #define bio_sectors(bio) ((bio)->bi_iter.bi_size >> 9) 70 72 #define bio_end_sector(bio) ((bio)->bi_iter.bi_sector + bio_sectors((bio))) ··· 74 72 static inline unsigned int bio_cur_bytes(struct bio *bio) 75 73 { 76 74 if (bio->bi_vcnt) 77 - return bio_iovec(bio)->bv_len; 75 + return bio_iovec(bio).bv_len; 78 76 else /* dataless requests such as discard */ 79 77 return bio->bi_iter.bi_size; 80 78 }