Skip to content

Commit b7ea5f4

Browse files
calebsanderkawasaki
authored andcommitted
blk-integrity: avoid sector_t in bip_{get,set}_seed()
bip_set_seed() and big_get_seed() take/return a sector_t value that's actually an integrity interval number. This is confusing, so pass struct bio instead to bip_set_seed() and convert the bio's device address to integrity intervals. Open-code the access to bip->bip_iter.bi_sector in the one caller of bip_set_seed() that doesn't use the bio device address for the seed. Open-code bip_get_seed() in its one caller. Add a comment to struct bvec_iter's bi_sector field explaining its alternate use for bip_iter. Suggested-by: Christoph Hellwig <[email protected]> Signed-off-by: Caleb Sander Mateos <[email protected]>
1 parent 1bee71f commit b7ea5f4

7 files changed

Lines changed: 19 additions & 19 deletions

File tree

block/bio-integrity.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,8 @@ 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);
109108

110-
bip_set_seed(bip, seed);
109+
bip_set_seed(bio);
111110

112111
if (bi->csum_type) {
113112
bip->bip_flags |= BIP_CHECK_GUARD;
@@ -474,7 +473,7 @@ int bio_integrity_map_iter(struct bio *bio, struct uio_meta *meta)
474473
ret = bio_integrity_map_user(bio, &it);
475474
if (!ret) {
476475
bio_uio_meta_to_bip(bio, meta);
477-
bip_set_seed(bio_integrity(bio), meta->seed);
476+
bio_integrity(bio)->bip_iter.bi_sector = meta->seed;
478477
iov_iter_advance(&meta->iter, integrity_bytes);
479478
meta->seed += bio_integrity_intervals(bi, bio_sectors(bio));
480479
}

block/t10-pi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ static void __blk_reftag_remap(struct bio *bio, struct blk_integrity *bi,
512512
{
513513
struct bio_integrity_payload *bip = bio_integrity(bio);
514514
struct bvec_iter iter = bip->bip_iter;
515-
u64 virt = bip_get_seed(bip);
515+
u64 virt = bip->bip_iter.bi_sector;
516516
union pi_tuple *ptuple;
517517
union pi_tuple tuple;
518518

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,7 @@ static int nvmet_bdev_alloc_bip(struct nvmet_req *req, struct bio *bio,
220220
}
221221

222222
/* virtual start sector must be in integrity interval units */
223-
bip_set_seed(bip, bio->bi_iter.bi_sector >>
224-
(bi->interval_exp - SECTOR_SHIFT));
223+
bip_set_seed(bio);
225224

226225
resid = bio_integrity_bytes(bi, bio_sectors(bio));
227226
while (resid > 0 && sg_miter_next(miter)) {

drivers/target/target_core_iblock.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -708,8 +708,7 @@ iblock_alloc_bip(struct se_cmd *cmd, struct bio *bio,
708708
}
709709

710710
/* virtual start sector must be in integrity interval units */
711-
bip_set_seed(bip, bio->bi_iter.bi_sector >>
712-
(bi->interval_exp - SECTOR_SHIFT));
711+
bip_set_seed(bio);
713712

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

include/linux/bio-integrity.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,6 @@ static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag)
5858
return false;
5959
}
6060

61-
static inline sector_t bip_get_seed(struct bio_integrity_payload *bip)
62-
{
63-
return bip->bip_iter.bi_sector;
64-
}
65-
66-
static inline void bip_set_seed(struct bio_integrity_payload *bip,
67-
sector_t seed)
68-
{
69-
bip->bip_iter.bi_sector = seed;
70-
}
71-
7261
void bio_integrity_init(struct bio *bio, struct bio_integrity_payload *bip,
7362
struct bio_vec *bvecs, unsigned int nr_vecs);
7463
struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, gfp_t gfp,

include/linux/blk-integrity.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,19 @@ static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
8787
return bio_integrity_intervals(bi, sectors) * bi->metadata_size;
8888
}
8989

90+
/**
91+
* bip_set_seed - Set bip reference tag seed from bio device address
92+
* @bio: struct bio whose integrity payload's ref tag seed to initialize
93+
*/
94+
static inline void bip_set_seed(struct bio *bio)
95+
{
96+
struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
97+
struct bio_integrity_payload *bip = bio_integrity(bio);
98+
99+
bip->bip_iter.bi_sector =
100+
bio_integrity_intervals(bi, bio->bi_iter.bi_sector);
101+
}
102+
90103
static inline bool blk_integrity_rq(const struct request *rq)
91104
{
92105
return rq->cmd_flags & REQ_INTEGRITY;

include/linux/bvec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ struct bvec_iter {
7878
/*
7979
* Current device address in 512 byte sectors. Only updated by the bio
8080
* iter wrappers and not the bvec iterator helpers themselves.
81+
* For bip_iter, this is overloaded to represent the integrity interval.
8182
*/
8283
sector_t bi_sector;
8384

0 commit comments

Comments
 (0)