Lines Matching refs:bio
13 #include <linux/bio.h>
132 static void copy_to_high_bio_irq(struct bio *to, struct bio *from)
138 * The bio of @from is created by bounce, so we can iterate
162 static void bounce_end_io(struct bio *bio, mempool_t *pool)
164 struct bio *bio_orig = bio->bi_private;
172 bio_for_each_segment_all(bvec, bio, iter_all) {
181 bio_orig->bi_status = bio->bi_status;
183 bio_put(bio);
186 static void bounce_end_io_write(struct bio *bio)
188 bounce_end_io(bio, &page_pool);
191 static void bounce_end_io_write_isa(struct bio *bio)
194 bounce_end_io(bio, &isa_page_pool);
197 static void __bounce_end_io_read(struct bio *bio, mempool_t *pool)
199 struct bio *bio_orig = bio->bi_private;
201 if (!bio->bi_status)
202 copy_to_high_bio_irq(bio_orig, bio);
204 bounce_end_io(bio, pool);
207 static void bounce_end_io_read(struct bio *bio)
209 __bounce_end_io_read(bio, &page_pool);
212 static void bounce_end_io_read_isa(struct bio *bio)
214 __bounce_end_io_read(bio, &isa_page_pool);
217 static struct bio *bounce_clone_bio(struct bio *bio_src, gfp_t gfp_mask,
222 struct bio *bio;
226 * bio_src->bi_io_vec to bio->bi_io_vec.
230 * - The point of cloning the biovec is to produce a bio with a biovec
233 * - The original bio could've had more than BIO_MAX_PAGES biovecs; if
239 * that does not own the bio - reason being drivers don't use it for
246 bio = bio_alloc_bioset(gfp_mask, bio_segments(bio_src), bs);
247 if (!bio)
249 bio->bi_disk = bio_src->bi_disk;
250 bio->bi_opf = bio_src->bi_opf;
251 bio->bi_ioprio = bio_src->bi_ioprio;
252 bio->bi_write_hint = bio_src->bi_write_hint;
253 bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector;
254 bio->bi_iter.bi_size = bio_src->bi_iter.bi_size;
256 switch (bio_op(bio)) {
262 bio->bi_io_vec[bio->bi_vcnt++] = bio_src->bi_io_vec[0];
266 bio->bi_io_vec[bio->bi_vcnt++] = bv;
270 if (bio_crypt_clone(bio, bio_src, gfp_mask) < 0)
274 bio_integrity_clone(bio, bio_src, gfp_mask) < 0)
277 bio_clone_blkg_association(bio, bio_src);
278 blkcg_bio_issue_init(bio);
280 return bio;
283 bio_put(bio);
287 static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
290 struct bio *bio;
309 bio = bio_split(*bio_orig, sectors, GFP_NOIO, &bounce_bio_split);
310 bio_chain(bio, *bio_orig);
312 *bio_orig = bio;
314 bio = bounce_clone_bio(*bio_orig, GFP_NOIO, passthrough ? NULL :
320 * because the 'bio' is single-page bvec.
322 for (i = 0, to = bio->bi_io_vec; i < bio->bi_vcnt; to++, i++) {
345 bio->bi_flags |= (1 << BIO_BOUNCED);
348 bio->bi_end_io = bounce_end_io_write;
350 bio->bi_end_io = bounce_end_io_read;
352 bio->bi_end_io = bounce_end_io_write_isa;
354 bio->bi_end_io = bounce_end_io_read_isa;
357 bio->bi_private = *bio_orig;
358 *bio_orig = bio;
361 void blk_queue_bounce(struct request_queue *q, struct bio **bio_orig)
366 * Data-less bio, nothing to bounce
374 * don't waste time iterating over bio segments