Lines Matching refs:bbio

25 	struct btrfs_bio *bbio;  member
31 static inline bool is_data_bbio(struct btrfs_bio *bbio) in is_data_bbio() argument
33 return bbio->inode && is_data_inode(&bbio->inode->vfs_inode); in is_data_bbio()
36 static bool bbio_has_ordered_extent(struct btrfs_bio *bbio) in bbio_has_ordered_extent() argument
38 return is_data_bbio(bbio) && btrfs_op(&bbio->bio) == BTRFS_MAP_WRITE; in bbio_has_ordered_extent()
45 void btrfs_bio_init(struct btrfs_bio *bbio, struct btrfs_fs_info *fs_info, in btrfs_bio_init() argument
48 memset(bbio, 0, offsetof(struct btrfs_bio, bio)); in btrfs_bio_init()
49 bbio->fs_info = fs_info; in btrfs_bio_init()
50 bbio->end_io = end_io; in btrfs_bio_init()
51 bbio->private = private; in btrfs_bio_init()
52 atomic_set(&bbio->pending_ios, 1); in btrfs_bio_init()
66 struct btrfs_bio *bbio; in btrfs_bio_alloc() local
70 bbio = btrfs_bio(bio); in btrfs_bio_alloc()
71 btrfs_bio_init(bbio, fs_info, end_io, private); in btrfs_bio_alloc()
72 return bbio; in btrfs_bio_alloc()
79 struct btrfs_bio *bbio; in btrfs_split_bio() local
91 bbio = btrfs_bio(bio); in btrfs_split_bio()
92 btrfs_bio_init(bbio, fs_info, NULL, orig_bbio); in btrfs_split_bio()
93 bbio->inode = orig_bbio->inode; in btrfs_split_bio()
94 bbio->file_offset = orig_bbio->file_offset; in btrfs_split_bio()
96 if (bbio_has_ordered_extent(bbio)) { in btrfs_split_bio()
98 bbio->ordered = orig_bbio->ordered; in btrfs_split_bio()
101 return bbio; in btrfs_split_bio()
105 static void btrfs_cleanup_bio(struct btrfs_bio *bbio) in btrfs_cleanup_bio() argument
107 if (bbio_has_ordered_extent(bbio)) in btrfs_cleanup_bio()
108 btrfs_put_ordered_extent(bbio->ordered); in btrfs_cleanup_bio()
109 bio_put(&bbio->bio); in btrfs_cleanup_bio()
112 static void __btrfs_bio_end_io(struct btrfs_bio *bbio) in __btrfs_bio_end_io() argument
114 if (bbio_has_ordered_extent(bbio)) { in __btrfs_bio_end_io()
115 struct btrfs_ordered_extent *ordered = bbio->ordered; in __btrfs_bio_end_io()
117 bbio->end_io(bbio); in __btrfs_bio_end_io()
120 bbio->end_io(bbio); in __btrfs_bio_end_io()
124 void btrfs_bio_end_io(struct btrfs_bio *bbio, blk_status_t status) in btrfs_bio_end_io() argument
126 bbio->bio.bi_status = status; in btrfs_bio_end_io()
127 __btrfs_bio_end_io(bbio); in btrfs_bio_end_io()
132 static void btrfs_bbio_propagate_error(struct btrfs_bio *bbio, in btrfs_bbio_propagate_error() argument
141 if (bbio->bio.bi_end_io == &btrfs_orig_write_end_io) { in btrfs_bbio_propagate_error()
147 orig_bbio->bio.bi_status = bbio->bio.bi_status; in btrfs_bbio_propagate_error()
151 static void btrfs_orig_bbio_end_io(struct btrfs_bio *bbio) in btrfs_orig_bbio_end_io() argument
153 if (bbio->bio.bi_pool == &btrfs_clone_bioset) { in btrfs_orig_bbio_end_io()
154 struct btrfs_bio *orig_bbio = bbio->private; in btrfs_orig_bbio_end_io()
156 if (bbio->bio.bi_status) in btrfs_orig_bbio_end_io()
157 btrfs_bbio_propagate_error(bbio, orig_bbio); in btrfs_orig_bbio_end_io()
158 btrfs_cleanup_bio(bbio); in btrfs_orig_bbio_end_io()
159 bbio = orig_bbio; in btrfs_orig_bbio_end_io()
162 if (atomic_dec_and_test(&bbio->pending_ios)) in btrfs_orig_bbio_end_io()
163 __btrfs_bio_end_io(bbio); in btrfs_orig_bbio_end_io()
183 btrfs_orig_bbio_end_io(fbio->bbio); in btrfs_repair_done()
203 if (mirror == fbio->bbio->mirror_num) { in btrfs_end_repair_bio()
205 fbio->bbio->bio.bi_status = BLK_STS_IOERR; in btrfs_end_repair_bio()
219 } while (mirror != fbio->bbio->mirror_num); in btrfs_end_repair_bio()
259 fbio->bbio = failed_bbio; in repair_one_sector()
282 static void btrfs_check_read_bio(struct btrfs_bio *bbio, struct btrfs_device *dev) in btrfs_check_read_bio() argument
284 struct btrfs_inode *inode = bbio->inode; in btrfs_check_read_bio()
287 struct bvec_iter *iter = &bbio->saved_iter; in btrfs_check_read_bio()
288 blk_status_t status = bbio->bio.bi_status; in btrfs_check_read_bio()
299 if (bbio->bio.bi_pool == &btrfs_repair_bioset) { in btrfs_check_read_bio()
300 btrfs_end_repair_bio(bbio, dev); in btrfs_check_read_bio()
305 bbio->bio.bi_status = BLK_STS_OK; in btrfs_check_read_bio()
308 struct bio_vec bv = bio_iter_iovec(&bbio->bio, *iter); in btrfs_check_read_bio()
311 if (status || !btrfs_data_csum_ok(bbio, dev, offset, &bv)) in btrfs_check_read_bio()
312 fbio = repair_one_sector(bbio, offset, &bv, fbio); in btrfs_check_read_bio()
314 bio_advance_iter_single(&bbio->bio, iter, sectorsize); in btrfs_check_read_bio()
318 if (bbio->csum != bbio->csum_inline) in btrfs_check_read_bio()
319 kfree(bbio->csum); in btrfs_check_read_bio()
324 btrfs_orig_bbio_end_io(bbio); in btrfs_check_read_bio()
352 struct btrfs_bio *bbio = container_of(work, struct btrfs_bio, end_io_work); in btrfs_end_bio_work() local
355 if (is_data_bbio(bbio)) in btrfs_end_bio_work()
356 btrfs_check_read_bio(bbio, bbio->bio.bi_private); in btrfs_end_bio_work()
358 btrfs_orig_bbio_end_io(bbio); in btrfs_end_bio_work()
363 struct btrfs_bio *bbio = btrfs_bio(bio); in btrfs_simple_end_io() local
365 struct btrfs_fs_info *fs_info = bbio->fs_info; in btrfs_simple_end_io()
373 INIT_WORK(&bbio->end_io_work, btrfs_end_bio_work); in btrfs_simple_end_io()
374 queue_work(btrfs_end_io_wq(fs_info, bio), &bbio->end_io_work); in btrfs_simple_end_io()
377 btrfs_record_physical_zoned(bbio); in btrfs_simple_end_io()
378 btrfs_orig_bbio_end_io(bbio); in btrfs_simple_end_io()
385 struct btrfs_bio *bbio = btrfs_bio(bio); in btrfs_raid56_end_io() local
388 bbio->mirror_num = bioc->mirror_num; in btrfs_raid56_end_io()
389 if (bio_op(bio) == REQ_OP_READ && is_data_bbio(bbio)) in btrfs_raid56_end_io()
390 btrfs_check_read_bio(bbio, NULL); in btrfs_raid56_end_io()
392 btrfs_orig_bbio_end_io(bbio); in btrfs_raid56_end_io()
401 struct btrfs_bio *bbio = btrfs_bio(bio); in btrfs_orig_write_end_io() local
419 btrfs_orig_bbio_end_io(bbio); in btrfs_orig_write_end_io()
526 static blk_status_t btrfs_bio_csum(struct btrfs_bio *bbio) in btrfs_bio_csum() argument
528 if (bbio->bio.bi_opf & REQ_META) in btrfs_bio_csum()
529 return btree_csum_one_bio(bbio); in btrfs_bio_csum()
530 return btrfs_csum_one_bio(bbio); in btrfs_bio_csum()
538 struct btrfs_bio *bbio; member
559 ret = btrfs_bio_csum(async->bbio); in run_one_async_start()
561 async->bbio->bio.bi_status = ret; in run_one_async_start()
576 struct bio *bio = &async->bbio->bio; in run_one_async_done()
580 btrfs_orig_bbio_end_io(async->bbio); in run_one_async_done()
598 static bool should_async_write(struct btrfs_bio *bbio) in should_async_write() argument
601 if (test_bit(BTRFS_FS_CSUM_IMPL_FAST, &bbio->fs_info->flags)) in should_async_write()
608 if (op_is_sync(bbio->bio.bi_opf)) in should_async_write()
612 if ((bbio->bio.bi_opf & REQ_META) && btrfs_is_zoned(bbio->fs_info)) in should_async_write()
623 static bool btrfs_wq_submit_bio(struct btrfs_bio *bbio, in btrfs_wq_submit_bio() argument
627 struct btrfs_fs_info *fs_info = bbio->fs_info; in btrfs_wq_submit_bio()
634 async->bbio = bbio; in btrfs_wq_submit_bio()
645 static bool btrfs_submit_chunk(struct btrfs_bio *bbio, int mirror_num) in btrfs_submit_chunk() argument
647 struct btrfs_inode *inode = bbio->inode; in btrfs_submit_chunk()
648 struct btrfs_fs_info *fs_info = bbio->fs_info; in btrfs_submit_chunk()
649 struct btrfs_bio *orig_bbio = bbio; in btrfs_submit_chunk()
650 struct bio *bio = &bbio->bio; in btrfs_submit_chunk()
654 bool use_append = btrfs_use_zone_append(bbio); in btrfs_submit_chunk()
673 bbio = btrfs_split_bio(fs_info, bbio, map_length, use_append); in btrfs_submit_chunk()
674 bio = &bbio->bio; in btrfs_submit_chunk()
681 if (bio_op(bio) == REQ_OP_READ && is_data_bbio(bbio)) { in btrfs_submit_chunk()
682 bbio->saved_iter = bio->bi_iter; in btrfs_submit_chunk()
683 ret = btrfs_lookup_bio_sums(bbio); in btrfs_submit_chunk()
701 if (should_async_write(bbio) && in btrfs_submit_chunk()
702 btrfs_wq_submit_bio(bbio, bioc, &smap, mirror_num)) in btrfs_submit_chunk()
705 ret = btrfs_bio_csum(bbio); in btrfs_submit_chunk()
709 ret = btrfs_alloc_dummy_sum(bbio); in btrfs_submit_chunk()
721 btrfs_cleanup_bio(bbio); in btrfs_submit_chunk()
729 void btrfs_submit_bio(struct btrfs_bio *bbio, int mirror_num) in btrfs_submit_bio() argument
732 ASSERT(bbio->inode || bbio->file_offset == 0); in btrfs_submit_bio()
734 while (!btrfs_submit_chunk(bbio, mirror_num)) in btrfs_submit_bio()
809 void btrfs_submit_repair_write(struct btrfs_bio *bbio, int mirror_num, bool dev_replace) in btrfs_submit_repair_write() argument
811 struct btrfs_fs_info *fs_info = bbio->fs_info; in btrfs_submit_repair_write()
812 u64 logical = bbio->bio.bi_iter.bi_sector << SECTOR_SHIFT; in btrfs_submit_repair_write()
813 u64 length = bbio->bio.bi_iter.bi_size; in btrfs_submit_repair_write()
819 ASSERT(btrfs_op(&bbio->bio) == BTRFS_MAP_WRITE); in btrfs_submit_repair_write()
820 ASSERT(!bbio->inode); in btrfs_submit_repair_write()
831 __btrfs_submit_bio(&bbio->bio, NULL, &smap, mirror_num); in btrfs_submit_repair_write()
836 btrfs_bio_end_io(bbio, errno_to_blk_status(ret)); in btrfs_submit_repair_write()