2018-04-03 20:16:55 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
2007-06-12 17:07:21 +04:00
/*
* Copyright ( C ) 2007 Oracle . All rights reserved .
*/
2018-04-03 20:16:55 +03:00
# ifndef BTRFS_DISK_IO_H
# define BTRFS_DISK_IO_H
2007-02-02 17:18:22 +03:00
2015-12-14 19:42:10 +03:00
# define BTRFS_SUPER_INFO_OFFSET SZ_64K
2008-04-11 00:19:33 +04:00
# define BTRFS_SUPER_INFO_SIZE 4096
2008-12-09 00:46:26 +03:00
# define BTRFS_SUPER_MIRROR_MAX 3
# define BTRFS_SUPER_MIRROR_SHIFT 12
2017-06-16 02:48:05 +03: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 02:25:45 +04:00
enum btrfs_wq_endio_type {
2013-01-30 03:40:14 +04:00
BTRFS_WQ_ENDIO_DATA = 0 ,
BTRFS_WQ_ENDIO_METADATA = 1 ,
BTRFS_WQ_ENDIO_FREE_SPACE = 2 ,
BTRFS_WQ_ENDIO_RAID56 = 3 ,
2014-09-12 14:44:03 +04:00
BTRFS_WQ_ENDIO_DIO_REPAIR = 4 ,
2013-01-30 03:40:14 +04:00
} ;
2008-12-09 00:46:26 +03:00
static inline u64 btrfs_sb_offset ( int mirror )
{
2015-12-14 19:42:10 +03:00
u64 start = SZ_16K ;
2008-12-09 00:46:26 +03:00
if ( mirror )
return start < < ( BTRFS_SUPER_MIRROR_SHIFT * mirror ) ;
return BTRFS_SUPER_INFO_OFFSET ;
}
2008-03-24 22:01:56 +03:00
struct btrfs_device ;
2008-03-24 22:02:07 +03:00
struct btrfs_fs_devices ;
2007-03-22 19:13:20 +03:00
2018-03-29 04:08:11 +03: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-23 01:54:24 +03: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 16:25:41 +04:00
int mirror_num , struct extent_buffer * * eb ) ;
2016-06-23 01:54:24 +03:00
struct extent_buffer * btrfs_find_create_tree_block (
struct btrfs_fs_info * fs_info ,
u64 bytenr ) ;
2017-02-10 20:47:57 +03:00
void clean_tree_block ( struct btrfs_fs_info * fs_info , struct extent_buffer * buf ) ;
2011-11-17 10:10:02 +04:00
int open_ctree ( struct super_block * sb ,
struct btrfs_fs_devices * fs_devices ,
char * options ) ;
2016-06-22 04:16:51 +03:00
void close_ctree ( struct btrfs_fs_info * fs_info ) ;
2017-02-10 21:04:32 +03:00
int write_all_supers ( struct btrfs_fs_info * fs_info , int max_mirrors ) ;
2008-12-09 00:46:26 +03:00
struct buffer_head * btrfs_read_dev_super ( struct block_device * bdev ) ;
2015-08-14 13:32:58 +03:00
int btrfs_read_dev_one_super ( struct block_device * bdev , int copy_num ,
struct buffer_head * * bh_ret ) ;
2016-06-22 04:16:51 +03:00
int btrfs_commit_super ( struct btrfs_fs_info * fs_info ) ;
2013-05-15 11:48:19 +04: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-18 04:58:33 +03:00
struct btrfs_root * btrfs_lookup_fs_root ( struct btrfs_fs_info * fs_info ,
u64 root_id ) ;
2013-05-15 11:48:19 +04:00
int btrfs_insert_fs_root ( struct btrfs_fs_info * fs_info ,
struct btrfs_root * root ) ;
2014-05-08 01:06:09 +04:00
void btrfs_free_fs_roots ( struct btrfs_fs_info * fs_info ) ;
2013-09-25 17:47:44 +04: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 22:34:12 +03:00
int btrfs_cleanup_fs_roots ( struct btrfs_fs_info * fs_info ) ;
2016-06-23 01:54:24 +03: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 11:48:19 +04: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 11:48:20 +04:00
2013-09-20 00:07:01 +04:00
# ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
2016-06-15 16:22:56 +03:00
struct btrfs_root * btrfs_alloc_dummy_root ( struct btrfs_fs_info * fs_info ) ;
2013-09-20 00:07:01 +04:00
# endif
2013-05-15 11:48:20 +04: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 11:55:18 +03:00
if ( refcount_inc_not_zero ( & root - > refs ) )
2013-05-15 11:48:20 +04:00
return root ;
return NULL ;
}
static inline void btrfs_put_fs_root ( struct btrfs_root * root )
{
2017-03-03 11:55:18 +03:00
if ( refcount_dec_and_test ( & root - > refs ) )
2013-05-15 11:48:20 +04:00
kfree ( root ) ;
}
2007-10-16 00:14:19 +04:00
void btrfs_mark_buffer_dirty ( struct extent_buffer * buf ) ;
2012-05-06 15:23:47 +04:00
int btrfs_buffer_uptodate ( struct extent_buffer * buf , u64 parent_transid ,
int atomic ) ;
2018-03-29 04:08:11 +03:00
int btrfs_read_buffer ( struct extent_buffer * buf , u64 parent_transid , int level ,
struct btrfs_key * first_key ) ;
2017-02-14 20:03:49 +03:00
u32 btrfs_csum_data ( const char * data , u32 seed , size_t len ) ;
2016-10-27 10:52:33 +03:00
void btrfs_csum_final ( u32 crc , u8 * result ) ;
2017-06-03 10:38:06 +03:00
blk_status_t btrfs_bio_wq_end_io ( struct btrfs_fs_info * info , struct bio * bio ,
2014-07-30 02:25:45 +04:00
enum btrfs_wq_endio_type metadata ) ;
2017-07-06 02:41:23 +03:00
blk_status_t btrfs_wq_submit_bio ( struct btrfs_fs_info * fs_info , struct bio * bio ,
2017-05-05 18:57:13 +03:00
int mirror_num , unsigned long bio_flags ,
u64 bio_offset , void * private_data ,
2018-07-18 18:36:24 +03: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-06 00:13:11 +04:00
int btrfs_write_tree_block ( struct extent_buffer * buf ) ;
2017-05-25 13:39:52 +03:00
void btrfs_wait_tree_block_writeback ( struct extent_buffer * buf ) ;
2008-09-06 00:13:11 +04:00
int btrfs_init_log_root_tree ( struct btrfs_trans_handle * trans ,
struct btrfs_fs_info * fs_info ) ;
2009-01-21 20:54:03 +03:00
int btrfs_add_log_tree ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ) ;
2016-07-21 03:44:12 +03:00
void btrfs_cleanup_dirty_bgs ( struct btrfs_transaction * trans ,
2016-06-23 01:54:24 +03:00
struct btrfs_fs_info * fs_info ) ;
2012-03-01 20:24:58 +04:00
void btrfs_cleanup_one_transaction ( struct btrfs_transaction * trans ,
2016-06-23 01:54:24 +03:00
struct btrfs_fs_info * fs_info ) ;
2011-09-13 14:44:20 +04: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 05:09:57 +03: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 10:54:15 +03:00
int btrfs_get_num_tolerated_disk_barrier_failures ( u64 flags ) ;
2014-07-30 02:55:42 +04:00
int __init btrfs_end_io_wq_init ( void ) ;
2018-02-19 19:24:18 +03:00
void __cold btrfs_end_io_wq_exit ( void ) ;
2009-02-12 22:09:45 +03:00
# ifdef CONFIG_DEBUG_LOCK_ALLOC
2011-07-27 00: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 22:09:45 +03:00
# else
2011-07-27 00: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 22:09:45 +03:00
{
}
# endif
2018-04-03 20:16:55 +03:00
2007-02-02 17:18:22 +03:00
# endif