Lines Matching defs:bio

3  * bio-integrity.c - bio data integrity extensions
12 #include <linux/bio.h>
41 * bio_integrity_alloc - Allocate integrity payload and attach it to bio
42 * @bio: bio to attach integrity metadata to
46 * Description: This function prepares a bio for attaching integrity
50 struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio,
55 struct bio_set *bs = bio->bi_pool;
58 if (WARN_ON_ONCE(bio_has_crypt_ctx(bio)))
88 bip->bip_bio = bio;
89 bio->bi_integrity = bip;
90 bio->bi_opf |= REQ_INTEGRITY;
100 * bio_integrity_free - Free bio integrity payload
101 * @bio: bio containing bip to be freed
103 * Description: Used to free the integrity portion of a bio. Usually
106 void bio_integrity_free(struct bio *bio)
108 struct bio_integrity_payload *bip = bio_integrity(bio);
109 struct bio_set *bs = bio->bi_pool;
116 bio->bi_integrity = NULL;
117 bio->bi_opf &= ~REQ_INTEGRITY;
122 * @bio: bio to update
127 * Description: Attach a page containing integrity metadata to bio.
129 int bio_integrity_add_page(struct bio *bio, struct page *page,
132 struct bio_integrity_payload *bip = bio_integrity(bio);
143 bvec_gap_to_prev(bio->bi_disk->queue,
157 * bio_integrity_process - Process integrity metadata for a bio
158 * @bio: bio to generate/verify integrity metadata for
162 static blk_status_t bio_integrity_process(struct bio *bio,
165 struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
169 struct bio_integrity_payload *bip = bio_integrity(bio);
174 iter.disk_name = bio->bi_disk->disk_name;
179 __bio_for_each_segment(bv, bio, bviter, *proc_iter) {
197 * bio_integrity_prep - Prepare bio for integrity I/O
198 * @bio: bio to prepare
200 * Description: Checks if the bio already has an integrity payload attached.
203 * The bio must have data direction, target device and start sector set priot
208 bool bio_integrity_prep(struct bio *bio)
211 struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
212 struct request_queue *q = bio->bi_disk->queue;
223 if (bio_op(bio) != REQ_OP_READ && bio_op(bio) != REQ_OP_WRITE)
226 if (!bio_sectors(bio))
230 if (bio_integrity(bio))
233 if (bio_data_dir(bio) == READ) {
242 intervals = bio_integrity_intervals(bi, bio_sectors(bio));
257 /* Allocate bio integrity payload and integrity vectors */
258 bip = bio_integrity_alloc(bio, GFP_NOIO, nr_pages);
268 bip_set_seed(bip, bio->bi_iter.bi_sector);
285 ret = bio_integrity_add_page(bio, virt_to_page(buf),
303 if (bio_data_dir(bio) == WRITE) {
304 bio_integrity_process(bio, &bio->bi_iter,
307 bip->bio_iter = bio->bi_iter;
312 bio->bi_status = status;
313 bio_endio(bio);
321 * @work: Work struct stored in bio to be verified
325 * and then calls the original bio end_io function.
331 struct bio *bio = bip->bip_bio;
332 struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
335 * At the moment verify is called bio's iterator was advanced
339 bio->bi_status = bio_integrity_process(bio, &bip->bio_iter,
341 bio_integrity_free(bio);
342 bio_endio(bio);
347 * @bio: Protected bio
356 bool __bio_integrity_endio(struct bio *bio)
358 struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
359 struct bio_integrity_payload *bip = bio_integrity(bio);
361 if (bio_op(bio) == REQ_OP_READ && !bio->bi_status &&
368 bio_integrity_free(bio);
374 * @bio: bio whose integrity vector to update
381 void bio_integrity_advance(struct bio *bio, unsigned int bytes_done)
383 struct bio_integrity_payload *bip = bio_integrity(bio);
384 struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
393 * @bio: bio whose integrity vector to update
395 * Description: Used to trim the integrity vector in a cloned bio.
397 void bio_integrity_trim(struct bio *bio)
399 struct bio_integrity_payload *bip = bio_integrity(bio);
400 struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
402 bip->bip_iter.bi_size = bio_integrity_bytes(bi, bio_sectors(bio));
408 * @bio: New bio
409 * @bio_src: Original bio
412 * Description: Called to allocate a bip when cloning a bio
414 int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
422 bip = bio_integrity_alloc(bio, gfp_mask, bip_src->bip_vcnt);