Skip to content

Commit 7988613

Browse files
author
Kent Overstreet
committed
block: Convert bio_for_each_segment() to bvec_iter
More prep work for immutable biovecs - with immutable bvecs drivers won't be able to use the biovec directly, they'll need to use helpers that take into account bio->bi_iter.bi_bvec_done. This updates callers for the new usage without changing the implementation yet. Signed-off-by: Kent Overstreet <[email protected]> Cc: Jens Axboe <[email protected]> Cc: Geert Uytterhoeven <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: Paul Mackerras <[email protected]> Cc: "Ed L. Cashin" <[email protected]> Cc: Nick Piggin <[email protected]> Cc: Lars Ellenberg <[email protected]> Cc: Jiri Kosina <[email protected]> Cc: Paul Clements <[email protected]> Cc: Jim Paris <[email protected]> Cc: Geoff Levand <[email protected]> Cc: Yehuda Sadeh <[email protected]> Cc: Sage Weil <[email protected]> Cc: Alex Elder <[email protected]> Cc: [email protected] Cc: Joshua Morris <[email protected]> Cc: Philip Kelleher <[email protected]> Cc: Konrad Rzeszutek Wilk <[email protected]> Cc: Jeremy Fitzhardinge <[email protected]> Cc: Neil Brown <[email protected]> Cc: Martin Schwidefsky <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: [email protected] Cc: Nagalakshmi Nandigama <[email protected]> Cc: Sreekanth Reddy <[email protected]> Cc: [email protected] Cc: "James E.J. Bottomley" <[email protected]> Cc: Greg Kroah-Hartman <[email protected]> Cc: Alexander Viro <[email protected]> Cc: Steven Whitehouse <[email protected]> Cc: Herton Ronaldo Krzesinski <[email protected]> Cc: Tejun Heo <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Guo Chao <[email protected]> Cc: Asai Thambi S P <[email protected]> Cc: Selvan Mani <[email protected]> Cc: Sam Bradshaw <[email protected]> Cc: Matthew Wilcox <[email protected]> Cc: Keith Busch <[email protected]> Cc: Stephen Hemminger <[email protected]> Cc: Quoc-Son Anh <[email protected]> Cc: Sebastian Ott <[email protected]> Cc: Nitin Gupta <[email protected]> Cc: Minchan Kim <[email protected]> Cc: Jerome Marchand <[email protected]> Cc: Seth Jennings <[email protected]> Cc: "Martin K. Petersen" <[email protected]> Cc: Mike Snitzer <[email protected]> Cc: Vivek Goyal <[email protected]> Cc: "Darrick J. Wong" <[email protected]> Cc: Chris Metcalf <[email protected]> Cc: Jan Kara <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Acked-by: Geoff Levand <[email protected]>
1 parent a4ad39b commit 7988613

39 files changed

+401
-397
lines changed

arch/m68k/emu/nfblock.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,18 @@ struct nfhd_device {
6262
static void nfhd_make_request(struct request_queue *queue, struct bio *bio)
6363
{
6464
struct nfhd_device *dev = queue->queuedata;
65-
struct bio_vec *bvec;
66-
int i, dir, len, shift;
65+
struct bio_vec bvec;
66+
struct bvec_iter iter;
67+
int dir, len, shift;
6768
sector_t sec = bio->bi_iter.bi_sector;
6869

6970
dir = bio_data_dir(bio);
7071
shift = dev->bshift;
71-
bio_for_each_segment(bvec, bio, i) {
72-
len = bvec->bv_len;
72+
bio_for_each_segment(bvec, bio, iter) {
73+
len = bvec.bv_len;
7374
len >>= 9;
7475
nfhd_read_write(dev->id, 0, dir, sec >> shift, len >> shift,
75-
bvec_to_phys(bvec));
76+
bvec_to_phys(&bvec));
7677
sec += len;
7778
}
7879
bio_endio(bio, 0);

arch/powerpc/sysdev/axonram.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -109,28 +109,28 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio)
109109
struct axon_ram_bank *bank = bio->bi_bdev->bd_disk->private_data;
110110
unsigned long phys_mem, phys_end;
111111
void *user_mem;
112-
struct bio_vec *vec;
112+
struct bio_vec vec;
113113
unsigned int transfered;
114-
unsigned short idx;
114+
struct bvec_iter iter;
115115

116116
phys_mem = bank->io_addr + (bio->bi_iter.bi_sector <<
117117
AXON_RAM_SECTOR_SHIFT);
118118
phys_end = bank->io_addr + bank->size;
119119
transfered = 0;
120-
bio_for_each_segment(vec, bio, idx) {
121-
if (unlikely(phys_mem + vec->bv_len > phys_end)) {
120+
bio_for_each_segment(vec, bio, iter) {
121+
if (unlikely(phys_mem + vec.bv_len > phys_end)) {
122122
bio_io_error(bio);
123123
return;
124124
}
125125

126-
user_mem = page_address(vec->bv_page) + vec->bv_offset;
126+
user_mem = page_address(vec.bv_page) + vec.bv_offset;
127127
if (bio_data_dir(bio) == READ)
128-
memcpy(user_mem, (void *) phys_mem, vec->bv_len);
128+
memcpy(user_mem, (void *) phys_mem, vec.bv_len);
129129
else
130-
memcpy((void *) phys_mem, user_mem, vec->bv_len);
130+
memcpy((void *) phys_mem, user_mem, vec.bv_len);
131131

132-
phys_mem += vec->bv_len;
133-
transfered += vec->bv_len;
132+
phys_mem += vec.bv_len;
133+
transfered += vec.bv_len;
134134
}
135135
bio_endio(bio, 0);
136136
}

block/blk-core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2746,10 +2746,10 @@ void blk_rq_bio_prep(struct request_queue *q, struct request *rq,
27462746
void rq_flush_dcache_pages(struct request *rq)
27472747
{
27482748
struct req_iterator iter;
2749-
struct bio_vec *bvec;
2749+
struct bio_vec bvec;
27502750

27512751
rq_for_each_segment(bvec, rq, iter)
2752-
flush_dcache_page(bvec->bv_page);
2752+
flush_dcache_page(bvec.bv_page);
27532753
}
27542754
EXPORT_SYMBOL_GPL(rq_flush_dcache_pages);
27552755
#endif

block/blk-merge.c

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@
1212
static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
1313
struct bio *bio)
1414
{
15-
struct bio_vec *bv, *bvprv = NULL;
16-
int cluster, i, high, highprv = 1;
15+
struct bio_vec bv, bvprv = { NULL };
16+
int cluster, high, highprv = 1;
1717
unsigned int seg_size, nr_phys_segs;
1818
struct bio *fbio, *bbio;
19+
struct bvec_iter iter;
1920

2021
if (!bio)
2122
return 0;
@@ -25,25 +26,23 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
2526
seg_size = 0;
2627
nr_phys_segs = 0;
2728
for_each_bio(bio) {
28-
bio_for_each_segment(bv, bio, i) {
29+
bio_for_each_segment(bv, bio, iter) {
2930
/*
3031
* the trick here is making sure that a high page is
3132
* never considered part of another segment, since that
3233
* might change with the bounce page.
3334
*/
34-
high = page_to_pfn(bv->bv_page) > queue_bounce_pfn(q);
35-
if (high || highprv)
36-
goto new_segment;
37-
if (cluster) {
38-
if (seg_size + bv->bv_len
35+
high = page_to_pfn(bv.bv_page) > queue_bounce_pfn(q);
36+
if (!high && !highprv && cluster) {
37+
if (seg_size + bv.bv_len
3938
> queue_max_segment_size(q))
4039
goto new_segment;
41-
if (!BIOVEC_PHYS_MERGEABLE(bvprv, bv))
40+
if (!BIOVEC_PHYS_MERGEABLE(&bvprv, &bv))
4241
goto new_segment;
43-
if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv))
42+
if (!BIOVEC_SEG_BOUNDARY(q, &bvprv, &bv))
4443
goto new_segment;
4544

46-
seg_size += bv->bv_len;
45+
seg_size += bv.bv_len;
4746
bvprv = bv;
4847
continue;
4948
}
@@ -54,7 +53,7 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
5453

5554
nr_phys_segs++;
5655
bvprv = bv;
57-
seg_size = bv->bv_len;
56+
seg_size = bv.bv_len;
5857
highprv = high;
5958
}
6059
bbio = bio;
@@ -110,21 +109,21 @@ static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio,
110109
return 0;
111110
}
112111

113-
static void
112+
static inline void
114113
__blk_segment_map_sg(struct request_queue *q, struct bio_vec *bvec,
115-
struct scatterlist *sglist, struct bio_vec **bvprv,
114+
struct scatterlist *sglist, struct bio_vec *bvprv,
116115
struct scatterlist **sg, int *nsegs, int *cluster)
117116
{
118117

119118
int nbytes = bvec->bv_len;
120119

121-
if (*bvprv && *cluster) {
120+
if (*sg && *cluster) {
122121
if ((*sg)->length + nbytes > queue_max_segment_size(q))
123122
goto new_segment;
124123

125-
if (!BIOVEC_PHYS_MERGEABLE(*bvprv, bvec))
124+
if (!BIOVEC_PHYS_MERGEABLE(bvprv, bvec))
126125
goto new_segment;
127-
if (!BIOVEC_SEG_BOUNDARY(q, *bvprv, bvec))
126+
if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bvec))
128127
goto new_segment;
129128

130129
(*sg)->length += nbytes;
@@ -150,7 +149,7 @@ __blk_segment_map_sg(struct request_queue *q, struct bio_vec *bvec,
150149
sg_set_page(*sg, bvec->bv_page, nbytes, bvec->bv_offset);
151150
(*nsegs)++;
152151
}
153-
*bvprv = bvec;
152+
*bvprv = *bvec;
154153
}
155154

156155
/*
@@ -160,7 +159,7 @@ __blk_segment_map_sg(struct request_queue *q, struct bio_vec *bvec,
160159
int blk_rq_map_sg(struct request_queue *q, struct request *rq,
161160
struct scatterlist *sglist)
162161
{
163-
struct bio_vec *bvec, *bvprv;
162+
struct bio_vec bvec, bvprv;
164163
struct req_iterator iter;
165164
struct scatterlist *sg;
166165
int nsegs, cluster;
@@ -171,10 +170,9 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
171170
/*
172171
* for each bio in rq
173172
*/
174-
bvprv = NULL;
175173
sg = NULL;
176174
rq_for_each_segment(bvec, rq, iter) {
177-
__blk_segment_map_sg(q, bvec, sglist, &bvprv, &sg,
175+
__blk_segment_map_sg(q, &bvec, sglist, &bvprv, &sg,
178176
&nsegs, &cluster);
179177
} /* segments in rq */
180178

@@ -223,18 +221,17 @@ EXPORT_SYMBOL(blk_rq_map_sg);
223221
int blk_bio_map_sg(struct request_queue *q, struct bio *bio,
224222
struct scatterlist *sglist)
225223
{
226-
struct bio_vec *bvec, *bvprv;
224+
struct bio_vec bvec, bvprv;
227225
struct scatterlist *sg;
228226
int nsegs, cluster;
229-
unsigned long i;
227+
struct bvec_iter iter;
230228

231229
nsegs = 0;
232230
cluster = blk_queue_cluster(q);
233231

234-
bvprv = NULL;
235232
sg = NULL;
236-
bio_for_each_segment(bvec, bio, i) {
237-
__blk_segment_map_sg(q, bvec, sglist, &bvprv, &sg,
233+
bio_for_each_segment(bvec, bio, iter) {
234+
__blk_segment_map_sg(q, &bvec, sglist, &bvprv, &sg,
238235
&nsegs, &cluster);
239236
} /* segments in bio */
240237

drivers/block/aoe/aoecmd.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -897,28 +897,28 @@ rqbiocnt(struct request *r)
897897
static void
898898
bio_pageinc(struct bio *bio)
899899
{
900-
struct bio_vec *bv;
900+
struct bio_vec bv;
901901
struct page *page;
902-
int i;
902+
struct bvec_iter iter;
903903

904-
bio_for_each_segment(bv, bio, i) {
904+
bio_for_each_segment(bv, bio, iter) {
905905
/* Non-zero page count for non-head members of
906906
* compound pages is no longer allowed by the kernel.
907907
*/
908-
page = compound_trans_head(bv->bv_page);
908+
page = compound_trans_head(bv.bv_page);
909909
atomic_inc(&page->_count);
910910
}
911911
}
912912

913913
static void
914914
bio_pagedec(struct bio *bio)
915915
{
916-
struct bio_vec *bv;
917916
struct page *page;
918-
int i;
917+
struct bio_vec bv;
918+
struct bvec_iter iter;
919919

920-
bio_for_each_segment(bv, bio, i) {
921-
page = compound_trans_head(bv->bv_page);
920+
bio_for_each_segment(bv, bio, iter) {
921+
page = compound_trans_head(bv.bv_page);
922922
atomic_dec(&page->_count);
923923
}
924924
}

drivers/block/brd.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -328,9 +328,9 @@ static void brd_make_request(struct request_queue *q, struct bio *bio)
328328
struct block_device *bdev = bio->bi_bdev;
329329
struct brd_device *brd = bdev->bd_disk->private_data;
330330
int rw;
331-
struct bio_vec *bvec;
331+
struct bio_vec bvec;
332332
sector_t sector;
333-
int i;
333+
struct bvec_iter iter;
334334
int err = -EIO;
335335

336336
sector = bio->bi_iter.bi_sector;
@@ -347,10 +347,10 @@ static void brd_make_request(struct request_queue *q, struct bio *bio)
347347
if (rw == READA)
348348
rw = READ;
349349

350-
bio_for_each_segment(bvec, bio, i) {
351-
unsigned int len = bvec->bv_len;
352-
err = brd_do_bvec(brd, bvec->bv_page, len,
353-
bvec->bv_offset, rw, sector);
350+
bio_for_each_segment(bvec, bio, iter) {
351+
unsigned int len = bvec.bv_len;
352+
err = brd_do_bvec(brd, bvec.bv_page, len,
353+
bvec.bv_offset, rw, sector);
354354
if (err)
355355
break;
356356
sector += len >> SECTOR_SHIFT;

drivers/block/drbd/drbd_main.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,15 +1537,17 @@ static int _drbd_send_page(struct drbd_conf *mdev, struct page *page,
15371537

15381538
static int _drbd_send_bio(struct drbd_conf *mdev, struct bio *bio)
15391539
{
1540-
struct bio_vec *bvec;
1541-
int i;
1540+
struct bio_vec bvec;
1541+
struct bvec_iter iter;
1542+
15421543
/* hint all but last page with MSG_MORE */
1543-
bio_for_each_segment(bvec, bio, i) {
1544+
bio_for_each_segment(bvec, bio, iter) {
15441545
int err;
15451546

1546-
err = _drbd_no_send_page(mdev, bvec->bv_page,
1547-
bvec->bv_offset, bvec->bv_len,
1548-
i == bio->bi_vcnt - 1 ? 0 : MSG_MORE);
1547+
err = _drbd_no_send_page(mdev, bvec.bv_page,
1548+
bvec.bv_offset, bvec.bv_len,
1549+
bio_iter_last(bio, iter)
1550+
? 0 : MSG_MORE);
15491551
if (err)
15501552
return err;
15511553
}
@@ -1554,15 +1556,16 @@ static int _drbd_send_bio(struct drbd_conf *mdev, struct bio *bio)
15541556

15551557
static int _drbd_send_zc_bio(struct drbd_conf *mdev, struct bio *bio)
15561558
{
1557-
struct bio_vec *bvec;
1558-
int i;
1559+
struct bio_vec bvec;
1560+
struct bvec_iter iter;
1561+
15591562
/* hint all but last page with MSG_MORE */
1560-
bio_for_each_segment(bvec, bio, i) {
1563+
bio_for_each_segment(bvec, bio, iter) {
15611564
int err;
15621565

1563-
err = _drbd_send_page(mdev, bvec->bv_page,
1564-
bvec->bv_offset, bvec->bv_len,
1565-
i == bio->bi_vcnt - 1 ? 0 : MSG_MORE);
1566+
err = _drbd_send_page(mdev, bvec.bv_page,
1567+
bvec.bv_offset, bvec.bv_len,
1568+
bio_iter_last(bio, iter) ? 0 : MSG_MORE);
15661569
if (err)
15671570
return err;
15681571
}

drivers/block/drbd/drbd_receiver.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1595,9 +1595,10 @@ static int drbd_drain_block(struct drbd_conf *mdev, int data_size)
15951595
static int recv_dless_read(struct drbd_conf *mdev, struct drbd_request *req,
15961596
sector_t sector, int data_size)
15971597
{
1598-
struct bio_vec *bvec;
1598+
struct bio_vec bvec;
1599+
struct bvec_iter iter;
15991600
struct bio *bio;
1600-
int dgs, err, i, expect;
1601+
int dgs, err, expect;
16011602
void *dig_in = mdev->tconn->int_dig_in;
16021603
void *dig_vv = mdev->tconn->int_dig_vv;
16031604

@@ -1617,11 +1618,11 @@ static int recv_dless_read(struct drbd_conf *mdev, struct drbd_request *req,
16171618
bio = req->master_bio;
16181619
D_ASSERT(sector == bio->bi_iter.bi_sector);
16191620

1620-
bio_for_each_segment(bvec, bio, i) {
1621-
void *mapped = kmap(bvec->bv_page) + bvec->bv_offset;
1622-
expect = min_t(int, data_size, bvec->bv_len);
1621+
bio_for_each_segment(bvec, bio, iter) {
1622+
void *mapped = kmap(bvec.bv_page) + bvec.bv_offset;
1623+
expect = min_t(int, data_size, bvec.bv_len);
16231624
err = drbd_recv_all_warn(mdev->tconn, mapped, expect);
1624-
kunmap(bvec->bv_page);
1625+
kunmap(bvec.bv_page);
16251626
if (err)
16261627
return err;
16271628
data_size -= expect;

drivers/block/drbd/drbd_worker.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -313,17 +313,17 @@ void drbd_csum_bio(struct drbd_conf *mdev, struct crypto_hash *tfm, struct bio *
313313
{
314314
struct hash_desc desc;
315315
struct scatterlist sg;
316-
struct bio_vec *bvec;
317-
int i;
316+
struct bio_vec bvec;
317+
struct bvec_iter iter;
318318

319319
desc.tfm = tfm;
320320
desc.flags = 0;
321321

322322
sg_init_table(&sg, 1);
323323
crypto_hash_init(&desc);
324324

325-
bio_for_each_segment(bvec, bio, i) {
326-
sg_set_page(&sg, bvec->bv_page, bvec->bv_len, bvec->bv_offset);
325+
bio_for_each_segment(bvec, bio, iter) {
326+
sg_set_page(&sg, bvec.bv_page, bvec.bv_len, bvec.bv_offset);
327327
crypto_hash_update(&desc, &sg, sg.length);
328328
}
329329
crypto_hash_final(&desc, digest);

0 commit comments

Comments
 (0)