|
@@ -134,8 +134,7 @@ int bio_integrity_add_page(struct bio *bio, struct page *page,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- iv = bip_vec_idx(bip, bip->bip_vcnt);
|
|
|
- BUG_ON(iv == NULL);
|
|
|
+ iv = bip->bip_vec + bip->bip_vcnt;
|
|
|
|
|
|
iv->bv_page = page;
|
|
|
iv->bv_len = len;
|
|
@@ -203,6 +202,12 @@ static inline unsigned int bio_integrity_hw_sectors(struct blk_integrity *bi,
|
|
|
return sectors;
|
|
|
}
|
|
|
|
|
|
+static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
|
|
|
+ unsigned int sectors)
|
|
|
+{
|
|
|
+ return bio_integrity_hw_sectors(bi, sectors) * bi->tuple_size;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* bio_integrity_tag_size - Retrieve integrity tag space
|
|
|
* @bio: bio to inspect
|
|
@@ -235,9 +240,9 @@ int bio_integrity_tag(struct bio *bio, void *tag_buf, unsigned int len, int set)
|
|
|
nr_sectors = bio_integrity_hw_sectors(bi,
|
|
|
DIV_ROUND_UP(len, bi->tag_size));
|
|
|
|
|
|
- if (nr_sectors * bi->tuple_size > bip->bip_size) {
|
|
|
- printk(KERN_ERR "%s: tag too big for bio: %u > %u\n",
|
|
|
- __func__, nr_sectors * bi->tuple_size, bip->bip_size);
|
|
|
+ if (nr_sectors * bi->tuple_size > bip->bip_iter.bi_size) {
|
|
|
+ printk(KERN_ERR "%s: tag too big for bio: %u > %u\n", __func__,
|
|
|
+ nr_sectors * bi->tuple_size, bip->bip_iter.bi_size);
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
@@ -322,7 +327,7 @@ static void bio_integrity_generate(struct bio *bio)
|
|
|
sector += sectors;
|
|
|
prot_buf += sectors * bi->tuple_size;
|
|
|
total += sectors * bi->tuple_size;
|
|
|
- BUG_ON(total > bio->bi_integrity->bip_size);
|
|
|
+ BUG_ON(total > bio->bi_integrity->bip_iter.bi_size);
|
|
|
|
|
|
kunmap_atomic(kaddr);
|
|
|
}
|
|
@@ -387,8 +392,8 @@ int bio_integrity_prep(struct bio *bio)
|
|
|
|
|
|
bip->bip_owns_buf = 1;
|
|
|
bip->bip_buf = buf;
|
|
|
- bip->bip_size = len;
|
|
|
- bip->bip_sector = bio->bi_iter.bi_sector;
|
|
|
+ bip->bip_iter.bi_size = len;
|
|
|
+ bip->bip_iter.bi_sector = bio->bi_iter.bi_sector;
|
|
|
|
|
|
/* Map it */
|
|
|
offset = offset_in_page(buf);
|
|
@@ -444,7 +449,7 @@ static int bio_integrity_verify(struct bio *bio)
|
|
|
struct blk_integrity_exchg bix;
|
|
|
struct bio_vec bv;
|
|
|
struct bvec_iter iter;
|
|
|
- sector_t sector = bio->bi_integrity->bip_sector;
|
|
|
+ sector_t sector = bio->bi_integrity->bip_iter.bi_sector;
|
|
|
unsigned int sectors, total, ret;
|
|
|
void *prot_buf = bio->bi_integrity->bip_buf;
|
|
|
|
|
@@ -470,7 +475,7 @@ static int bio_integrity_verify(struct bio *bio)
|
|
|
sector += sectors;
|
|
|
prot_buf += sectors * bi->tuple_size;
|
|
|
total += sectors * bi->tuple_size;
|
|
|
- BUG_ON(total > bio->bi_integrity->bip_size);
|
|
|
+ BUG_ON(total > bio->bi_integrity->bip_iter.bi_size);
|
|
|
|
|
|
kunmap_atomic(kaddr);
|
|
|
}
|
|
@@ -534,56 +539,6 @@ void bio_integrity_endio(struct bio *bio, int error)
|
|
|
}
|
|
|
EXPORT_SYMBOL(bio_integrity_endio);
|
|
|
|
|
|
-/**
|
|
|
- * bio_integrity_mark_head - Advance bip_vec skip bytes
|
|
|
- * @bip: Integrity vector to advance
|
|
|
- * @skip: Number of bytes to advance it
|
|
|
- */
|
|
|
-void bio_integrity_mark_head(struct bio_integrity_payload *bip,
|
|
|
- unsigned int skip)
|
|
|
-{
|
|
|
- struct bio_vec *iv;
|
|
|
- unsigned int i;
|
|
|
-
|
|
|
- bip_for_each_vec(iv, bip, i) {
|
|
|
- if (skip == 0) {
|
|
|
- bip->bip_idx = i;
|
|
|
- return;
|
|
|
- } else if (skip >= iv->bv_len) {
|
|
|
- skip -= iv->bv_len;
|
|
|
- } else { /* skip < iv->bv_len) */
|
|
|
- iv->bv_offset += skip;
|
|
|
- iv->bv_len -= skip;
|
|
|
- bip->bip_idx = i;
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * bio_integrity_mark_tail - Truncate bip_vec to be len bytes long
|
|
|
- * @bip: Integrity vector to truncate
|
|
|
- * @len: New length of integrity vector
|
|
|
- */
|
|
|
-void bio_integrity_mark_tail(struct bio_integrity_payload *bip,
|
|
|
- unsigned int len)
|
|
|
-{
|
|
|
- struct bio_vec *iv;
|
|
|
- unsigned int i;
|
|
|
-
|
|
|
- bip_for_each_vec(iv, bip, i) {
|
|
|
- if (len == 0) {
|
|
|
- bip->bip_vcnt = i;
|
|
|
- return;
|
|
|
- } else if (len >= iv->bv_len) {
|
|
|
- len -= iv->bv_len;
|
|
|
- } else { /* len < iv->bv_len) */
|
|
|
- iv->bv_len = len;
|
|
|
- len = 0;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* bio_integrity_advance - Advance integrity vector
|
|
|
* @bio: bio whose integrity vector to update
|
|
@@ -597,13 +552,9 @@ void bio_integrity_advance(struct bio *bio, unsigned int bytes_done)
|
|
|
{
|
|
|
struct bio_integrity_payload *bip = bio->bi_integrity;
|
|
|
struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
|
|
|
- unsigned int nr_sectors;
|
|
|
+ unsigned bytes = bio_integrity_bytes(bi, bytes_done >> 9);
|
|
|
|
|
|
- BUG_ON(bip == NULL);
|
|
|
- BUG_ON(bi == NULL);
|
|
|
-
|
|
|
- nr_sectors = bio_integrity_hw_sectors(bi, bytes_done >> 9);
|
|
|
- bio_integrity_mark_head(bip, nr_sectors * bi->tuple_size);
|
|
|
+ bvec_iter_advance(bip->bip_vec, &bip->bip_iter, bytes);
|
|
|
}
|
|
|
EXPORT_SYMBOL(bio_integrity_advance);
|
|
|
|
|
@@ -623,16 +574,9 @@ void bio_integrity_trim(struct bio *bio, unsigned int offset,
|
|
|
{
|
|
|
struct bio_integrity_payload *bip = bio->bi_integrity;
|
|
|
struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
|
|
|
- unsigned int nr_sectors;
|
|
|
|
|
|
- BUG_ON(bip == NULL);
|
|
|
- BUG_ON(bi == NULL);
|
|
|
- BUG_ON(!bio_flagged(bio, BIO_CLONED));
|
|
|
-
|
|
|
- nr_sectors = bio_integrity_hw_sectors(bi, sectors);
|
|
|
- bip->bip_sector = bip->bip_sector + offset;
|
|
|
- bio_integrity_mark_head(bip, offset * bi->tuple_size);
|
|
|
- bio_integrity_mark_tail(bip, sectors * bi->tuple_size);
|
|
|
+ bio_integrity_advance(bio, offset << 9);
|
|
|
+ bip->bip_iter.bi_size = bio_integrity_bytes(bi, sectors);
|
|
|
}
|
|
|
EXPORT_SYMBOL(bio_integrity_trim);
|
|
|
|
|
@@ -662,8 +606,8 @@ void bio_integrity_split(struct bio *bio, struct bio_pair *bp, int sectors)
|
|
|
bp->bio1.bi_integrity = &bp->bip1;
|
|
|
bp->bio2.bi_integrity = &bp->bip2;
|
|
|
|
|
|
- bp->iv1 = bip->bip_vec[bip->bip_idx];
|
|
|
- bp->iv2 = bip->bip_vec[bip->bip_idx];
|
|
|
+ bp->iv1 = bip->bip_vec[bip->bip_iter.bi_idx];
|
|
|
+ bp->iv2 = bip->bip_vec[bip->bip_iter.bi_idx];
|
|
|
|
|
|
bp->bip1.bip_vec = &bp->iv1;
|
|
|
bp->bip2.bip_vec = &bp->iv2;
|
|
@@ -672,11 +616,12 @@ void bio_integrity_split(struct bio *bio, struct bio_pair *bp, int sectors)
|
|
|
bp->iv2.bv_offset += sectors * bi->tuple_size;
|
|
|
bp->iv2.bv_len -= sectors * bi->tuple_size;
|
|
|
|
|
|
- bp->bip1.bip_sector = bio->bi_integrity->bip_sector;
|
|
|
- bp->bip2.bip_sector = bio->bi_integrity->bip_sector + nr_sectors;
|
|
|
+ bp->bip1.bip_iter.bi_sector = bio->bi_integrity->bip_iter.bi_sector;
|
|
|
+ bp->bip2.bip_iter.bi_sector =
|
|
|
+ bio->bi_integrity->bip_iter.bi_sector + nr_sectors;
|
|
|
|
|
|
bp->bip1.bip_vcnt = bp->bip2.bip_vcnt = 1;
|
|
|
- bp->bip1.bip_idx = bp->bip2.bip_idx = 0;
|
|
|
+ bp->bip1.bip_iter.bi_idx = bp->bip2.bip_iter.bi_idx = 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL(bio_integrity_split);
|
|
|
|
|
@@ -704,9 +649,8 @@ int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
|
|
|
memcpy(bip->bip_vec, bip_src->bip_vec,
|
|
|
bip_src->bip_vcnt * sizeof(struct bio_vec));
|
|
|
|
|
|
- bip->bip_sector = bip_src->bip_sector;
|
|
|
bip->bip_vcnt = bip_src->bip_vcnt;
|
|
|
- bip->bip_idx = bip_src->bip_idx;
|
|
|
+ bip->bip_iter = bip_src->bip_iter;
|
|
|
|
|
|
return 0;
|
|
|
}
|