aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin K. Petersen <martin.petersen@oracle.com>2014-04-08 22:43:44 -0400
committerJens Axboe <axboe@fb.com>2014-04-09 10:00:04 -0400
commit0bc69973066d62f70ce60bd6762b5cb75a699159 (patch)
tree7ad054c0b719fe45e3243383422b8666d79700b0
parentb7aa84d9cb9f26da1a9312c3e39dbd1a3c25a426 (diff)
block: Fix integrity verification
Commit bf36f9cfa6d3d caused a regression by effectively reverting Nic's fix from 5837c80e870b that ensures we traverse the full bio_vec list upon completion. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Cc: Nicholas Bellinger <nab@linux-iscsi.org> Cc: Gu Zheng <guz.fnst@cn.fujitsu.com> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--fs/bio-integrity.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/fs/bio-integrity.c b/fs/bio-integrity.c
index 29696b78d1f4..b355b98dbf1b 100644
--- a/fs/bio-integrity.c
+++ b/fs/bio-integrity.c
@@ -309,10 +309,9 @@ static int bio_integrity_generate_verify(struct bio *bio, int operate)
309{ 309{
310 struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev); 310 struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
311 struct blk_integrity_exchg bix; 311 struct blk_integrity_exchg bix;
312 struct bio_vec bv; 312 struct bio_vec *bv;
313 struct bvec_iter iter;
314 sector_t sector; 313 sector_t sector;
315 unsigned int sectors, ret = 0; 314 unsigned int sectors, ret = 0, i;
316 void *prot_buf = bio->bi_integrity->bip_buf; 315 void *prot_buf = bio->bi_integrity->bip_buf;
317 316
318 if (operate) 317 if (operate)
@@ -323,16 +322,16 @@ static int bio_integrity_generate_verify(struct bio *bio, int operate)
323 bix.disk_name = bio->bi_bdev->bd_disk->disk_name; 322 bix.disk_name = bio->bi_bdev->bd_disk->disk_name;
324 bix.sector_size = bi->sector_size; 323 bix.sector_size = bi->sector_size;
325 324
326 bio_for_each_segment(bv, bio, iter) { 325 bio_for_each_segment_all(bv, bio, i) {
327 void *kaddr = kmap_atomic(bv.bv_page); 326 void *kaddr = kmap_atomic(bv->bv_page);
328 bix.data_buf = kaddr + bv.bv_offset; 327 bix.data_buf = kaddr + bv->bv_offset;
329 bix.data_size = bv.bv_len; 328 bix.data_size = bv->bv_len;
330 bix.prot_buf = prot_buf; 329 bix.prot_buf = prot_buf;
331 bix.sector = sector; 330 bix.sector = sector;
332 331
333 if (operate) { 332 if (operate)
334 bi->generate_fn(&bix); 333 bi->generate_fn(&bix);
335 } else { 334 else {
336 ret = bi->verify_fn(&bix); 335 ret = bi->verify_fn(&bix);
337 if (ret) { 336 if (ret) {
338 kunmap_atomic(kaddr); 337 kunmap_atomic(kaddr);
@@ -340,7 +339,7 @@ static int bio_integrity_generate_verify(struct bio *bio, int operate)
340 } 339 }
341 } 340 }
342 341
343 sectors = bv.bv_len / bi->sector_size; 342 sectors = bv->bv_len / bi->sector_size;
344 sector += sectors; 343 sector += sectors;
345 prot_buf += sectors * bi->tuple_size; 344 prot_buf += sectors * bi->tuple_size;
346 345