diff options
author | Martin K. Petersen <martin.petersen@oracle.com> | 2014-09-26 19:19:56 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2014-09-27 11:14:46 -0400 |
commit | 180b2f95dd331010a9930a65c8a18d6d81b94dc1 (patch) | |
tree | 8ceb4a28e15e1e588b52022a844f81daabd0f92d /block | |
parent | e7258c1a269e0967856c81d182c286a78f5ecf15 (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.c | 19 |
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; |
84 | err: | 85 | err: |
@@ -96,7 +97,7 @@ EXPORT_SYMBOL(bio_integrity_alloc); | |||
96 | */ | 97 | */ |
97 | void bio_integrity_free(struct bio *bio) | 98 | void 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); | |||
128 | int bio_integrity_add_page(struct bio *bio, struct page *page, | 129 | int 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); | |||
229 | static int bio_integrity_tag(struct bio *bio, void *tag_buf, unsigned int len, | 230 | static 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 | */ |
506 | void bio_integrity_endio(struct bio *bio, int error) | 507 | void 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 | */ |
537 | void bio_integrity_advance(struct bio *bio, unsigned int bytes_done) | 538 | void 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); | |||
558 | void bio_integrity_trim(struct bio *bio, unsigned int offset, | 559 | void 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); | |||
577 | int bio_integrity_clone(struct bio *bio, struct bio *bio_src, | 578 | int 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); |