2018-04-03 19:16:55 +02:00
/* SPDX-License-Identifier: GPL-2.0 */
2007-06-12 09:07:21 -04:00
/*
* Copyright ( C ) 2007 Oracle . All rights reserved .
*/
2018-04-03 19:16:55 +02:00
# ifndef BTRFS_DISK_IO_H
# define BTRFS_DISK_IO_H
2007-02-02 09:18:22 -05:00
2015-12-15 01:42:10 +09:00
# define BTRFS_SUPER_INFO_OFFSET SZ_64K
2008-04-10 16:19:33 -04:00
# define BTRFS_SUPER_INFO_SIZE 4096
2008-12-08 16:46:26 -05:00
# define BTRFS_SUPER_MIRROR_MAX 3
# define BTRFS_SUPER_MIRROR_SHIFT 12
2017-06-16 01:48:05 +02:00
/*
* Fixed blocksize for all devices , applies to specific ways of reading
* metadata like superblock . Must meet the set_blocksize requirements .
*
* Do not change .
*/
# define BTRFS_BDEV_BLOCKSIZE (4096)
2014-07-30 00:25:45 +02:00
enum btrfs_wq_endio_type {
2018-11-27 15:25:13 +01:00
BTRFS_WQ_ENDIO_DATA ,
BTRFS_WQ_ENDIO_METADATA ,
BTRFS_WQ_ENDIO_FREE_SPACE ,
BTRFS_WQ_ENDIO_RAID56 ,
BTRFS_WQ_ENDIO_DIO_REPAIR ,
2013-01-29 18:40:14 -05:00
} ;
2008-12-08 16:46:26 -05:00
static inline u64 btrfs_sb_offset ( int mirror )
{
2015-12-15 01:42:10 +09:00
u64 start = SZ_16K ;
2008-12-08 16:46:26 -05:00
if ( mirror )
return start < < ( BTRFS_SUPER_MIRROR_SHIFT * mirror ) ;
return BTRFS_SUPER_INFO_OFFSET ;
}
2008-03-24 15:01:56 -04:00
struct btrfs_device ;
2008-03-24 15:02:07 -04:00
struct btrfs_fs_devices ;
2007-03-22 12:13:20 -04:00
2018-03-29 09:08:11 +08:00
struct extent_buffer * read_tree_block ( struct btrfs_fs_info * fs_info , u64 bytenr ,
u64 parent_transid , int level ,
struct btrfs_key * first_key ) ;
2016-06-22 18:54:24 -04:00
void readahead_tree_block ( struct btrfs_fs_info * fs_info , u64 bytenr ) ;
int reada_tree_block_flagged ( struct btrfs_fs_info * fs_info , u64 bytenr ,
2011-05-23 14:25:41 +02:00
int mirror_num , struct extent_buffer * * eb ) ;
2016-06-22 18:54:24 -04:00
struct extent_buffer * btrfs_find_create_tree_block (
struct btrfs_fs_info * fs_info ,
u64 bytenr ) ;
2017-02-10 18:47:57 +01:00
void clean_tree_block ( struct btrfs_fs_info * fs_info , struct extent_buffer * buf ) ;
2011-11-17 01:10:02 -05:00
int open_ctree ( struct super_block * sb ,
struct btrfs_fs_devices * fs_devices ,
char * options ) ;
2016-06-21 21:16:51 -04:00
void close_ctree ( struct btrfs_fs_info * fs_info ) ;
2017-02-10 19:04:32 +01:00
int write_all_supers ( struct btrfs_fs_info * fs_info , int max_mirrors ) ;
2008-12-08 16:46:26 -05:00
struct buffer_head * btrfs_read_dev_super ( struct block_device * bdev ) ;
2015-08-14 18:32:58 +08:00
int btrfs_read_dev_one_super ( struct block_device * bdev , int copy_num ,
struct buffer_head * * bh_ret ) ;
2016-06-21 21:16:51 -04:00
int btrfs_commit_super ( struct btrfs_fs_info * fs_info ) ;
2013-05-15 07:48:19 +00:00
struct btrfs_root * btrfs_read_fs_root ( struct btrfs_root * tree_root ,
struct btrfs_key * location ) ;
int btrfs_init_fs_root ( struct btrfs_root * root ) ;
2016-08-17 21:58:33 -04:00
struct btrfs_root * btrfs_lookup_fs_root ( struct btrfs_fs_info * fs_info ,
u64 root_id ) ;
2013-05-15 07:48:19 +00:00
int btrfs_insert_fs_root ( struct btrfs_fs_info * fs_info ,
struct btrfs_root * root ) ;
2014-05-07 17:06:09 -04:00
void btrfs_free_fs_roots ( struct btrfs_fs_info * fs_info ) ;
2013-09-25 21:47:44 +08:00
struct btrfs_root * btrfs_get_fs_root ( struct btrfs_fs_info * fs_info ,
struct btrfs_key * key ,
bool check_ref ) ;
static inline struct btrfs_root *
btrfs_read_fs_root_no_name ( struct btrfs_fs_info * fs_info ,
struct btrfs_key * location )
{
return btrfs_get_fs_root ( fs_info , location , true ) ;
}
2008-11-12 14:34:12 -05:00
int btrfs_cleanup_fs_roots ( struct btrfs_fs_info * fs_info ) ;
2016-06-22 18:54:24 -04:00
void btrfs_btree_balance_dirty ( struct btrfs_fs_info * fs_info ) ;
void btrfs_btree_balance_dirty_nodelay ( struct btrfs_fs_info * fs_info ) ;
2013-05-15 07:48:19 +00:00
void btrfs_drop_and_free_fs_root ( struct btrfs_fs_info * fs_info ,
struct btrfs_root * root ) ;
void btrfs_free_fs_root ( struct btrfs_root * root ) ;
2013-05-15 07:48:20 +00:00
2013-09-19 16:07:01 -04:00
# ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
2016-06-15 09:22:56 -04:00
struct btrfs_root * btrfs_alloc_dummy_root ( struct btrfs_fs_info * fs_info ) ;
2013-09-19 16:07:01 -04:00
# endif
2013-05-15 07:48:20 +00:00
/*
* This function is used to grab the root , and avoid it is freed when we
* access it . But it doesn ' t ensure that the tree is not dropped .
*
* If you want to ensure the whole tree is safe , you should use
* fs_info - > subvol_srcu
*/
static inline struct btrfs_root * btrfs_grab_fs_root ( struct btrfs_root * root )
{
2017-03-03 10:55:18 +02:00
if ( refcount_inc_not_zero ( & root - > refs ) )
2013-05-15 07:48:20 +00:00
return root ;
return NULL ;
}
static inline void btrfs_put_fs_root ( struct btrfs_root * root )
{
2017-03-03 10:55:18 +02:00
if ( refcount_dec_and_test ( & root - > refs ) )
2013-05-15 07:48:20 +00:00
kfree ( root ) ;
}
2007-10-15 16:14:19 -04:00
void btrfs_mark_buffer_dirty ( struct extent_buffer * buf ) ;
2012-05-06 07:23:47 -04:00
int btrfs_buffer_uptodate ( struct extent_buffer * buf , u64 parent_transid ,
int atomic ) ;
2018-03-29 09:08:11 +08:00
int btrfs_read_buffer ( struct extent_buffer * buf , u64 parent_transid , int level ,
struct btrfs_key * first_key ) ;
2017-02-14 18:03:49 +01:00
u32 btrfs_csum_data ( const char * data , u32 seed , size_t len ) ;
2016-10-27 08:52:33 +01:00
void btrfs_csum_final ( u32 crc , u8 * result ) ;
2017-06-03 09:38:06 +02:00
blk_status_t btrfs_bio_wq_end_io ( struct btrfs_fs_info * info , struct bio * bio ,
2014-07-30 00:25:45 +02:00
enum btrfs_wq_endio_type metadata ) ;
2017-07-05 16:41:23 -07:00
blk_status_t btrfs_wq_submit_bio ( struct btrfs_fs_info * fs_info , struct bio * bio ,
2017-05-05 11:57:13 -04:00
int mirror_num , unsigned long bio_flags ,
u64 bio_offset , void * private_data ,
2018-07-18 17:36:24 +02:00
extent_submit_bio_start_t * submit_bio_start ) ;
blk_status_t btrfs_submit_bio_done ( void * private_data , struct bio * bio ,
int mirror_num ) ;
2008-09-05 16:13:11 -04:00
int btrfs_write_tree_block ( struct extent_buffer * buf ) ;
2017-05-25 06:39:52 -04:00
void btrfs_wait_tree_block_writeback ( struct extent_buffer * buf ) ;
2008-09-05 16:13:11 -04:00
int btrfs_init_log_root_tree ( struct btrfs_trans_handle * trans ,
struct btrfs_fs_info * fs_info ) ;
2009-01-21 12:54:03 -05:00
int btrfs_add_log_tree ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ) ;
2016-07-20 17:44:12 -07:00
void btrfs_cleanup_dirty_bgs ( struct btrfs_transaction * trans ,
2016-06-22 18:54:24 -04:00
struct btrfs_fs_info * fs_info ) ;
2012-03-01 17:24:58 +01:00
void btrfs_cleanup_one_transaction ( struct btrfs_transaction * trans ,
2016-06-22 18:54:24 -04:00
struct btrfs_fs_info * fs_info ) ;
2011-09-13 12:44:20 +02:00
struct btrfs_root * btrfs_create_tree ( struct btrfs_trans_handle * trans ,
struct btrfs_fs_info * fs_info ,
u64 objectid ) ;
int btree_lock_page_hook ( struct page * page , void * data ,
void ( * flush_fn ) ( void * ) ) ;
2017-06-23 04:09:57 +02:00
struct extent_map * btree_get_extent ( struct btrfs_inode * inode ,
struct page * page , size_t pg_offset , u64 start , u64 len ,
int create ) ;
2015-08-19 15:54:15 +08:00
int btrfs_get_num_tolerated_disk_barrier_failures ( u64 flags ) ;
2014-07-30 00:55:42 +02:00
int __init btrfs_end_io_wq_init ( void ) ;
2018-02-19 17:24:18 +01:00
void __cold btrfs_end_io_wq_exit ( void ) ;
2009-02-12 14:09:45 -05:00
# ifdef CONFIG_DEBUG_LOCK_ALLOC
2011-07-26 16:11:19 -04:00
void btrfs_init_lockdep ( void ) ;
void btrfs_set_buffer_lockdep_class ( u64 objectid ,
struct extent_buffer * eb , int level ) ;
2009-02-12 14:09:45 -05:00
# else
2011-07-26 16:11:19 -04:00
static inline void btrfs_init_lockdep ( void )
{ }
static inline void btrfs_set_buffer_lockdep_class ( u64 objectid ,
struct extent_buffer * eb , int level )
2009-02-12 14:09:45 -05:00
{
}
# endif
2018-04-03 19:16:55 +02:00
2007-02-02 09:18:22 -05:00
# endif