Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions block/bio-integrity-fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ int fs_bio_integrity_verify(struct bio *bio, sector_t sector, unsigned int size)
{
struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
struct bio_integrity_payload *bip = bio_integrity(bio);
struct bvec_iter data_iter = {
.bi_sector = sector,
.bi_size = size,
};

/*
* Reinitialize bip->bip_iter.
Expand All @@ -63,9 +67,9 @@ int fs_bio_integrity_verify(struct bio *bio, sector_t sector, unsigned int size)
* bio. Requires the submitter to remember the sector and the size.
*/
memset(&bip->bip_iter, 0, sizeof(bip->bip_iter));
bip->bip_iter.bi_sector = sector;
bip->bip_iter.bi_sector = bio_integrity_intervals(bi, sector);
bip->bip_iter.bi_size = bio_integrity_bytes(bi, size >> SECTOR_SHIFT);
return blk_status_to_errno(bio_integrity_verify(bio, &bip->bip_iter));
return blk_status_to_errno(bio_integrity_verify(bio, &data_iter));
}

static int __init fs_bio_integrity_init(void)
Expand Down
4 changes: 2 additions & 2 deletions block/bio-integrity.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ void bio_integrity_setup_default(struct bio *bio)
struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
struct bio_integrity_payload *bip = bio_integrity(bio);

bip_set_seed(bip, bio->bi_iter.bi_sector);
bip_set_seed(bio);

if (bi->csum_type) {
bip->bip_flags |= BIP_CHECK_GUARD;
Expand Down Expand Up @@ -473,7 +473,7 @@ int bio_integrity_map_iter(struct bio *bio, struct uio_meta *meta)
ret = bio_integrity_map_user(bio, &it);
if (!ret) {
bio_uio_meta_to_bip(bio, meta);
bip_set_seed(bio_integrity(bio), meta->seed);
bio_integrity(bio)->bip_iter.bi_sector = meta->seed;
iov_iter_advance(&meta->iter, integrity_bytes);
meta->seed += bio_integrity_intervals(bi, bio_sectors(bio));
}
Expand Down
7 changes: 4 additions & 3 deletions block/t10-pi.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,14 +310,15 @@ static blk_status_t blk_integrity_iterate(struct bio *bio,
{
struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
struct bio_integrity_payload *bip = bio_integrity(bio);
u64 seed = data_iter->bi_sector >> (bi->interval_exp - SECTOR_SHIFT);
struct blk_integrity_iter iter = {
.bio = bio,
.bip = bip,
.bi = bi,
.data_iter = *data_iter,
.prot_iter = bip->bip_iter,
.interval_remaining = 1 << bi->interval_exp,
.seed = data_iter->bi_sector,
.seed = seed,
.csum = 0,
};
blk_status_t ret = BLK_STS_OK;
Expand Down Expand Up @@ -511,7 +512,7 @@ static void __blk_reftag_remap(struct bio *bio, struct blk_integrity *bi,
{
struct bio_integrity_payload *bip = bio_integrity(bio);
struct bvec_iter iter = bip->bip_iter;
u64 virt = bip_get_seed(bip);
u64 virt = bip->bip_iter.bi_sector;
union pi_tuple *ptuple;
union pi_tuple tuple;

Expand Down Expand Up @@ -542,7 +543,7 @@ static void blk_integrity_remap(struct request *rq, unsigned int nr_bytes,
bool prep)
{
struct blk_integrity *bi = &rq->q->limits.integrity;
u64 ref = blk_rq_pos(rq) >> (bi->interval_exp - SECTOR_SHIFT);
u64 ref = bio_integrity_intervals(bi, blk_rq_pos(rq));
unsigned intervals = nr_bytes >> bi->interval_exp;
struct bio *bio;

Expand Down
3 changes: 1 addition & 2 deletions drivers/nvme/target/io-cmd-bdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -220,8 +220,7 @@ static int nvmet_bdev_alloc_bip(struct nvmet_req *req, struct bio *bio,
}

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

resid = bio_integrity_bytes(bi, bio_sectors(bio));
while (resid > 0 && sg_miter_next(miter)) {
Expand Down
3 changes: 1 addition & 2 deletions drivers/target/target_core_iblock.c
Original file line number Diff line number Diff line change
Expand Up @@ -708,8 +708,7 @@ iblock_alloc_bip(struct se_cmd *cmd, struct bio *bio,
}

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

pr_debug("IBLOCK BIP Size: %u Sector: %llu\n", bip->bip_iter.bi_size,
(unsigned long long)bip->bip_iter.bi_sector);
Expand Down
11 changes: 0 additions & 11 deletions include/linux/bio-integrity.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,6 @@ static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag)
return false;
}

static inline sector_t bip_get_seed(struct bio_integrity_payload *bip)
{
return bip->bip_iter.bi_sector;
}

static inline void bip_set_seed(struct bio_integrity_payload *bip,
sector_t seed)
{
bip->bip_iter.bi_sector = seed;
}

void bio_integrity_init(struct bio *bio, struct bio_integrity_payload *bip,
struct bio_vec *bvecs, unsigned int nr_vecs);
struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, gfp_t gfp,
Expand Down
27 changes: 20 additions & 7 deletions include/linux/blk-integrity.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,19 +66,19 @@ queue_max_integrity_segments(const struct request_queue *q)
}

/**
* bio_integrity_intervals - Return number of integrity intervals for a bio
* bio_integrity_intervals - Convert sectors to integrity intervals
* @bi: blk_integrity profile for device
* @sectors: Size of the bio in 512-byte sectors
* @sectors: Number of 512-byte sectors
*
* Description: The block layer calculates everything in 512 byte
* sectors but integrity metadata is done in terms of the data integrity
* interval size of the storage device. Convert the block layer sectors
* to the appropriate number of integrity intervals.
*/
static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi,
unsigned int sectors)
static inline u64 bio_integrity_intervals(const struct blk_integrity *bi,
u64 sectors)
{
return sectors >> (bi->interval_exp - 9);
return sectors >> (bi->interval_exp - SECTOR_SHIFT);
}

static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
Expand All @@ -87,6 +87,19 @@ static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
return bio_integrity_intervals(bi, sectors) * bi->metadata_size;
}

/**
* bip_set_seed - Set bip reference tag seed from bio device address
* @bio: struct bio whose integrity payload's ref tag seed to initialize
*/
static inline void bip_set_seed(struct bio *bio)
{
struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
struct bio_integrity_payload *bip = bio_integrity(bio);

bip->bip_iter.bi_sector =
bio_integrity_intervals(bi, bio->bi_iter.bi_sector);
}

static inline bool blk_integrity_rq(const struct request *rq)
{
return rq->cmd_flags & REQ_INTEGRITY;
Expand Down Expand Up @@ -153,8 +166,8 @@ queue_max_integrity_segments(const struct request_queue *q)
return 0;
}

static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi,
unsigned int sectors)
static inline u64 bio_integrity_intervals(const struct blk_integrity *bi,
u64 sectors)
{
return 0;
}
Expand Down
1 change: 1 addition & 0 deletions include/linux/bvec.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ struct bvec_iter {
/*
* Current device address in 512 byte sectors. Only updated by the bio
* iter wrappers and not the bvec iterator helpers themselves.
* For bip_iter, this is overloaded to represent the integrity interval.
*/
sector_t bi_sector;

Expand Down
Loading