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