^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2007 Oracle. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef BTRFS_DISK_IO_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define BTRFS_DISK_IO_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define BTRFS_SUPER_INFO_OFFSET SZ_64K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define BTRFS_SUPER_INFO_SIZE 4096
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define BTRFS_SUPER_MIRROR_MAX 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define BTRFS_SUPER_MIRROR_SHIFT 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * Fixed blocksize for all devices, applies to specific ways of reading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * metadata like superblock. Must meet the set_blocksize requirements.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * Do not change.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define BTRFS_BDEV_BLOCKSIZE (4096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) enum btrfs_wq_endio_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) BTRFS_WQ_ENDIO_DATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) BTRFS_WQ_ENDIO_METADATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) BTRFS_WQ_ENDIO_FREE_SPACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) BTRFS_WQ_ENDIO_RAID56,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) static inline u64 btrfs_sb_offset(int mirror)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) u64 start = SZ_16K;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) if (mirror)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) return start << (BTRFS_SUPER_MIRROR_SHIFT * mirror);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) return BTRFS_SUPER_INFO_OFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct btrfs_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct btrfs_fs_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) void btrfs_check_leaked_roots(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) void btrfs_init_fs_info(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) int btrfs_verify_level_key(struct extent_buffer *eb, int level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct btrfs_key *first_key, u64 parent_transid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct extent_buffer *read_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) u64 parent_transid, int level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct btrfs_key *first_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) void readahead_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct extent_buffer *btrfs_find_create_tree_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) u64 bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) void btrfs_clean_tree_block(struct extent_buffer *buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) int __cold open_ctree(struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct btrfs_fs_devices *fs_devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) char *options);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) void __cold close_ctree(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct btrfs_super_block *btrfs_read_dev_super(struct block_device *bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct btrfs_super_block *btrfs_read_dev_one_super(struct block_device *bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) int copy_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) int btrfs_commit_super(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct btrfs_root *btrfs_read_tree_root(struct btrfs_root *tree_root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct btrfs_key *key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) int btrfs_insert_fs_root(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) void btrfs_free_fs_roots(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct btrfs_root *btrfs_get_fs_root(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) u64 objectid, bool check_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct btrfs_root *btrfs_get_new_fs_root(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) u64 objectid, dev_t anon_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct btrfs_root *btrfs_get_fs_root_commit_root(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) u64 objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) void btrfs_free_fs_info(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) int btrfs_cleanup_fs_roots(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) void btrfs_btree_balance_dirty(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) void btrfs_btree_balance_dirty_nodelay(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) void btrfs_drop_and_free_fs_root(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) int btrfs_validate_metadata_buffer(struct btrfs_io_bio *io_bio, u64 phy_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct page *page, u64 start, u64 end,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) int mirror);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) blk_status_t btrfs_submit_metadata_bio(struct inode *inode, struct bio *bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) int mirror_num, unsigned long bio_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct btrfs_root *btrfs_alloc_dummy_root(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * This function is used to grab the root, and avoid it is freed when we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * access it. But it doesn't ensure that the tree is not dropped.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * If you want to ensure the whole tree is safe, you should use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * fs_info->subvol_srcu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static inline struct btrfs_root *btrfs_grab_root(struct btrfs_root *root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) if (!root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) if (refcount_inc_not_zero(&root->refs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) return root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) void btrfs_put_root(struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) void btrfs_mark_buffer_dirty(struct extent_buffer *buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) int atomic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int btrfs_read_buffer(struct extent_buffer *buf, u64 parent_transid, int level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct btrfs_key *first_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) blk_status_t btrfs_bio_wq_end_io(struct btrfs_fs_info *info, struct bio *bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) enum btrfs_wq_endio_type metadata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) blk_status_t btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) int mirror_num, unsigned long bio_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) u64 bio_offset, void *private_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) extent_submit_bio_start_t *submit_bio_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) blk_status_t btrfs_submit_bio_done(void *private_data, struct bio *bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) int mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) void btrfs_cleanup_dirty_bgs(struct btrfs_transaction *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) void btrfs_cleanup_one_transaction(struct btrfs_transaction *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) u64 objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) int btree_lock_page_hook(struct page *page, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) void (*flush_fn)(void *));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) int btrfs_get_num_tolerated_disk_barrier_failures(u64 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) int __init btrfs_end_io_wq_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) void __cold btrfs_end_io_wq_exit(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #ifdef CONFIG_DEBUG_LOCK_ALLOC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) void btrfs_init_lockdep(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) void btrfs_set_buffer_lockdep_class(u64 objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) struct extent_buffer *eb, int level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) static inline void btrfs_init_lockdep(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) static inline void btrfs_set_buffer_lockdep_class(u64 objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) struct extent_buffer *eb, int level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #endif