]>
Commit | Line | Data |
---|---|---|
8719aaae JB |
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 */ | |
169e0da9 NA |
20 | u64 bytes_zone_unusable; /* total bytes that are unusable until |
21 | resetting the device zone */ | |
8719aaae JB |
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 | ||
88a777a6 JB |
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 | ||
8719aaae JB |
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 | ||
8719aaae JB |
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; | |
db161806 NB |
51 | |
52 | /* | |
53 | * Size of space that needs to be reclaimed in order to satisfy pending | |
54 | * tickets | |
55 | */ | |
56 | u64 reclaim_size; | |
57 | ||
8719aaae JB |
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]; | |
8719aaae JB |
67 | |
68 | struct kobject kobj; | |
69 | struct kobject *block_group_kobjs[BTRFS_NR_RAID_TYPES]; | |
70 | }; | |
71 | ||
b338b013 | 72 | struct reserve_ticket { |
b338b013 JB |
73 | u64 bytes; |
74 | int error; | |
7f9fe614 | 75 | bool steal; |
b338b013 JB |
76 | struct list_head list; |
77 | wait_queue_head_t wait; | |
78 | }; | |
79 | ||
8719aaae JB |
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 | ||
bb96c4e5 JB |
86 | /* |
87 | * | |
88 | * Declare a helper function to detect underflow of various space info members | |
89 | */ | |
f3e75e38 | 90 | #define DECLARE_SPACE_INFO_UPDATE(name, trace_name) \ |
bb96c4e5 JB |
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 | { \ | |
f3e75e38 | 96 | const u64 abs_bytes = (bytes < 0) ? -bytes : bytes; \ |
bb96c4e5 JB |
97 | lockdep_assert_held(&sinfo->lock); \ |
98 | trace_update_##name(fs_info, sinfo, sinfo->name, bytes); \ | |
f3e75e38 JB |
99 | trace_btrfs_space_reservation(fs_info, trace_name, \ |
100 | sinfo->flags, abs_bytes, \ | |
101 | bytes > 0); \ | |
bb96c4e5 JB |
102 | if (bytes < 0 && sinfo->name < -bytes) { \ |
103 | WARN_ON(1); \ | |
104 | sinfo->name = 0; \ | |
105 | return; \ | |
106 | } \ | |
107 | sinfo->name += bytes; \ | |
108 | } | |
109 | ||
f3e75e38 JB |
110 | DECLARE_SPACE_INFO_UPDATE(bytes_may_use, "space_info"); |
111 | DECLARE_SPACE_INFO_UPDATE(bytes_pinned, "pinned"); | |
bb96c4e5 | 112 | |
280c2908 JB |
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, | |
169e0da9 | 116 | u64 bytes_readonly, u64 bytes_zone_unusable, |
280c2908 JB |
117 | struct btrfs_space_info **space_info); |
118 | struct btrfs_space_info *btrfs_find_space_info(struct btrfs_fs_info *info, | |
119 | u64 flags); | |
e1f60a65 | 120 | u64 __pure btrfs_space_info_used(struct btrfs_space_info *s_info, |
280c2908 JB |
121 | bool may_use_included); |
122 | void btrfs_clear_space_info_full(struct btrfs_fs_info *info); | |
5da6afeb JB |
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); | |
0d9764f6 JB |
126 | int btrfs_reserve_metadata_bytes(struct btrfs_root *root, |
127 | struct btrfs_block_rsv *block_rsv, | |
128 | u64 orig_bytes, | |
129 | enum btrfs_reserve_flush_enum flush); | |
18fa2284 JB |
130 | void btrfs_try_granting_tickets(struct btrfs_fs_info *fs_info, |
131 | struct btrfs_space_info *space_info); | |
a30a3d20 JB |
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); | |
18fa2284 | 135 | |
d05e4649 | 136 | static inline void btrfs_space_info_free_bytes_may_use( |
18fa2284 JB |
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 | } | |
8698fc4e JB |
146 | int btrfs_reserve_data_bytes(struct btrfs_fs_info *fs_info, u64 bytes, |
147 | enum btrfs_reserve_flush_enum flush); | |
8719aaae | 148 | #endif /* BTRFS_SPACE_INFO_H */ |