1a0231804SJosef Bacik /* SPDX-License-Identifier: GPL-2.0 */ 2a0231804SJosef Bacik 3a0231804SJosef Bacik #ifndef BTRFS_EXTENT_TREE_H 4a0231804SJosef Bacik #define BTRFS_EXTENT_TREE_H 5a0231804SJosef Bacik 6cfc2de0fSBoris Burkov #include "misc.h" 7cfc2de0fSBoris Burkov #include "block-group.h" 8cfc2de0fSBoris Burkov 9cfc2de0fSBoris Burkov struct btrfs_free_cluster; 10cfc2de0fSBoris Burkov 11cfc2de0fSBoris Burkov enum btrfs_extent_allocation_policy { 12cfc2de0fSBoris Burkov BTRFS_EXTENT_ALLOC_CLUSTERED, 13cfc2de0fSBoris Burkov BTRFS_EXTENT_ALLOC_ZONED, 14cfc2de0fSBoris Burkov }; 15cfc2de0fSBoris Burkov 16cfc2de0fSBoris Burkov struct find_free_extent_ctl { 17cfc2de0fSBoris Burkov /* Basic allocation info */ 18cfc2de0fSBoris Burkov u64 ram_bytes; 19cfc2de0fSBoris Burkov u64 num_bytes; 20cfc2de0fSBoris Burkov u64 min_alloc_size; 21cfc2de0fSBoris Burkov u64 empty_size; 22cfc2de0fSBoris Burkov u64 flags; 23cfc2de0fSBoris Burkov int delalloc; 24cfc2de0fSBoris Burkov 25cfc2de0fSBoris Burkov /* Where to start the search inside the bg */ 26cfc2de0fSBoris Burkov u64 search_start; 27cfc2de0fSBoris Burkov 28cfc2de0fSBoris Burkov /* For clustered allocation */ 29cfc2de0fSBoris Burkov u64 empty_cluster; 30cfc2de0fSBoris Burkov struct btrfs_free_cluster *last_ptr; 31cfc2de0fSBoris Burkov bool use_cluster; 32cfc2de0fSBoris Burkov 33cfc2de0fSBoris Burkov bool have_caching_bg; 34cfc2de0fSBoris Burkov bool orig_have_caching_bg; 35cfc2de0fSBoris Burkov 36cfc2de0fSBoris Burkov /* Allocation is called for tree-log */ 37cfc2de0fSBoris Burkov bool for_treelog; 38cfc2de0fSBoris Burkov 39cfc2de0fSBoris Burkov /* Allocation is called for data relocation */ 40cfc2de0fSBoris Burkov bool for_data_reloc; 41cfc2de0fSBoris Burkov 42cfc2de0fSBoris Burkov /* RAID index, converted from flags */ 43cfc2de0fSBoris Burkov int index; 44cfc2de0fSBoris Burkov 45cfc2de0fSBoris Burkov /* 46cfc2de0fSBoris Burkov * Current loop number, check find_free_extent_update_loop() for details 47cfc2de0fSBoris Burkov */ 48cfc2de0fSBoris Burkov int loop; 49cfc2de0fSBoris Burkov 50cfc2de0fSBoris Burkov /* 51cd361199SJosef Bacik * Set to true if we're retrying the allocation on this block group 52cd361199SJosef Bacik * after waiting for caching progress, this is so that we retry only 53cd361199SJosef Bacik * once before moving on to another block group. 54cfc2de0fSBoris Burkov */ 55cd361199SJosef Bacik bool retry_uncached; 56cfc2de0fSBoris Burkov 57cfc2de0fSBoris Burkov /* If current block group is cached */ 58cfc2de0fSBoris Burkov int cached; 59cfc2de0fSBoris Burkov 60cfc2de0fSBoris Burkov /* Max contiguous hole found */ 61cfc2de0fSBoris Burkov u64 max_extent_size; 62cfc2de0fSBoris Burkov 63cfc2de0fSBoris Burkov /* Total free space from free space cache, not always contiguous */ 64cfc2de0fSBoris Burkov u64 total_free_space; 65cfc2de0fSBoris Burkov 66cfc2de0fSBoris Burkov /* Found result */ 67cfc2de0fSBoris Burkov u64 found_offset; 68cfc2de0fSBoris Burkov 69cfc2de0fSBoris Burkov /* Hint where to start looking for an empty space */ 70cfc2de0fSBoris Burkov u64 hint_byte; 71cfc2de0fSBoris Burkov 72cfc2de0fSBoris Burkov /* Allocation policy */ 73cfc2de0fSBoris Burkov enum btrfs_extent_allocation_policy policy; 74854c2f36SBoris Burkov 75854c2f36SBoris Burkov /* Whether or not the allocator is currently following a hint */ 76854c2f36SBoris Burkov bool hinted; 7752bb7a21SBoris Burkov 7852bb7a21SBoris Burkov /* Size class of block groups to prefer in early loops */ 7952bb7a21SBoris Burkov enum btrfs_block_group_size_class size_class; 80cfc2de0fSBoris Burkov }; 81cfc2de0fSBoris Burkov 82a0231804SJosef Bacik enum btrfs_inline_ref_type { 83a0231804SJosef Bacik BTRFS_REF_TYPE_INVALID, 84a0231804SJosef Bacik BTRFS_REF_TYPE_BLOCK, 85a0231804SJosef Bacik BTRFS_REF_TYPE_DATA, 86a0231804SJosef Bacik BTRFS_REF_TYPE_ANY, 87a0231804SJosef Bacik }; 88a0231804SJosef Bacik 89a0231804SJosef Bacik int btrfs_get_extent_inline_ref_type(const struct extent_buffer *eb, 90a0231804SJosef Bacik struct btrfs_extent_inline_ref *iref, 91a0231804SJosef Bacik enum btrfs_inline_ref_type is_data); 92a0231804SJosef Bacik u64 hash_extent_data_ref(u64 root_objectid, u64 owner, u64 offset); 93a0231804SJosef Bacik 94a0231804SJosef Bacik int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, unsigned long count); 95a0231804SJosef Bacik void btrfs_cleanup_ref_head_accounting(struct btrfs_fs_info *fs_info, 96a0231804SJosef Bacik struct btrfs_delayed_ref_root *delayed_refs, 97a0231804SJosef Bacik struct btrfs_delayed_ref_head *head); 98a0231804SJosef Bacik int btrfs_lookup_data_extent(struct btrfs_fs_info *fs_info, u64 start, u64 len); 99a0231804SJosef Bacik int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans, 100a0231804SJosef Bacik struct btrfs_fs_info *fs_info, u64 bytenr, 101a0231804SJosef Bacik u64 offset, int metadata, u64 *refs, u64 *flags); 102a0231804SJosef Bacik int btrfs_pin_extent(struct btrfs_trans_handle *trans, u64 bytenr, u64 num, 103a0231804SJosef Bacik int reserved); 104a0231804SJosef Bacik int btrfs_pin_extent_for_log_replay(struct btrfs_trans_handle *trans, 105a0231804SJosef Bacik u64 bytenr, u64 num_bytes); 106a0231804SJosef Bacik int btrfs_exclude_logged_extents(struct extent_buffer *eb); 107a0231804SJosef Bacik int btrfs_cross_ref_exist(struct btrfs_root *root, 108a0231804SJosef Bacik u64 objectid, u64 offset, u64 bytenr, bool strict, 109a0231804SJosef Bacik struct btrfs_path *path); 110a0231804SJosef Bacik struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans, 111a0231804SJosef Bacik struct btrfs_root *root, 112a0231804SJosef Bacik u64 parent, u64 root_objectid, 113a0231804SJosef Bacik const struct btrfs_disk_key *key, 114a0231804SJosef Bacik int level, u64 hint, 115a0231804SJosef Bacik u64 empty_size, 116a0231804SJosef Bacik enum btrfs_lock_nesting nest); 117*22d907bcSFilipe Manana int btrfs_free_tree_block(struct btrfs_trans_handle *trans, 118a0231804SJosef Bacik u64 root_id, 119a0231804SJosef Bacik struct extent_buffer *buf, 120a0231804SJosef Bacik u64 parent, int last_ref); 121a0231804SJosef Bacik int btrfs_alloc_reserved_file_extent(struct btrfs_trans_handle *trans, 122a0231804SJosef Bacik struct btrfs_root *root, u64 owner, 123a0231804SJosef Bacik u64 offset, u64 ram_bytes, 124a0231804SJosef Bacik struct btrfs_key *ins); 125a0231804SJosef Bacik int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans, 126a0231804SJosef Bacik u64 root_objectid, u64 owner, u64 offset, 127a0231804SJosef Bacik struct btrfs_key *ins); 128a0231804SJosef Bacik int btrfs_reserve_extent(struct btrfs_root *root, u64 ram_bytes, u64 num_bytes, 129a0231804SJosef Bacik u64 min_alloc_size, u64 empty_size, u64 hint_byte, 130a0231804SJosef Bacik struct btrfs_key *ins, int is_data, int delalloc); 131a0231804SJosef Bacik int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, 132a0231804SJosef Bacik struct extent_buffer *buf, int full_backref); 133a0231804SJosef Bacik int btrfs_dec_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, 134a0231804SJosef Bacik struct extent_buffer *buf, int full_backref); 135a0231804SJosef Bacik int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, 1364aec05faSJosef Bacik struct extent_buffer *eb, u64 flags); 137a0231804SJosef Bacik int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_ref *ref); 138a0231804SJosef Bacik 139a0231804SJosef Bacik int btrfs_free_reserved_extent(struct btrfs_fs_info *fs_info, 140a0231804SJosef Bacik u64 start, u64 len, int delalloc); 141a0231804SJosef Bacik int btrfs_pin_reserved_extent(struct btrfs_trans_handle *trans, u64 start, u64 len); 142a0231804SJosef Bacik int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans); 143a0231804SJosef Bacik int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, struct btrfs_ref *generic_ref); 144cc68414cSJosef Bacik int __must_check btrfs_drop_snapshot(struct btrfs_root *root, int update_ref, 145cc68414cSJosef Bacik int for_reloc); 146cc68414cSJosef Bacik int btrfs_drop_subtree(struct btrfs_trans_handle *trans, 147cc68414cSJosef Bacik struct btrfs_root *root, 148cc68414cSJosef Bacik struct extent_buffer *node, 149cc68414cSJosef Bacik struct extent_buffer *parent); 150a0231804SJosef Bacik 151a0231804SJosef Bacik #endif 152