Lines Matching refs:bbio

24 	struct btrfs_bio *bbio;  member
30 static inline bool is_data_bbio(const struct btrfs_bio *bbio) in is_data_bbio() argument
32 return bbio->inode && is_data_inode(bbio->inode); in is_data_bbio()
35 static bool bbio_has_ordered_extent(const struct btrfs_bio *bbio) in bbio_has_ordered_extent() argument
37 return is_data_bbio(bbio) && btrfs_op(&bbio->bio) == BTRFS_MAP_WRITE; in bbio_has_ordered_extent()
44 void btrfs_bio_init(struct btrfs_bio *bbio, struct btrfs_fs_info *fs_info, in btrfs_bio_init() argument
47 memset(bbio, 0, offsetof(struct btrfs_bio, bio)); in btrfs_bio_init()
48 bbio->fs_info = fs_info; in btrfs_bio_init()
49 bbio->end_io = end_io; in btrfs_bio_init()
50 bbio->private = private; in btrfs_bio_init()
51 atomic_set(&bbio->pending_ios, 1); in btrfs_bio_init()
52 WRITE_ONCE(bbio->status, BLK_STS_OK); 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
87 bbio = btrfs_bio(bio); in btrfs_split_bio()
88 btrfs_bio_init(bbio, fs_info, NULL, orig_bbio); in btrfs_split_bio()
89 bbio->inode = orig_bbio->inode; in btrfs_split_bio()
90 bbio->file_offset = orig_bbio->file_offset; in btrfs_split_bio()
92 if (bbio_has_ordered_extent(bbio)) { in btrfs_split_bio()
94 bbio->ordered = orig_bbio->ordered; in btrfs_split_bio()
97 return bbio; in btrfs_split_bio()
100 void btrfs_bio_end_io(struct btrfs_bio *bbio, blk_status_t status) in btrfs_bio_end_io() argument
102 bbio->bio.bi_status = status; in btrfs_bio_end_io()
103 if (bbio->bio.bi_pool == &btrfs_clone_bioset) { in btrfs_bio_end_io()
104 struct btrfs_bio *orig_bbio = bbio->private; in btrfs_bio_end_io()
107 if (bbio_has_ordered_extent(bbio)) in btrfs_bio_end_io()
108 btrfs_put_ordered_extent(bbio->ordered); in btrfs_bio_end_io()
109 bio_put(&bbio->bio); in btrfs_bio_end_io()
111 bbio = orig_bbio; in btrfs_bio_end_io()
119 cmpxchg(&bbio->status, BLK_STS_OK, status); in btrfs_bio_end_io()
121 if (atomic_dec_and_test(&bbio->pending_ios)) { in btrfs_bio_end_io()
124 bbio->bio.bi_status = READ_ONCE(bbio->status); in btrfs_bio_end_io()
126 if (bbio_has_ordered_extent(bbio)) { in btrfs_bio_end_io()
127 struct btrfs_ordered_extent *ordered = bbio->ordered; in btrfs_bio_end_io()
129 bbio->end_io(bbio); in btrfs_bio_end_io()
132 bbio->end_io(bbio); in btrfs_bio_end_io()
154 btrfs_bio_end_io(fbio->bbio, fbio->bbio->bio.bi_status); in btrfs_repair_done()
174 if (mirror == fbio->bbio->mirror_num) { in btrfs_end_repair_bio()
176 fbio->bbio->bio.bi_status = BLK_STS_IOERR; in btrfs_end_repair_bio()
190 } while (mirror != fbio->bbio->mirror_num); in btrfs_end_repair_bio()
230 fbio->bbio = failed_bbio; in repair_one_sector()
253 static void btrfs_check_read_bio(struct btrfs_bio *bbio, struct btrfs_device *dev) in btrfs_check_read_bio() argument
255 struct btrfs_inode *inode = bbio->inode; in btrfs_check_read_bio()
258 struct bvec_iter *iter = &bbio->saved_iter; in btrfs_check_read_bio()
259 blk_status_t status = bbio->bio.bi_status; in btrfs_check_read_bio()
270 if (bbio->bio.bi_pool == &btrfs_repair_bioset) { in btrfs_check_read_bio()
271 btrfs_end_repair_bio(bbio, dev); in btrfs_check_read_bio()
276 bbio->bio.bi_status = BLK_STS_OK; in btrfs_check_read_bio()
279 struct bio_vec bv = bio_iter_iovec(&bbio->bio, *iter); in btrfs_check_read_bio()
282 if (status || !btrfs_data_csum_ok(bbio, dev, offset, &bv)) in btrfs_check_read_bio()
283 fbio = repair_one_sector(bbio, offset, &bv, fbio); in btrfs_check_read_bio()
285 bio_advance_iter_single(&bbio->bio, iter, sectorsize); in btrfs_check_read_bio()
289 if (bbio->csum != bbio->csum_inline) in btrfs_check_read_bio()
290 kfree(bbio->csum); in btrfs_check_read_bio()
295 btrfs_bio_end_io(bbio, bbio->bio.bi_status); in btrfs_check_read_bio()
323 struct btrfs_bio *bbio = container_of(work, struct btrfs_bio, end_io_work); in btrfs_end_bio_work() local
326 if (is_data_bbio(bbio)) in btrfs_end_bio_work()
327 btrfs_check_read_bio(bbio, bbio->bio.bi_private); in btrfs_end_bio_work()
329 btrfs_bio_end_io(bbio, bbio->bio.bi_status); in btrfs_end_bio_work()
334 struct btrfs_bio *bbio = btrfs_bio(bio); in btrfs_simple_end_io() local
336 struct btrfs_fs_info *fs_info = bbio->fs_info; in btrfs_simple_end_io()
344 INIT_WORK(&bbio->end_io_work, btrfs_end_bio_work); in btrfs_simple_end_io()
345 queue_work(btrfs_end_io_wq(fs_info, bio), &bbio->end_io_work); in btrfs_simple_end_io()
348 btrfs_record_physical_zoned(bbio); in btrfs_simple_end_io()
349 btrfs_bio_end_io(bbio, bbio->bio.bi_status); in btrfs_simple_end_io()
356 struct btrfs_bio *bbio = btrfs_bio(bio); in btrfs_raid56_end_io() local
359 bbio->mirror_num = bioc->mirror_num; in btrfs_raid56_end_io()
360 if (bio_op(bio) == REQ_OP_READ && is_data_bbio(bbio)) in btrfs_raid56_end_io()
361 btrfs_check_read_bio(bbio, NULL); in btrfs_raid56_end_io()
363 btrfs_bio_end_io(bbio, bbio->bio.bi_status); in btrfs_raid56_end_io()
372 struct btrfs_bio *bbio = btrfs_bio(bio); in btrfs_orig_write_end_io() local
393 btrfs_bio_end_io(bbio, bbio->bio.bi_status); in btrfs_orig_write_end_io()
509 static int btrfs_bio_csum(struct btrfs_bio *bbio) in btrfs_bio_csum() argument
511 if (bbio->bio.bi_opf & REQ_META) in btrfs_bio_csum()
512 return btree_csum_one_bio(bbio); in btrfs_bio_csum()
513 return btrfs_csum_one_bio(bbio); in btrfs_bio_csum()
521 struct btrfs_bio *bbio; member
542 ret = btrfs_bio_csum(async->bbio); in run_one_async_start()
544 async->bbio->bio.bi_status = errno_to_blk_status(ret); in run_one_async_start()
561 struct bio *bio = &async->bbio->bio; in run_one_async_done()
570 btrfs_bio_end_io(async->bbio, bio->bi_status); in run_one_async_done()
583 static bool should_async_write(struct btrfs_bio *bbio) in should_async_write() argument
588 struct btrfs_fs_devices *fs_devices = bbio->fs_info->fs_devices; in should_async_write()
598 if (auto_csum_mode && test_bit(BTRFS_FS_CSUM_IMPL_FAST, &bbio->fs_info->flags)) in should_async_write()
605 if (op_is_sync(bbio->bio.bi_opf)) in should_async_write()
609 if ((bbio->bio.bi_opf & REQ_META) && btrfs_is_zoned(bbio->fs_info)) in should_async_write()
620 static bool btrfs_wq_submit_bio(struct btrfs_bio *bbio, in btrfs_wq_submit_bio() argument
624 struct btrfs_fs_info *fs_info = bbio->fs_info; in btrfs_wq_submit_bio()
631 async->bbio = bbio; in btrfs_wq_submit_bio()
641 static u64 btrfs_append_map_length(struct btrfs_bio *bbio, u64 map_length) in btrfs_append_map_length() argument
646 map_length = min(map_length, bbio->fs_info->max_zone_append_size); in btrfs_append_map_length()
647 sector_offset = bio_split_rw_at(&bbio->bio, &bbio->fs_info->limits, in btrfs_append_map_length()
655 return ALIGN_DOWN(sector_offset << SECTOR_SHIFT, bbio->fs_info->sectorsize); in btrfs_append_map_length()
660 static bool btrfs_submit_chunk(struct btrfs_bio *bbio, int mirror_num) in btrfs_submit_chunk() argument
662 struct btrfs_inode *inode = bbio->inode; in btrfs_submit_chunk()
663 struct btrfs_fs_info *fs_info = bbio->fs_info; in btrfs_submit_chunk()
664 struct bio *bio = &bbio->bio; in btrfs_submit_chunk()
668 bool use_append = btrfs_use_zone_append(bbio); in btrfs_submit_chunk()
674 if (!bbio->inode || btrfs_is_data_reloc_root(inode->root)) in btrfs_submit_chunk()
690 map_length = btrfs_append_map_length(bbio, map_length); in btrfs_submit_chunk()
695 split = btrfs_split_bio(fs_info, bbio, map_length); in btrfs_submit_chunk()
701 bbio = split; in btrfs_submit_chunk()
702 bio = &bbio->bio; in btrfs_submit_chunk()
709 if (bio_op(bio) == REQ_OP_READ && is_data_bbio(bbio)) { in btrfs_submit_chunk()
710 bbio->saved_iter = bio->bi_iter; in btrfs_submit_chunk()
711 ret = btrfs_lookup_bio_sums(bbio); in btrfs_submit_chunk()
723 if (is_data_bbio(bbio) && bioc && bioc->use_rst) { in btrfs_submit_chunk()
731 list_add_tail(&bioc->rst_ordered_entry, &bbio->ordered->bioc_list); in btrfs_submit_chunk()
741 if (should_async_write(bbio) && in btrfs_submit_chunk()
742 btrfs_wq_submit_bio(bbio, bioc, &smap, mirror_num)) in btrfs_submit_chunk()
745 ret = btrfs_bio_csum(bbio); in btrfs_submit_chunk()
752 ret = btrfs_alloc_dummy_sum(bbio); in btrfs_submit_chunk()
770 struct btrfs_bio *remaining = bbio->private; in btrfs_submit_chunk()
772 ASSERT(bbio->bio.bi_pool == &btrfs_clone_bioset); in btrfs_submit_chunk()
778 btrfs_bio_end_io(bbio, status); in btrfs_submit_chunk()
783 void btrfs_submit_bbio(struct btrfs_bio *bbio, int mirror_num) in btrfs_submit_bbio() argument
786 ASSERT(bbio->inode || bbio->file_offset == 0); in btrfs_submit_bbio()
788 while (!btrfs_submit_chunk(bbio, mirror_num)) in btrfs_submit_bbio()
860 void btrfs_submit_repair_write(struct btrfs_bio *bbio, int mirror_num, bool dev_replace) in btrfs_submit_repair_write() argument
862 struct btrfs_fs_info *fs_info = bbio->fs_info; in btrfs_submit_repair_write()
863 u64 logical = bbio->bio.bi_iter.bi_sector << SECTOR_SHIFT; in btrfs_submit_repair_write()
864 u64 length = bbio->bio.bi_iter.bi_size; in btrfs_submit_repair_write()
870 ASSERT(btrfs_op(&bbio->bio) == BTRFS_MAP_WRITE); in btrfs_submit_repair_write()
871 ASSERT(!bbio->inode); in btrfs_submit_repair_write()
882 btrfs_submit_bio(&bbio->bio, NULL, &smap, mirror_num); in btrfs_submit_repair_write()
887 btrfs_bio_end_io(bbio, errno_to_blk_status(ret)); in btrfs_submit_repair_write()