^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) 2009 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_FREE_SPACE_CACHE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define BTRFS_FREE_SPACE_CACHE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * This is the trim state of an extent or bitmap.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * BTRFS_TRIM_STATE_TRIMMING is special and used to maintain the state of a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * bitmap as we may need several trims to fully trim a single bitmap entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * This is reset should any free space other than trimmed space be added to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * bitmap.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) enum btrfs_trim_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) BTRFS_TRIM_STATE_UNTRIMMED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) BTRFS_TRIM_STATE_TRIMMED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) BTRFS_TRIM_STATE_TRIMMING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) struct btrfs_free_space {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) struct rb_node offset_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) u64 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) u64 bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) u64 max_extent_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) unsigned long *bitmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) enum btrfs_trim_state trim_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) s32 bitmap_extents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) static inline bool btrfs_free_space_trimmed(struct btrfs_free_space *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) return (info->trim_state == BTRFS_TRIM_STATE_TRIMMED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) static inline bool btrfs_free_space_trimming_bitmap(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct btrfs_free_space *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) return (info->trim_state == BTRFS_TRIM_STATE_TRIMMING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct btrfs_free_space_ctl {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) spinlock_t tree_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct rb_root free_space_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) u64 free_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) int extents_thresh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) int free_extents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) int total_bitmaps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) int unit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) u64 start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) s32 discardable_extents[BTRFS_STAT_NR_ENTRIES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) s64 discardable_bytes[BTRFS_STAT_NR_ENTRIES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) const struct btrfs_free_space_op *op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) void *private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct mutex cache_writeout_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct list_head trimming_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct btrfs_free_space_op {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) void (*recalc_thresholds)(struct btrfs_free_space_ctl *ctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) bool (*use_bitmap)(struct btrfs_free_space_ctl *ctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct btrfs_free_space *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct btrfs_io_ctl {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) void *cur, *orig;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct page *page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) struct page **pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct btrfs_fs_info *fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct inode *inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) unsigned long size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) int index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) int num_pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) int entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) int bitmaps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) unsigned check_crcs:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct inode *lookup_free_space_inode(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct btrfs_path *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) int create_free_space_inode(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct btrfs_path *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) int btrfs_check_trunc_cache_free_space(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct btrfs_block_rsv *rsv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) int btrfs_truncate_free_space_cache(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) int load_free_space_cache(struct btrfs_block_group *block_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) int btrfs_wait_cache_io(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) struct btrfs_path *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) int btrfs_write_out_cache(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct btrfs_path *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct inode *lookup_free_ino_inode(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) struct btrfs_path *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) int create_free_ino_inode(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct btrfs_path *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) int load_free_ino_cache(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) int btrfs_write_out_ino_cache(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) void btrfs_init_free_space_ctl(struct btrfs_block_group *block_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) int __btrfs_add_free_space(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) struct btrfs_free_space_ctl *ctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u64 bytenr, u64 size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) enum btrfs_trim_state trim_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) int btrfs_add_free_space(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) u64 bytenr, u64 size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) int btrfs_add_free_space_async_trimmed(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) u64 bytenr, u64 size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) int btrfs_remove_free_space(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) u64 bytenr, u64 size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) void __btrfs_remove_free_space_cache(struct btrfs_free_space_ctl *ctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) void btrfs_remove_free_space_cache(struct btrfs_block_group *block_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) bool btrfs_is_free_space_trimmed(struct btrfs_block_group *block_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) u64 btrfs_find_space_for_alloc(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) u64 offset, u64 bytes, u64 empty_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) u64 *max_extent_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) u64 btrfs_find_ino_for_alloc(struct btrfs_root *fs_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) void btrfs_dump_free_space(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) u64 bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) int btrfs_find_space_cluster(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) struct btrfs_free_cluster *cluster,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) u64 offset, u64 bytes, u64 empty_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) void btrfs_init_free_cluster(struct btrfs_free_cluster *cluster);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) u64 btrfs_alloc_from_cluster(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) struct btrfs_free_cluster *cluster, u64 bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) u64 min_start, u64 *max_extent_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) void btrfs_return_cluster_to_free_space(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) struct btrfs_free_cluster *cluster);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) int btrfs_trim_block_group(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) u64 *trimmed, u64 start, u64 end, u64 minlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) int btrfs_trim_block_group_extents(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) u64 *trimmed, u64 start, u64 end, u64 minlen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) bool async);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) int btrfs_trim_block_group_bitmaps(struct btrfs_block_group *block_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) u64 *trimmed, u64 start, u64 end, u64 minlen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) u64 maxlen, bool async);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /* Support functions for running our sanity tests */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) int test_add_free_space_entry(struct btrfs_block_group *cache,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) u64 offset, u64 bytes, bool bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) int test_check_exists(struct btrfs_block_group *cache, u64 offset, u64 bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #endif