162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2007 Oracle. All rights reserved. 462306a36Sopenharmony_ci * Copyright (C) 2022 Christoph Hellwig. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef BTRFS_BIO_H 862306a36Sopenharmony_ci#define BTRFS_BIO_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/bio.h> 1162306a36Sopenharmony_ci#include <linux/workqueue.h> 1262306a36Sopenharmony_ci#include "tree-checker.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistruct btrfs_bio; 1562306a36Sopenharmony_cistruct btrfs_fs_info; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define BTRFS_BIO_INLINE_CSUM_SIZE 64 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* 2062306a36Sopenharmony_ci * Maximum number of sectors for a single bio to limit the size of the 2162306a36Sopenharmony_ci * checksum array. This matches the number of bio_vecs per bio and thus the 2262306a36Sopenharmony_ci * I/O size for buffered I/O. 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ci#define BTRFS_MAX_BIO_SECTORS (256) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_citypedef void (*btrfs_bio_end_io_t)(struct btrfs_bio *bbio); 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* 2962306a36Sopenharmony_ci * Highlevel btrfs I/O structure. It is allocated by btrfs_bio_alloc and 3062306a36Sopenharmony_ci * passed to btrfs_submit_bio for mapping to the physical devices. 3162306a36Sopenharmony_ci */ 3262306a36Sopenharmony_cistruct btrfs_bio { 3362306a36Sopenharmony_ci /* 3462306a36Sopenharmony_ci * Inode and offset into it that this I/O operates on. 3562306a36Sopenharmony_ci * Only set for data I/O. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ci struct btrfs_inode *inode; 3862306a36Sopenharmony_ci u64 file_offset; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci union { 4162306a36Sopenharmony_ci /* 4262306a36Sopenharmony_ci * For data reads: checksumming and original I/O information. 4362306a36Sopenharmony_ci * (for internal use in the btrfs_submit_bio machinery only) 4462306a36Sopenharmony_ci */ 4562306a36Sopenharmony_ci struct { 4662306a36Sopenharmony_ci u8 *csum; 4762306a36Sopenharmony_ci u8 csum_inline[BTRFS_BIO_INLINE_CSUM_SIZE]; 4862306a36Sopenharmony_ci struct bvec_iter saved_iter; 4962306a36Sopenharmony_ci }; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci /* 5262306a36Sopenharmony_ci * For data writes: 5362306a36Sopenharmony_ci * - ordered extent covering the bio 5462306a36Sopenharmony_ci * - pointer to the checksums for this bio 5562306a36Sopenharmony_ci * - original physical address from the allocator 5662306a36Sopenharmony_ci * (for zone append only) 5762306a36Sopenharmony_ci */ 5862306a36Sopenharmony_ci struct { 5962306a36Sopenharmony_ci struct btrfs_ordered_extent *ordered; 6062306a36Sopenharmony_ci struct btrfs_ordered_sum *sums; 6162306a36Sopenharmony_ci u64 orig_physical; 6262306a36Sopenharmony_ci }; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci /* For metadata reads: parentness verification. */ 6562306a36Sopenharmony_ci struct btrfs_tree_parent_check parent_check; 6662306a36Sopenharmony_ci }; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci /* End I/O information supplied to btrfs_bio_alloc */ 6962306a36Sopenharmony_ci btrfs_bio_end_io_t end_io; 7062306a36Sopenharmony_ci void *private; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci /* For internal use in read end I/O handling */ 7362306a36Sopenharmony_ci unsigned int mirror_num; 7462306a36Sopenharmony_ci atomic_t pending_ios; 7562306a36Sopenharmony_ci struct work_struct end_io_work; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci /* File system that this I/O operates on. */ 7862306a36Sopenharmony_ci struct btrfs_fs_info *fs_info; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci /* 8162306a36Sopenharmony_ci * This member must come last, bio_alloc_bioset will allocate enough 8262306a36Sopenharmony_ci * bytes for entire btrfs_bio but relies on bio being last. 8362306a36Sopenharmony_ci */ 8462306a36Sopenharmony_ci struct bio bio; 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic inline struct btrfs_bio *btrfs_bio(struct bio *bio) 8862306a36Sopenharmony_ci{ 8962306a36Sopenharmony_ci return container_of(bio, struct btrfs_bio, bio); 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ciint __init btrfs_bioset_init(void); 9362306a36Sopenharmony_civoid __cold btrfs_bioset_exit(void); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_civoid btrfs_bio_init(struct btrfs_bio *bbio, struct btrfs_fs_info *fs_info, 9662306a36Sopenharmony_ci btrfs_bio_end_io_t end_io, void *private); 9762306a36Sopenharmony_cistruct btrfs_bio *btrfs_bio_alloc(unsigned int nr_vecs, blk_opf_t opf, 9862306a36Sopenharmony_ci struct btrfs_fs_info *fs_info, 9962306a36Sopenharmony_ci btrfs_bio_end_io_t end_io, void *private); 10062306a36Sopenharmony_civoid btrfs_bio_end_io(struct btrfs_bio *bbio, blk_status_t status); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* Submit using blkcg_punt_bio_submit. */ 10362306a36Sopenharmony_ci#define REQ_BTRFS_CGROUP_PUNT REQ_FS_PRIVATE 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_civoid btrfs_submit_bio(struct btrfs_bio *bbio, int mirror_num); 10662306a36Sopenharmony_civoid btrfs_submit_repair_write(struct btrfs_bio *bbio, int mirror_num, bool dev_replace); 10762306a36Sopenharmony_ciint btrfs_repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start, 10862306a36Sopenharmony_ci u64 length, u64 logical, struct page *page, 10962306a36Sopenharmony_ci unsigned int pg_offset, int mirror_num); 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#endif 112