Lines Matching defs:bio

3  * bio-integrity.c - bio data integrity extensions
12 #include <linux/bio.h>
39 * bio_integrity_alloc - Allocate integrity payload and attach it to bio
40 * @bio: bio to attach integrity metadata to
44 * Description: This function prepares a bio for attaching integrity
48 struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio,
53 struct bio_set *bs = bio->bi_pool;
56 if (WARN_ON_ONCE(bio_has_crypt_ctx(bio)))
83 bip->bip_bio = bio;
84 bio->bi_integrity = bip;
85 bio->bi_opf |= REQ_INTEGRITY;
95 * bio_integrity_free - Free bio integrity payload
96 * @bio: bio containing bip to be freed
98 * Description: Used to free the integrity portion of a bio. Usually
101 void bio_integrity_free(struct bio *bio)
103 struct bio_integrity_payload *bip = bio_integrity(bio);
104 struct bio_set *bs = bio->bi_pool;
110 bio->bi_integrity = NULL;
111 bio->bi_opf &= ~REQ_INTEGRITY;
116 * @bio: bio to update
121 * Description: Attach a page containing integrity metadata to bio.
123 int bio_integrity_add_page(struct bio *bio, struct page *page,
126 struct request_queue *q = bdev_get_queue(bio->bi_bdev);
127 struct bio_integrity_payload *bip = bio_integrity(bio);
164 * bio_integrity_process - Process integrity metadata for a bio
165 * @bio: bio to generate/verify integrity metadata for
169 static blk_status_t bio_integrity_process(struct bio *bio,
172 struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
176 struct bio_integrity_payload *bip = bio_integrity(bio);
179 iter.disk_name = bio->bi_bdev->bd_disk->disk_name;
185 __bio_for_each_segment(bv, bio, bviter, *proc_iter) {
201 * bio_integrity_prep - Prepare bio for integrity I/O
202 * @bio: bio to prepare
204 * Description: Checks if the bio already has an integrity payload attached.
207 * The bio must have data direction, target device and start sector set priot
212 bool bio_integrity_prep(struct bio *bio)
215 struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
224 if (bio_op(bio) != REQ_OP_READ && bio_op(bio) != REQ_OP_WRITE)
227 if (!bio_sectors(bio))
231 if (bio_integrity(bio))
234 if (bio_data_dir(bio) == READ) {
245 len = bio_integrity_bytes(bi, bio_sectors(bio));
256 /* Allocate bio integrity payload and integrity vectors */
257 bip = bio_integrity_alloc(bio, GFP_NOIO, nr_pages);
265 bip_set_seed(bip, bio->bi_iter.bi_sector);
278 if (bio_integrity_add_page(bio, virt_to_page(buf),
290 if (bio_data_dir(bio) == WRITE) {
291 bio_integrity_process(bio, &bio->bi_iter,
294 bip->bio_iter = bio->bi_iter;
299 bio->bi_status = BLK_STS_RESOURCE;
300 bio_endio(bio);
307 * @work: Work struct stored in bio to be verified
311 * and then calls the original bio end_io function.
317 struct bio *bio = bip->bip_bio;
318 struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
321 * At the moment verify is called bio's iterator was advanced
325 bio->bi_status = bio_integrity_process(bio, &bip->bio_iter,
327 bio_integrity_free(bio);
328 bio_endio(bio);
333 * @bio: Protected bio
342 bool __bio_integrity_endio(struct bio *bio)
344 struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
345 struct bio_integrity_payload *bip = bio_integrity(bio);
347 if (bio_op(bio) == REQ_OP_READ && !bio->bi_status &&
354 bio_integrity_free(bio);
360 * @bio: bio whose integrity vector to update
367 void bio_integrity_advance(struct bio *bio, unsigned int bytes_done)
369 struct bio_integrity_payload *bip = bio_integrity(bio);
370 struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
379 * @bio: bio whose integrity vector to update
381 * Description: Used to trim the integrity vector in a cloned bio.
383 void bio_integrity_trim(struct bio *bio)
385 struct bio_integrity_payload *bip = bio_integrity(bio);
386 struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
388 bip->bip_iter.bi_size = bio_integrity_bytes(bi, bio_sectors(bio));
394 * @bio: New bio
395 * @bio_src: Original bio
398 * Description: Called to allocate a bip when cloning a bio
400 int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
408 bip = bio_integrity_alloc(bio, gfp_mask, bip_src->bip_vcnt);