1 /* SPDX-License-Identifier: GPL-2.0 */ 2 3 #ifndef BTRFS_SPACE_INFO_H 4 #define BTRFS_SPACE_INFO_H 5 6 struct btrfs_space_info { 7 spinlock_t lock; 8 9 u64 total_bytes; /* total bytes in the space, 10 this doesn't take mirrors into account */ 11 u64 bytes_used; /* total bytes used, 12 this doesn't take mirrors into account */ 13 u64 bytes_pinned; /* total bytes pinned, will be freed when the 14 transaction finishes */ 15 u64 bytes_reserved; /* total bytes the allocator has reserved for 16 current allocations */ 17 u64 bytes_may_use; /* number of bytes that may be used for 18 delalloc/allocations */ 19 u64 bytes_readonly; /* total bytes that are read only */ 20 u64 bytes_zone_unusable; /* total bytes that are unusable until 21 resetting the device zone */ 22 23 u64 max_extent_size; /* This will hold the maximum extent size of 24 the space info if we had an ENOSPC in the 25 allocator. */ 26 27 int clamp; /* Used to scale our threshold for preemptive 28 flushing. The value is >> clamp, so turns 29 out to be a 2^clamp divisor. */ 30 31 unsigned int full:1; /* indicates that we cannot allocate any more 32 chunks for this space */ 33 unsigned int chunk_alloc:1; /* set if we are allocating a chunk */ 34 35 unsigned int flush:1; /* set if we are trying to make space */ 36 37 unsigned int force_alloc; /* set if we need to force a chunk 38 alloc for this space */ 39 40 u64 disk_used; /* total bytes used on disk */ 41 u64 disk_total; /* total bytes on disk, takes mirrors into 42 account */ 43 44 u64 flags; 45 46 struct list_head list; 47 /* Protected by the spinlock 'lock'. */ 48 struct list_head ro_bgs; 49 struct list_head priority_tickets; 50 struct list_head tickets; 51 52 /* 53 * Size of space that needs to be reclaimed in order to satisfy pending 54 * tickets 55 */ 56 u64 reclaim_size; 57 58 /* 59 * tickets_id just indicates the next ticket will be handled, so note 60 * it's not stored per ticket. 61 */ 62 u64 tickets_id; 63 64 struct rw_semaphore groups_sem; 65 /* for block groups in our same type */ 66 struct list_head block_groups[BTRFS_NR_RAID_TYPES]; 67 68 struct kobject kobj; 69 struct kobject *block_group_kobjs[BTRFS_NR_RAID_TYPES]; 70 }; 71 72 struct reserve_ticket { 73 u64 bytes; 74 int error; 75 bool steal; 76 struct list_head list; 77 wait_queue_head_t wait; 78 }; 79 80 static inline bool btrfs_mixed_space_info(struct btrfs_space_info *space_info) 81 { 82 return ((space_info->flags & BTRFS_BLOCK_GROUP_METADATA) && 83 (space_info->flags & BTRFS_BLOCK_GROUP_DATA)); 84 } 85 86 /* 87 * 88 * Declare a helper function to detect underflow of various space info members 89 */ 90 #define DECLARE_SPACE_INFO_UPDATE(name, trace_name) \ 91 static inline void \ 92 btrfs_space_info_update_##name(struct btrfs_fs_info *fs_info, \ 93 struct btrfs_space_info *sinfo, \ 94 s64 bytes) \ 95 { \ 96 const u64 abs_bytes = (bytes < 0) ? -bytes : bytes; \ 97 lockdep_assert_held(&sinfo->lock); \ 98 trace_update_##name(fs_info, sinfo, sinfo->name, bytes); \ 99 trace_btrfs_space_reservation(fs_info, trace_name, \ 100 sinfo->flags, abs_bytes, \ 101 bytes > 0); \ 102 if (bytes < 0 && sinfo->name < -bytes) { \ 103 WARN_ON(1); \ 104 sinfo->name = 0; \ 105 return; \ 106 } \ 107 sinfo->name += bytes; \ 108 } 109 110 DECLARE_SPACE_INFO_UPDATE(bytes_may_use, "space_info"); 111 DECLARE_SPACE_INFO_UPDATE(bytes_pinned, "pinned"); 112 113 int btrfs_init_space_info(struct btrfs_fs_info *fs_info); 114 void btrfs_update_space_info(struct btrfs_fs_info *info, u64 flags, 115 u64 total_bytes, u64 bytes_used, 116 u64 bytes_readonly, u64 bytes_zone_unusable, 117 struct btrfs_space_info **space_info); 118 struct btrfs_space_info *btrfs_find_space_info(struct btrfs_fs_info *info, 119 u64 flags); 120 u64 __pure btrfs_space_info_used(struct btrfs_space_info *s_info, 121 bool may_use_included); 122 void btrfs_clear_space_info_full(struct btrfs_fs_info *info); 123 void btrfs_dump_space_info(struct btrfs_fs_info *fs_info, 124 struct btrfs_space_info *info, u64 bytes, 125 int dump_block_groups); 126 int btrfs_reserve_metadata_bytes(struct btrfs_fs_info *fs_info, 127 struct btrfs_block_rsv *block_rsv, 128 u64 orig_bytes, 129 enum btrfs_reserve_flush_enum flush); 130 void btrfs_try_granting_tickets(struct btrfs_fs_info *fs_info, 131 struct btrfs_space_info *space_info); 132 int btrfs_can_overcommit(struct btrfs_fs_info *fs_info, 133 struct btrfs_space_info *space_info, u64 bytes, 134 enum btrfs_reserve_flush_enum flush); 135 136 static inline void btrfs_space_info_free_bytes_may_use( 137 struct btrfs_fs_info *fs_info, 138 struct btrfs_space_info *space_info, 139 u64 num_bytes) 140 { 141 spin_lock(&space_info->lock); 142 btrfs_space_info_update_bytes_may_use(fs_info, space_info, -num_bytes); 143 btrfs_try_granting_tickets(fs_info, space_info); 144 spin_unlock(&space_info->lock); 145 } 146 int btrfs_reserve_data_bytes(struct btrfs_fs_info *fs_info, u64 bytes, 147 enum btrfs_reserve_flush_enum flush); 148 #endif /* BTRFS_SPACE_INFO_H */ 149