aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorMartin K. Petersen <martin.petersen@oracle.com>2014-09-26 19:19:56 -0400
committerJens Axboe <axboe@fb.com>2014-09-27 11:14:46 -0400
commit180b2f95dd331010a9930a65c8a18d6d81b94dc1 (patch)
tree8ceb4a28e15e1e588b52022a844f81daabd0f92d /block
parente7258c1a269e0967856c81d182c286a78f5ecf15 (diff)
block: Replace bi_integrity with bi_special
For commands like REQ_COPY we need a way to pass extra information along with each bio. Like integrity metadata this information must be available at the bottom of the stack so bi_private does not suffice. Rename the existing bi_integrity field to bi_special and make it a union so we can have different bio extensions for each class of command. We previously used bi_integrity != NULL as a way to identify whether a bio had integrity metadata or not. Introduce a REQ_INTEGRITY to be the indicator now that bi_special can contain different things. In addition, bio_integrity(bio) will now return a pointer to the integrity payload (when applicable). Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r--block/bio-integrity.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/block/bio-integrity.c b/block/bio-integrity.c
index 36b788552c3e..bd3125c3c124 100644
--- a/block/bio-integrity.c
+++ b/block/bio-integrity.c
@@ -79,6 +79,7 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio,
79 bip->bip_slab = idx; 79 bip->bip_slab = idx;
80 bip->bip_bio = bio; 80 bip->bip_bio = bio;
81 bio->bi_integrity = bip; 81 bio->bi_integrity = bip;
82 bio->bi_rw |= REQ_INTEGRITY;
82 83
83 return bip; 84 return bip;
84err: 85err:
@@ -96,7 +97,7 @@ EXPORT_SYMBOL(bio_integrity_alloc);
96 */ 97 */
97void bio_integrity_free(struct bio *bio) 98void bio_integrity_free(struct bio *bio)
98{ 99{
99 struct bio_integrity_payload *bip = bio->bi_integrity; 100 struct bio_integrity_payload *bip = bio_integrity(bio);
100 struct bio_set *bs = bio->bi_pool; 101 struct bio_set *bs = bio->bi_pool;
101 102
102 if (bip->bip_owns_buf) 103 if (bip->bip_owns_buf)
@@ -128,7 +129,7 @@ EXPORT_SYMBOL(bio_integrity_free);
128int bio_integrity_add_page(struct bio *bio, struct page *page, 129int bio_integrity_add_page(struct bio *bio, struct page *page,
129 unsigned int len, unsigned int offset) 130 unsigned int len, unsigned int offset)
130{ 131{
131 struct bio_integrity_payload *bip = bio->bi_integrity; 132 struct bio_integrity_payload *bip = bio_integrity(bio);
132 struct bio_vec *iv; 133 struct bio_vec *iv;
133 134
134 if (bip->bip_vcnt >= bip->bip_max_vcnt) { 135 if (bip->bip_vcnt >= bip->bip_max_vcnt) {
@@ -229,7 +230,7 @@ EXPORT_SYMBOL(bio_integrity_tag_size);
229static int bio_integrity_tag(struct bio *bio, void *tag_buf, unsigned int len, 230static int bio_integrity_tag(struct bio *bio, void *tag_buf, unsigned int len,
230 int set) 231 int set)
231{ 232{
232 struct bio_integrity_payload *bip = bio->bi_integrity; 233 struct bio_integrity_payload *bip = bio_integrity(bio);
233 struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev); 234 struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
234 unsigned int nr_sectors; 235 unsigned int nr_sectors;
235 236
@@ -304,12 +305,12 @@ static int bio_integrity_generate_verify(struct bio *bio, int operate)
304 struct bio_vec *bv; 305 struct bio_vec *bv;
305 sector_t sector; 306 sector_t sector;
306 unsigned int sectors, ret = 0, i; 307 unsigned int sectors, ret = 0, i;
307 void *prot_buf = bio->bi_integrity->bip_buf; 308 void *prot_buf = bio_integrity(bio)->bip_buf;
308 309
309 if (operate) 310 if (operate)
310 sector = bio->bi_iter.bi_sector; 311 sector = bio->bi_iter.bi_sector;
311 else 312 else
312 sector = bio->bi_integrity->bip_iter.bi_sector; 313 sector = bio_integrity(bio)->bip_iter.bi_sector;
313 314
314 bix.disk_name = bio->bi_bdev->bd_disk->disk_name; 315 bix.disk_name = bio->bi_bdev->bd_disk->disk_name;
315 bix.sector_size = bi->sector_size; 316 bix.sector_size = bi->sector_size;
@@ -505,7 +506,7 @@ static void bio_integrity_verify_fn(struct work_struct *work)
505 */ 506 */
506void bio_integrity_endio(struct bio *bio, int error) 507void bio_integrity_endio(struct bio *bio, int error)
507{ 508{
508 struct bio_integrity_payload *bip = bio->bi_integrity; 509 struct bio_integrity_payload *bip = bio_integrity(bio);
509 510
510 BUG_ON(bip->bip_bio != bio); 511 BUG_ON(bip->bip_bio != bio);
511 512
@@ -536,7 +537,7 @@ EXPORT_SYMBOL(bio_integrity_endio);
536 */ 537 */
537void bio_integrity_advance(struct bio *bio, unsigned int bytes_done) 538void bio_integrity_advance(struct bio *bio, unsigned int bytes_done)
538{ 539{
539 struct bio_integrity_payload *bip = bio->bi_integrity; 540 struct bio_integrity_payload *bip = bio_integrity(bio);
540 struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev); 541 struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
541 unsigned bytes = bio_integrity_bytes(bi, bytes_done >> 9); 542 unsigned bytes = bio_integrity_bytes(bi, bytes_done >> 9);
542 543
@@ -558,7 +559,7 @@ EXPORT_SYMBOL(bio_integrity_advance);
558void bio_integrity_trim(struct bio *bio, unsigned int offset, 559void bio_integrity_trim(struct bio *bio, unsigned int offset,
559 unsigned int sectors) 560 unsigned int sectors)
560{ 561{
561 struct bio_integrity_payload *bip = bio->bi_integrity; 562 struct bio_integrity_payload *bip = bio_integrity(bio);
562 struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev); 563 struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
563 564
564 bio_integrity_advance(bio, offset << 9); 565 bio_integrity_advance(bio, offset << 9);
@@ -577,7 +578,7 @@ EXPORT_SYMBOL(bio_integrity_trim);
577int bio_integrity_clone(struct bio *bio, struct bio *bio_src, 578int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
578 gfp_t gfp_mask) 579 gfp_t gfp_mask)
579{ 580{
580 struct bio_integrity_payload *bip_src = bio_src->bi_integrity; 581 struct bio_integrity_payload *bip_src = bio_integrity(bio_src);
581 struct bio_integrity_payload *bip; 582 struct bio_integrity_payload *bip;
582 583
583 BUG_ON(bip_src == NULL); 584 BUG_ON(bip_src == NULL);