Skip to content

Commit 05d0324

Browse files
calebsanderkawasaki
authored andcommitted
block: use integrity interval instead of sector as seed
bio_integrity_setup_default() and blk_integrity_iterate() set the integrity seed (initial reference tag) to the absolute address in the block device in units of 512-byte sectors. The seed is correctly incremented/decremented in units of integrity intervals in bio_integrity_map_iter(), bio_integrity_advance(), and blk_integrity_interval(). As a result, the ref tag written or read to a particular integrity interval on a block device with integrity interval size > 512 bytes varies with the starting offset of the read/write. Convert the initial seed to units of integrity intervals so a consistent ref tag is used for each integrity interval. Fixes: 3be91c4 ("block: Deprecate the use of the term sector in the context of block integrity") Fixes: 63573e3 ("bio-integrity: Restore original iterator on verify stage") Signed-off-by: Caleb Sander Mateos <[email protected]> Reviewed-by: Anuj Gupta <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]>
1 parent 3b54e52 commit 05d0324

2 files changed

Lines changed: 4 additions & 2 deletions

File tree

block/bio-integrity.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,9 @@ void bio_integrity_setup_default(struct bio *bio)
105105
{
106106
struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
107107
struct bio_integrity_payload *bip = bio_integrity(bio);
108+
u64 seed = bio->bi_iter.bi_sector >> (bi->interval_exp - SECTOR_SHIFT);
108109

109-
bip_set_seed(bip, bio->bi_iter.bi_sector);
110+
bip_set_seed(bip, seed);
110111

111112
if (bi->csum_type) {
112113
bip->bip_flags |= BIP_CHECK_GUARD;

block/t10-pi.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,14 +310,15 @@ static blk_status_t blk_integrity_iterate(struct bio *bio,
310310
{
311311
struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
312312
struct bio_integrity_payload *bip = bio_integrity(bio);
313+
u64 seed = data_iter->bi_sector >> (bi->interval_exp - SECTOR_SHIFT);
313314
struct blk_integrity_iter iter = {
314315
.bio = bio,
315316
.bip = bip,
316317
.bi = bi,
317318
.data_iter = *data_iter,
318319
.prot_iter = bip->bip_iter,
319320
.interval_remaining = 1 << bi->interval_exp,
320-
.seed = data_iter->bi_sector,
321+
.seed = seed,
321322
.csum = 0,
322323
};
323324
blk_status_t ret = BLK_STS_OK;

0 commit comments

Comments
 (0)