2022-11-15 10:44:05 +01:00
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright ( C ) 2007 Oracle . All rights reserved .
* Copyright ( C ) 2022 Christoph Hellwig .
*/
# ifndef BTRFS_BIO_H
# define BTRFS_BIO_H
# include <linux/bio.h>
# include <linux/workqueue.h>
# include "tree-checker.h"
struct btrfs_bio ;
struct btrfs_fs_info ;
# define BTRFS_BIO_INLINE_CSUM_SIZE 64
/*
* Maximum number of sectors for a single bio to limit the size of the
* checksum array . This matches the number of bio_vecs per bio and thus the
* I / O size for buffered I / O .
*/
# define BTRFS_MAX_BIO_SECTORS (256)
typedef void ( * btrfs_bio_end_io_t ) ( struct btrfs_bio * bbio ) ;
/*
2023-01-21 07:49:59 +01:00
* Highlevel btrfs I / O structure . It is allocated by btrfs_bio_alloc and
* passed to btrfs_submit_bio for mapping to the physical devices .
2022-11-15 10:44:05 +01:00
*/
struct btrfs_bio {
2023-03-23 17:01:20 +08:00
/*
* Inode and offset into it that this I / O operates on .
* Only set for data I / O .
*/
2023-01-21 07:50:00 +01:00
struct btrfs_inode * inode ;
2022-11-15 10:44:05 +01:00
u64 file_offset ;
union {
2023-01-21 07:50:13 +01:00
/*
2023-05-24 17:03:08 +02:00
* For data reads : checksumming and original I / O information .
* ( for internal use in the btrfs_submit_bio machinery only )
2023-01-21 07:50:13 +01:00
*/
2022-11-15 10:44:05 +01:00
struct {
u8 * csum ;
u8 csum_inline [ BTRFS_BIO_INLINE_CSUM_SIZE ] ;
2023-01-21 07:50:13 +01:00
struct bvec_iter saved_iter ;
2022-11-15 10:44:05 +01:00
} ;
2023-05-24 17:03:08 +02:00
/*
* For data writes :
2023-05-31 09:54:02 +02:00
* - ordered extent covering the bio
2023-05-24 17:03:08 +02:00
* - pointer to the checksums for this bio
* - original physical address from the allocator
* ( for zone append only )
*/
struct {
2023-05-31 09:54:02 +02:00
struct btrfs_ordered_extent * ordered ;
2023-05-24 17:03:08 +02:00
struct btrfs_ordered_sum * sums ;
u64 orig_physical ;
} ;
/* For metadata reads: parentness verification. */
2022-11-15 10:44:05 +01:00
struct btrfs_tree_parent_check parent_check ;
} ;
/* End I/O information supplied to btrfs_bio_alloc */
btrfs_bio_end_io_t end_io ;
void * private ;
2023-01-21 07:49:59 +01:00
/* For internal use in read end I/O handling */
2023-01-21 07:50:14 +01:00
unsigned int mirror_num ;
2023-01-21 07:50:20 +01:00
atomic_t pending_ios ;
2022-11-15 10:44:05 +01:00
struct work_struct end_io_work ;
2023-03-23 17:01:20 +08:00
/* File system that this I/O operates on. */
struct btrfs_fs_info * fs_info ;
2022-11-15 10:44:05 +01:00
/*
* This member must come last , bio_alloc_bioset will allocate enough
* bytes for entire btrfs_bio but relies on bio being last .
*/
struct bio bio ;
} ;
static inline struct btrfs_bio * btrfs_bio ( struct bio * bio )
{
return container_of ( bio , struct btrfs_bio , bio ) ;
}
int __init btrfs_bioset_init ( void ) ;
void __cold btrfs_bioset_exit ( void ) ;
2023-03-23 17:01:20 +08:00
void btrfs_bio_init ( struct btrfs_bio * bbio , struct btrfs_fs_info * fs_info ,
2023-01-21 07:50:21 +01:00
btrfs_bio_end_io_t end_io , void * private ) ;
2023-03-07 17:39:44 +01:00
struct btrfs_bio * btrfs_bio_alloc ( unsigned int nr_vecs , blk_opf_t opf ,
2023-03-23 17:01:20 +08:00
struct btrfs_fs_info * fs_info ,
2023-03-07 17:39:44 +01:00
btrfs_bio_end_io_t end_io , void * private ) ;
2023-05-31 09:54:02 +02:00
void btrfs_bio_end_io ( struct btrfs_bio * bbio , blk_status_t status ) ;
2022-11-15 10:44:05 +01:00
2023-03-27 09:49:51 +09:00
/* Submit using blkcg_punt_bio_submit. */
# define REQ_BTRFS_CGROUP_PUNT REQ_FS_PRIVATE
2023-03-07 17:39:39 +01:00
void btrfs_submit_bio ( struct btrfs_bio * bbio , int mirror_num ) ;
2023-03-20 10:12:49 +08:00
void btrfs_submit_repair_write ( struct btrfs_bio * bbio , int mirror_num , bool dev_replace ) ;
2022-11-15 10:44:05 +01:00
int btrfs_repair_io_failure ( struct btrfs_fs_info * fs_info , u64 ino , u64 start ,
u64 length , u64 logical , struct page * page ,
unsigned int pg_offset , int mirror_num ) ;
# endif