Skip to content

Commit d57a5f7

Browse files
author
Kent Overstreet
committed
bio-integrity: Convert to bvec_iter
The bio integrity is also stored in a bvec array, so if we use the bvec iter code we just added, the integrity code won't need to implement its own iteration stuff (bio_integrity_mark_head(), bio_integrity_mark_tail()) Signed-off-by: Kent Overstreet <[email protected]> Cc: Jens Axboe <[email protected]> Cc: "Martin K. Petersen" <[email protected]> Cc: "James E.J. Bottomley" <[email protected]>
1 parent 1cb9dda commit d57a5f7

File tree

4 files changed

+71
-126
lines changed

4 files changed

+71
-126
lines changed

block/blk-integrity.c

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,30 +43,32 @@ static const char *bi_unsupported_name = "unsupported";
4343
*/
4444
int blk_rq_count_integrity_sg(struct request_queue *q, struct bio *bio)
4545
{
46-
struct bio_vec *iv, *ivprv = NULL;
46+
struct bio_vec iv, ivprv = { NULL };
4747
unsigned int segments = 0;
4848
unsigned int seg_size = 0;
49-
unsigned int i = 0;
49+
struct bvec_iter iter;
50+
int prev = 0;
5051

51-
bio_for_each_integrity_vec(iv, bio, i) {
52+
bio_for_each_integrity_vec(iv, bio, iter) {
5253

53-
if (ivprv) {
54-
if (!BIOVEC_PHYS_MERGEABLE(ivprv, iv))
54+
if (prev) {
55+
if (!BIOVEC_PHYS_MERGEABLE(&ivprv, &iv))
5556
goto new_segment;
5657

57-
if (!BIOVEC_SEG_BOUNDARY(q, ivprv, iv))
58+
if (!BIOVEC_SEG_BOUNDARY(q, &ivprv, &iv))
5859
goto new_segment;
5960

60-
if (seg_size + iv->bv_len > queue_max_segment_size(q))
61+
if (seg_size + iv.bv_len > queue_max_segment_size(q))
6162
goto new_segment;
6263

63-
seg_size += iv->bv_len;
64+
seg_size += iv.bv_len;
6465
} else {
6566
new_segment:
6667
segments++;
67-
seg_size = iv->bv_len;
68+
seg_size = iv.bv_len;
6869
}
6970

71+
prev = 1;
7072
ivprv = iv;
7173
}
7274

@@ -87,24 +89,25 @@ EXPORT_SYMBOL(blk_rq_count_integrity_sg);
8789
int blk_rq_map_integrity_sg(struct request_queue *q, struct bio *bio,
8890
struct scatterlist *sglist)
8991
{
90-
struct bio_vec *iv, *ivprv = NULL;
92+
struct bio_vec iv, ivprv = { NULL };
9193
struct scatterlist *sg = NULL;
9294
unsigned int segments = 0;
93-
unsigned int i = 0;
95+
struct bvec_iter iter;
96+
int prev = 0;
9497

95-
bio_for_each_integrity_vec(iv, bio, i) {
98+
bio_for_each_integrity_vec(iv, bio, iter) {
9699

97-
if (ivprv) {
98-
if (!BIOVEC_PHYS_MERGEABLE(ivprv, iv))
100+
if (prev) {
101+
if (!BIOVEC_PHYS_MERGEABLE(&ivprv, &iv))
99102
goto new_segment;
100103

101-
if (!BIOVEC_SEG_BOUNDARY(q, ivprv, iv))
104+
if (!BIOVEC_SEG_BOUNDARY(q, &ivprv, &iv))
102105
goto new_segment;
103106

104-
if (sg->length + iv->bv_len > queue_max_segment_size(q))
107+
if (sg->length + iv.bv_len > queue_max_segment_size(q))
105108
goto new_segment;
106109

107-
sg->length += iv->bv_len;
110+
sg->length += iv.bv_len;
108111
} else {
109112
new_segment:
110113
if (!sg)
@@ -114,10 +117,11 @@ int blk_rq_map_integrity_sg(struct request_queue *q, struct bio *bio,
114117
sg = sg_next(sg);
115118
}
116119

117-
sg_set_page(sg, iv->bv_page, iv->bv_len, iv->bv_offset);
120+
sg_set_page(sg, iv.bv_page, iv.bv_len, iv.bv_offset);
118121
segments++;
119122
}
120123

124+
prev = 1;
121125
ivprv = iv;
122126
}
123127

drivers/scsi/sd_dif.c

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,6 @@ void sd_dif_prepare(struct request *rq, sector_t hw_sector,
365365
struct bio *bio;
366366
struct scsi_disk *sdkp;
367367
struct sd_dif_tuple *sdt;
368-
unsigned int i, j;
369368
u32 phys, virt;
370369

371370
sdkp = rq->bio->bi_bdev->bd_disk->private_data;
@@ -376,19 +375,21 @@ void sd_dif_prepare(struct request *rq, sector_t hw_sector,
376375
phys = hw_sector & 0xffffffff;
377376

378377
__rq_for_each_bio(bio, rq) {
379-
struct bio_vec *iv;
378+
struct bio_vec iv;
379+
struct bvec_iter iter;
380+
unsigned int j;
380381

381382
/* Already remapped? */
382383
if (bio_flagged(bio, BIO_MAPPED_INTEGRITY))
383384
break;
384385

385-
virt = bio->bi_integrity->bip_sector & 0xffffffff;
386+
virt = bio->bi_integrity->bip_iter.bi_sector & 0xffffffff;
386387

387-
bip_for_each_vec(iv, bio->bi_integrity, i) {
388-
sdt = kmap_atomic(iv->bv_page)
389-
+ iv->bv_offset;
388+
bip_for_each_vec(iv, bio->bi_integrity, iter) {
389+
sdt = kmap_atomic(iv.bv_page)
390+
+ iv.bv_offset;
390391

391-
for (j = 0 ; j < iv->bv_len ; j += tuple_sz, sdt++) {
392+
for (j = 0; j < iv.bv_len; j += tuple_sz, sdt++) {
392393

393394
if (be32_to_cpu(sdt->ref_tag) == virt)
394395
sdt->ref_tag = cpu_to_be32(phys);
@@ -414,7 +415,7 @@ void sd_dif_complete(struct scsi_cmnd *scmd, unsigned int good_bytes)
414415
struct scsi_disk *sdkp;
415416
struct bio *bio;
416417
struct sd_dif_tuple *sdt;
417-
unsigned int i, j, sectors, sector_sz;
418+
unsigned int j, sectors, sector_sz;
418419
u32 phys, virt;
419420

420421
sdkp = scsi_disk(scmd->request->rq_disk);
@@ -430,15 +431,16 @@ void sd_dif_complete(struct scsi_cmnd *scmd, unsigned int good_bytes)
430431
phys >>= 3;
431432

432433
__rq_for_each_bio(bio, scmd->request) {
433-
struct bio_vec *iv;
434+
struct bio_vec iv;
435+
struct bvec_iter iter;
434436

435-
virt = bio->bi_integrity->bip_sector & 0xffffffff;
437+
virt = bio->bi_integrity->bip_iter.bi_sector & 0xffffffff;
436438

437-
bip_for_each_vec(iv, bio->bi_integrity, i) {
438-
sdt = kmap_atomic(iv->bv_page)
439-
+ iv->bv_offset;
439+
bip_for_each_vec(iv, bio->bi_integrity, iter) {
440+
sdt = kmap_atomic(iv.bv_page)
441+
+ iv.bv_offset;
440442

441-
for (j = 0 ; j < iv->bv_len ; j += tuple_sz, sdt++) {
443+
for (j = 0; j < iv.bv_len; j += tuple_sz, sdt++) {
442444

443445
if (sectors == 0) {
444446
kunmap_atomic(sdt);

fs/bio-integrity.c

Lines changed: 26 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,7 @@ int bio_integrity_add_page(struct bio *bio, struct page *page,
134134
return 0;
135135
}
136136

137-
iv = bip_vec_idx(bip, bip->bip_vcnt);
138-
BUG_ON(iv == NULL);
137+
iv = bip->bip_vec + bip->bip_vcnt;
139138

140139
iv->bv_page = page;
141140
iv->bv_len = len;
@@ -203,6 +202,12 @@ static inline unsigned int bio_integrity_hw_sectors(struct blk_integrity *bi,
203202
return sectors;
204203
}
205204

205+
static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
206+
unsigned int sectors)
207+
{
208+
return bio_integrity_hw_sectors(bi, sectors) * bi->tuple_size;
209+
}
210+
206211
/**
207212
* bio_integrity_tag_size - Retrieve integrity tag space
208213
* @bio: bio to inspect
@@ -235,9 +240,9 @@ int bio_integrity_tag(struct bio *bio, void *tag_buf, unsigned int len, int set)
235240
nr_sectors = bio_integrity_hw_sectors(bi,
236241
DIV_ROUND_UP(len, bi->tag_size));
237242

238-
if (nr_sectors * bi->tuple_size > bip->bip_size) {
239-
printk(KERN_ERR "%s: tag too big for bio: %u > %u\n",
240-
__func__, nr_sectors * bi->tuple_size, bip->bip_size);
243+
if (nr_sectors * bi->tuple_size > bip->bip_iter.bi_size) {
244+
printk(KERN_ERR "%s: tag too big for bio: %u > %u\n", __func__,
245+
nr_sectors * bi->tuple_size, bip->bip_iter.bi_size);
241246
return -1;
242247
}
243248

@@ -322,7 +327,7 @@ static void bio_integrity_generate(struct bio *bio)
322327
sector += sectors;
323328
prot_buf += sectors * bi->tuple_size;
324329
total += sectors * bi->tuple_size;
325-
BUG_ON(total > bio->bi_integrity->bip_size);
330+
BUG_ON(total > bio->bi_integrity->bip_iter.bi_size);
326331

327332
kunmap_atomic(kaddr);
328333
}
@@ -387,8 +392,8 @@ int bio_integrity_prep(struct bio *bio)
387392

388393
bip->bip_owns_buf = 1;
389394
bip->bip_buf = buf;
390-
bip->bip_size = len;
391-
bip->bip_sector = bio->bi_iter.bi_sector;
395+
bip->bip_iter.bi_size = len;
396+
bip->bip_iter.bi_sector = bio->bi_iter.bi_sector;
392397

393398
/* Map it */
394399
offset = offset_in_page(buf);
@@ -444,7 +449,7 @@ static int bio_integrity_verify(struct bio *bio)
444449
struct blk_integrity_exchg bix;
445450
struct bio_vec bv;
446451
struct bvec_iter iter;
447-
sector_t sector = bio->bi_integrity->bip_sector;
452+
sector_t sector = bio->bi_integrity->bip_iter.bi_sector;
448453
unsigned int sectors, total, ret;
449454
void *prot_buf = bio->bi_integrity->bip_buf;
450455

@@ -470,7 +475,7 @@ static int bio_integrity_verify(struct bio *bio)
470475
sector += sectors;
471476
prot_buf += sectors * bi->tuple_size;
472477
total += sectors * bi->tuple_size;
473-
BUG_ON(total > bio->bi_integrity->bip_size);
478+
BUG_ON(total > bio->bi_integrity->bip_iter.bi_size);
474479

475480
kunmap_atomic(kaddr);
476481
}
@@ -534,56 +539,6 @@ void bio_integrity_endio(struct bio *bio, int error)
534539
}
535540
EXPORT_SYMBOL(bio_integrity_endio);
536541

537-
/**
538-
* bio_integrity_mark_head - Advance bip_vec skip bytes
539-
* @bip: Integrity vector to advance
540-
* @skip: Number of bytes to advance it
541-
*/
542-
void bio_integrity_mark_head(struct bio_integrity_payload *bip,
543-
unsigned int skip)
544-
{
545-
struct bio_vec *iv;
546-
unsigned int i;
547-
548-
bip_for_each_vec(iv, bip, i) {
549-
if (skip == 0) {
550-
bip->bip_idx = i;
551-
return;
552-
} else if (skip >= iv->bv_len) {
553-
skip -= iv->bv_len;
554-
} else { /* skip < iv->bv_len) */
555-
iv->bv_offset += skip;
556-
iv->bv_len -= skip;
557-
bip->bip_idx = i;
558-
return;
559-
}
560-
}
561-
}
562-
563-
/**
564-
* bio_integrity_mark_tail - Truncate bip_vec to be len bytes long
565-
* @bip: Integrity vector to truncate
566-
* @len: New length of integrity vector
567-
*/
568-
void bio_integrity_mark_tail(struct bio_integrity_payload *bip,
569-
unsigned int len)
570-
{
571-
struct bio_vec *iv;
572-
unsigned int i;
573-
574-
bip_for_each_vec(iv, bip, i) {
575-
if (len == 0) {
576-
bip->bip_vcnt = i;
577-
return;
578-
} else if (len >= iv->bv_len) {
579-
len -= iv->bv_len;
580-
} else { /* len < iv->bv_len) */
581-
iv->bv_len = len;
582-
len = 0;
583-
}
584-
}
585-
}
586-
587542
/**
588543
* bio_integrity_advance - Advance integrity vector
589544
* @bio: bio whose integrity vector to update
@@ -597,13 +552,9 @@ void bio_integrity_advance(struct bio *bio, unsigned int bytes_done)
597552
{
598553
struct bio_integrity_payload *bip = bio->bi_integrity;
599554
struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
600-
unsigned int nr_sectors;
555+
unsigned bytes = bio_integrity_bytes(bi, bytes_done >> 9);
601556

602-
BUG_ON(bip == NULL);
603-
BUG_ON(bi == NULL);
604-
605-
nr_sectors = bio_integrity_hw_sectors(bi, bytes_done >> 9);
606-
bio_integrity_mark_head(bip, nr_sectors * bi->tuple_size);
557+
bvec_iter_advance(bip->bip_vec, &bip->bip_iter, bytes);
607558
}
608559
EXPORT_SYMBOL(bio_integrity_advance);
609560

@@ -623,16 +574,9 @@ void bio_integrity_trim(struct bio *bio, unsigned int offset,
623574
{
624575
struct bio_integrity_payload *bip = bio->bi_integrity;
625576
struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
626-
unsigned int nr_sectors;
627577

628-
BUG_ON(bip == NULL);
629-
BUG_ON(bi == NULL);
630-
BUG_ON(!bio_flagged(bio, BIO_CLONED));
631-
632-
nr_sectors = bio_integrity_hw_sectors(bi, sectors);
633-
bip->bip_sector = bip->bip_sector + offset;
634-
bio_integrity_mark_head(bip, offset * bi->tuple_size);
635-
bio_integrity_mark_tail(bip, sectors * bi->tuple_size);
578+
bio_integrity_advance(bio, offset << 9);
579+
bip->bip_iter.bi_size = bio_integrity_bytes(bi, sectors);
636580
}
637581
EXPORT_SYMBOL(bio_integrity_trim);
638582

@@ -662,8 +606,8 @@ void bio_integrity_split(struct bio *bio, struct bio_pair *bp, int sectors)
662606
bp->bio1.bi_integrity = &bp->bip1;
663607
bp->bio2.bi_integrity = &bp->bip2;
664608

665-
bp->iv1 = bip->bip_vec[bip->bip_idx];
666-
bp->iv2 = bip->bip_vec[bip->bip_idx];
609+
bp->iv1 = bip->bip_vec[bip->bip_iter.bi_idx];
610+
bp->iv2 = bip->bip_vec[bip->bip_iter.bi_idx];
667611

668612
bp->bip1.bip_vec = &bp->iv1;
669613
bp->bip2.bip_vec = &bp->iv2;
@@ -672,11 +616,12 @@ void bio_integrity_split(struct bio *bio, struct bio_pair *bp, int sectors)
672616
bp->iv2.bv_offset += sectors * bi->tuple_size;
673617
bp->iv2.bv_len -= sectors * bi->tuple_size;
674618

675-
bp->bip1.bip_sector = bio->bi_integrity->bip_sector;
676-
bp->bip2.bip_sector = bio->bi_integrity->bip_sector + nr_sectors;
619+
bp->bip1.bip_iter.bi_sector = bio->bi_integrity->bip_iter.bi_sector;
620+
bp->bip2.bip_iter.bi_sector =
621+
bio->bi_integrity->bip_iter.bi_sector + nr_sectors;
677622

678623
bp->bip1.bip_vcnt = bp->bip2.bip_vcnt = 1;
679-
bp->bip1.bip_idx = bp->bip2.bip_idx = 0;
624+
bp->bip1.bip_iter.bi_idx = bp->bip2.bip_iter.bi_idx = 0;
680625
}
681626
EXPORT_SYMBOL(bio_integrity_split);
682627

@@ -704,9 +649,8 @@ int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
704649
memcpy(bip->bip_vec, bip_src->bip_vec,
705650
bip_src->bip_vcnt * sizeof(struct bio_vec));
706651

707-
bip->bip_sector = bip_src->bip_sector;
708652
bip->bip_vcnt = bip_src->bip_vcnt;
709-
bip->bip_idx = bip_src->bip_idx;
653+
bip->bip_iter = bip_src->bip_iter;
710654

711655
return 0;
712656
}

0 commit comments

Comments
 (0)