Skip to content

Commit 80814b8

Browse files
ychoijyaxboe
authored andcommitted
bio-integrity: update the payload size in bio_integrity_add_page()
Previously, the bip's bi_size has been set before an integrity pages were added. If a problem occurs in the process of adding pages for bip, the bi_size mismatch problem must be dealt with. When the page is successfully added to bvec, the bi_size is updated. The parts affected by the change were also contained in this commit. Cc: Christoph Hellwig <hch@lst.de> Cc: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jinyoung Choi <j-young.choi@samsung.com> Tested-by: "Martin K. Petersen" <martin.petersen@oracle.com> Reviewed-by: "Martin K. Petersen" <martin.petersen@oracle.com> Link: https://lore.kernel.org/r/20230803024956epcms2p38186a17392706650c582d38ef3dbcd32@epcms2p3 Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 7c8998f commit 80814b8

5 files changed

Lines changed: 3 additions & 7 deletions

File tree

block/bio-integrity.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ int bio_integrity_add_page(struct bio *bio, struct page *page,
137137

138138
bvec_set_page(&bip->bip_vec[bip->bip_vcnt], page, len, offset);
139139
bip->bip_vcnt++;
140+
bip->bip_iter.bi_size += len;
140141

141142
return len;
142143
}
@@ -244,7 +245,6 @@ bool bio_integrity_prep(struct bio *bio)
244245
}
245246

246247
bip->bip_flags |= BIP_BLOCK_INTEGRITY;
247-
bip->bip_iter.bi_size = len;
248248
bip_set_seed(bip, bio->bi_iter.bi_sector);
249249

250250
if (bi->flags & BLK_INTEGRITY_IP_CHECKSUM)

drivers/md/dm-crypt.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1160,7 +1160,6 @@ static int dm_crypt_integrity_io_alloc(struct dm_crypt_io *io, struct bio *bio)
11601160

11611161
tag_len = io->cc->on_disk_tag_size * (bio_sectors(bio) >> io->cc->sector_shift);
11621162

1163-
bip->bip_iter.bi_size = tag_len;
11641163
bip->bip_iter.bi_sector = io->cc->start + io->sector;
11651164

11661165
ret = bio_integrity_add_page(bio, virt_to_page(io->integrity_metadata),

drivers/nvme/host/ioctl.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ static void *nvme_add_user_metadata(struct request *req, void __user *ubuf,
118118
goto out_free_meta;
119119
}
120120

121-
bip->bip_iter.bi_size = len;
122121
bip->bip_iter.bi_sector = seed;
123122
ret = bio_integrity_add_page(bio, virt_to_page(buf), len,
124123
offset_in_page(buf));

drivers/nvme/target/io-cmd-bdev.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,12 +206,11 @@ static int nvmet_bdev_alloc_bip(struct nvmet_req *req, struct bio *bio,
206206
return PTR_ERR(bip);
207207
}
208208

209-
bip->bip_iter.bi_size = bio_integrity_bytes(bi, bio_sectors(bio));
210209
/* virtual start sector must be in integrity interval units */
211210
bip_set_seed(bip, bio->bi_iter.bi_sector >>
212211
(bi->interval_exp - SECTOR_SHIFT));
213212

214-
resid = bip->bip_iter.bi_size;
213+
resid = bio_integrity_bytes(bi, bio_sectors(bio));
215214
while (resid > 0 && sg_miter_next(miter)) {
216215
len = min_t(size_t, miter->length, resid);
217216
rc = bio_integrity_add_page(bio, miter->page, len,

drivers/target/target_core_iblock.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -689,15 +689,14 @@ iblock_alloc_bip(struct se_cmd *cmd, struct bio *bio,
689689
return PTR_ERR(bip);
690690
}
691691

692-
bip->bip_iter.bi_size = bio_integrity_bytes(bi, bio_sectors(bio));
693692
/* virtual start sector must be in integrity interval units */
694693
bip_set_seed(bip, bio->bi_iter.bi_sector >>
695694
(bi->interval_exp - SECTOR_SHIFT));
696695

697696
pr_debug("IBLOCK BIP Size: %u Sector: %llu\n", bip->bip_iter.bi_size,
698697
(unsigned long long)bip->bip_iter.bi_sector);
699698

700-
resid = bip->bip_iter.bi_size;
699+
resid = bio_integrity_bytes(bi, bio_sectors(bio));
701700
while (resid > 0 && sg_miter_next(miter)) {
702701

703702
len = min_t(size_t, miter->length, resid);

0 commit comments

Comments
 (0)