|
13 | 13 | #include <asm/unaligned.h> |
14 | 14 | #include "blk.h" |
15 | 15 |
|
| 16 | +struct blk_integrity_iter { |
| 17 | + void *prot_buf; |
| 18 | + void *data_buf; |
| 19 | + sector_t seed; |
| 20 | + unsigned int data_size; |
| 21 | + unsigned short interval; |
| 22 | + const char *disk_name; |
| 23 | +}; |
| 24 | + |
16 | 25 | static __be16 t10_pi_csum(__be16 csum, void *data, unsigned int len, |
17 | 26 | unsigned char csum_type) |
18 | 27 | { |
@@ -364,33 +373,77 @@ static void ext_pi_type1_complete(struct request *rq, unsigned int nr_bytes) |
364 | 373 | } |
365 | 374 | } |
366 | 375 |
|
367 | | -void blk_integrity_generate(struct blk_integrity_iter *iter, |
368 | | - struct blk_integrity *bi) |
| 376 | +void blk_integrity_generate(struct bio *bio) |
369 | 377 | { |
370 | | - switch (bi->csum_type) { |
371 | | - case BLK_INTEGRITY_CSUM_CRC64: |
372 | | - ext_pi_crc64_generate(iter, bi); |
373 | | - break; |
374 | | - case BLK_INTEGRITY_CSUM_CRC: |
375 | | - case BLK_INTEGRITY_CSUM_IP: |
376 | | - t10_pi_generate(iter, bi); |
377 | | - break; |
378 | | - default: |
379 | | - break; |
| 378 | + struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk); |
| 379 | + struct bio_integrity_payload *bip = bio_integrity(bio); |
| 380 | + struct blk_integrity_iter iter; |
| 381 | + struct bvec_iter bviter; |
| 382 | + struct bio_vec bv; |
| 383 | + |
| 384 | + iter.disk_name = bio->bi_bdev->bd_disk->disk_name; |
| 385 | + iter.interval = 1 << bi->interval_exp; |
| 386 | + iter.seed = bio->bi_iter.bi_sector; |
| 387 | + iter.prot_buf = bvec_virt(bip->bip_vec); |
| 388 | + bio_for_each_segment(bv, bio, bviter) { |
| 389 | + void *kaddr = bvec_kmap_local(&bv); |
| 390 | + |
| 391 | + iter.data_buf = kaddr; |
| 392 | + iter.data_size = bv.bv_len; |
| 393 | + switch (bi->csum_type) { |
| 394 | + case BLK_INTEGRITY_CSUM_CRC64: |
| 395 | + ext_pi_crc64_generate(&iter, bi); |
| 396 | + break; |
| 397 | + case BLK_INTEGRITY_CSUM_CRC: |
| 398 | + case BLK_INTEGRITY_CSUM_IP: |
| 399 | + t10_pi_generate(&iter, bi); |
| 400 | + break; |
| 401 | + default: |
| 402 | + break; |
| 403 | + } |
| 404 | + kunmap_local(kaddr); |
380 | 405 | } |
381 | 406 | } |
382 | 407 |
|
383 | | -blk_status_t blk_integrity_verify(struct blk_integrity_iter *iter, |
384 | | - struct blk_integrity *bi) |
| 408 | +void blk_integrity_verify(struct bio *bio) |
385 | 409 | { |
386 | | - switch (bi->csum_type) { |
387 | | - case BLK_INTEGRITY_CSUM_CRC64: |
388 | | - return ext_pi_crc64_verify(iter, bi); |
389 | | - case BLK_INTEGRITY_CSUM_CRC: |
390 | | - case BLK_INTEGRITY_CSUM_IP: |
391 | | - return t10_pi_verify(iter, bi); |
392 | | - default: |
393 | | - return BLK_STS_OK; |
| 410 | + struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk); |
| 411 | + struct bio_integrity_payload *bip = bio_integrity(bio); |
| 412 | + struct blk_integrity_iter iter; |
| 413 | + struct bvec_iter bviter; |
| 414 | + struct bio_vec bv; |
| 415 | + |
| 416 | + /* |
| 417 | + * At the moment verify is called bi_iter has been advanced during split |
| 418 | + * and completion, so use the copy created during submission here. |
| 419 | + */ |
| 420 | + iter.disk_name = bio->bi_bdev->bd_disk->disk_name; |
| 421 | + iter.interval = 1 << bi->interval_exp; |
| 422 | + iter.seed = bip->bio_iter.bi_sector; |
| 423 | + iter.prot_buf = bvec_virt(bip->bip_vec); |
| 424 | + __bio_for_each_segment(bv, bio, bviter, bip->bio_iter) { |
| 425 | + void *kaddr = bvec_kmap_local(&bv); |
| 426 | + blk_status_t ret = BLK_STS_OK; |
| 427 | + |
| 428 | + iter.data_buf = kaddr; |
| 429 | + iter.data_size = bv.bv_len; |
| 430 | + switch (bi->csum_type) { |
| 431 | + case BLK_INTEGRITY_CSUM_CRC64: |
| 432 | + ret = ext_pi_crc64_verify(&iter, bi); |
| 433 | + break; |
| 434 | + case BLK_INTEGRITY_CSUM_CRC: |
| 435 | + case BLK_INTEGRITY_CSUM_IP: |
| 436 | + ret = t10_pi_verify(&iter, bi); |
| 437 | + break; |
| 438 | + default: |
| 439 | + break; |
| 440 | + } |
| 441 | + kunmap_local(kaddr); |
| 442 | + |
| 443 | + if (ret) { |
| 444 | + bio->bi_status = ret; |
| 445 | + return; |
| 446 | + } |
394 | 447 | } |
395 | 448 | } |
396 | 449 |
|
|
0 commit comments