diff options
Diffstat (limited to 'fs/bio-integrity.c')
-rw-r--r-- | fs/bio-integrity.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/fs/bio-integrity.c b/fs/bio-integrity.c index 0bad24ddc2e7..4f70f383132c 100644 --- a/fs/bio-integrity.c +++ b/fs/bio-integrity.c | |||
@@ -114,6 +114,14 @@ void bio_integrity_free(struct bio *bio) | |||
114 | } | 114 | } |
115 | EXPORT_SYMBOL(bio_integrity_free); | 115 | EXPORT_SYMBOL(bio_integrity_free); |
116 | 116 | ||
117 | static inline unsigned int bip_integrity_vecs(struct bio_integrity_payload *bip) | ||
118 | { | ||
119 | if (bip->bip_slab == BIO_POOL_NONE) | ||
120 | return BIP_INLINE_VECS; | ||
121 | |||
122 | return bvec_nr_vecs(bip->bip_slab); | ||
123 | } | ||
124 | |||
117 | /** | 125 | /** |
118 | * bio_integrity_add_page - Attach integrity metadata | 126 | * bio_integrity_add_page - Attach integrity metadata |
119 | * @bio: bio to update | 127 | * @bio: bio to update |
@@ -129,7 +137,7 @@ int bio_integrity_add_page(struct bio *bio, struct page *page, | |||
129 | struct bio_integrity_payload *bip = bio->bi_integrity; | 137 | struct bio_integrity_payload *bip = bio->bi_integrity; |
130 | struct bio_vec *iv; | 138 | struct bio_vec *iv; |
131 | 139 | ||
132 | if (bip->bip_vcnt >= bvec_nr_vecs(bip->bip_slab)) { | 140 | if (bip->bip_vcnt >= bip_integrity_vecs(bip)) { |
133 | printk(KERN_ERR "%s: bip_vec full\n", __func__); | 141 | printk(KERN_ERR "%s: bip_vec full\n", __func__); |
134 | return 0; | 142 | return 0; |
135 | } | 143 | } |
@@ -226,7 +234,8 @@ unsigned int bio_integrity_tag_size(struct bio *bio) | |||
226 | } | 234 | } |
227 | EXPORT_SYMBOL(bio_integrity_tag_size); | 235 | EXPORT_SYMBOL(bio_integrity_tag_size); |
228 | 236 | ||
229 | int bio_integrity_tag(struct bio *bio, void *tag_buf, unsigned int len, int set) | 237 | static int bio_integrity_tag(struct bio *bio, void *tag_buf, unsigned int len, |
238 | int set) | ||
230 | { | 239 | { |
231 | struct bio_integrity_payload *bip = bio->bi_integrity; | 240 | struct bio_integrity_payload *bip = bio->bi_integrity; |
232 | struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev); | 241 | struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev); |
@@ -449,11 +458,10 @@ static int bio_integrity_verify(struct bio *bio) | |||
449 | struct blk_integrity_exchg bix; | 458 | struct blk_integrity_exchg bix; |
450 | struct bio_vec *bv; | 459 | struct bio_vec *bv; |
451 | sector_t sector = bio->bi_integrity->bip_iter.bi_sector; | 460 | sector_t sector = bio->bi_integrity->bip_iter.bi_sector; |
452 | unsigned int sectors, total, ret; | 461 | unsigned int sectors, ret = 0; |
453 | void *prot_buf = bio->bi_integrity->bip_buf; | 462 | void *prot_buf = bio->bi_integrity->bip_buf; |
454 | int i; | 463 | int i; |
455 | 464 | ||
456 | ret = total = 0; | ||
457 | bix.disk_name = bio->bi_bdev->bd_disk->disk_name; | 465 | bix.disk_name = bio->bi_bdev->bd_disk->disk_name; |
458 | bix.sector_size = bi->sector_size; | 466 | bix.sector_size = bi->sector_size; |
459 | 467 | ||
@@ -475,8 +483,6 @@ static int bio_integrity_verify(struct bio *bio) | |||
475 | sectors = bv->bv_len / bi->sector_size; | 483 | sectors = bv->bv_len / bi->sector_size; |
476 | sector += sectors; | 484 | sector += sectors; |
477 | prot_buf += sectors * bi->tuple_size; | 485 | prot_buf += sectors * bi->tuple_size; |
478 | total += sectors * bi->tuple_size; | ||
479 | BUG_ON(total > bio->bi_integrity->bip_iter.bi_size); | ||
480 | 486 | ||
481 | kunmap_atomic(kaddr); | 487 | kunmap_atomic(kaddr); |
482 | } | 488 | } |