]>
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 */ | |
20 | ||
21 | u64 max_extent_size; /* This will hold the maximum extent size of | |
22 | the space info if we had an ENOSPC in the | |
23 | allocator. */ | |
24 | ||
25 | unsigned int full:1; /* indicates that we cannot allocate any more | |
26 | chunks for this space */ | |
27 | unsigned int chunk_alloc:1; /* set if we are allocating a chunk */ | |
28 | ||
29 | unsigned int flush:1; /* set if we are trying to make space */ | |
30 | ||
31 | unsigned int force_alloc; /* set if we need to force a chunk | |
32 | alloc for this space */ | |
33 | ||
34 | u64 disk_used; /* total bytes used on disk */ | |
35 | u64 disk_total; /* total bytes on disk, takes mirrors into | |
36 | account */ | |
37 | ||
38 | u64 flags; | |
39 | ||
40 | /* | |
41 | * bytes_pinned is kept in line with what is actually pinned, as in | |
42 | * we've called update_block_group and dropped the bytes_used counter | |
43 | * and increased the bytes_pinned counter. However this means that | |
44 | * bytes_pinned does not reflect the bytes that will be pinned once the | |
45 | * delayed refs are flushed, so this counter is inc'ed every time we | |
46 | * call btrfs_free_extent so it is a realtime count of what will be | |
47 | * freed once the transaction is committed. It will be zeroed every | |
48 | * time the transaction commits. | |
49 | */ | |
50 | struct percpu_counter total_bytes_pinned; | |
51 | ||
52 | struct list_head list; | |
53 | /* Protected by the spinlock 'lock'. */ | |
54 | struct list_head ro_bgs; | |
55 | struct list_head priority_tickets; | |
56 | struct list_head tickets; | |
57 | /* | |
58 | * tickets_id just indicates the next ticket will be handled, so note | |
59 | * it's not stored per ticket. | |
60 | */ | |
61 | u64 tickets_id; | |
62 | ||
63 | struct rw_semaphore groups_sem; | |
64 | /* for block groups in our same type */ | |
65 | struct list_head block_groups[BTRFS_NR_RAID_TYPES]; | |
66 | wait_queue_head_t wait; | |
67 | ||
68 | struct kobject kobj; | |
69 | struct kobject *block_group_kobjs[BTRFS_NR_RAID_TYPES]; | |
70 | }; | |
71 | ||
72 | static inline bool btrfs_mixed_space_info(struct btrfs_space_info *space_info) | |
73 | { | |
74 | return ((space_info->flags & BTRFS_BLOCK_GROUP_METADATA) && | |
75 | (space_info->flags & BTRFS_BLOCK_GROUP_DATA)); | |
76 | } | |
77 | ||
bb96c4e5 JB |
78 | /* |
79 | * | |
80 | * Declare a helper function to detect underflow of various space info members | |
81 | */ | |
82 | #define DECLARE_SPACE_INFO_UPDATE(name) \ | |
83 | static inline void \ | |
84 | btrfs_space_info_update_##name(struct btrfs_fs_info *fs_info, \ | |
85 | struct btrfs_space_info *sinfo, \ | |
86 | s64 bytes) \ | |
87 | { \ | |
88 | lockdep_assert_held(&sinfo->lock); \ | |
89 | trace_update_##name(fs_info, sinfo, sinfo->name, bytes); \ | |
90 | if (bytes < 0 && sinfo->name < -bytes) { \ | |
91 | WARN_ON(1); \ | |
92 | sinfo->name = 0; \ | |
93 | return; \ | |
94 | } \ | |
95 | sinfo->name += bytes; \ | |
96 | } | |
97 | ||
98 | DECLARE_SPACE_INFO_UPDATE(bytes_may_use); | |
99 | DECLARE_SPACE_INFO_UPDATE(bytes_pinned); | |
100 | ||
d44b72aa JB |
101 | void btrfs_space_info_add_new_bytes(struct btrfs_fs_info *fs_info, |
102 | struct btrfs_space_info *space_info, | |
103 | u64 num_bytes); | |
104 | void btrfs_space_info_add_old_bytes(struct btrfs_fs_info *fs_info, | |
105 | struct btrfs_space_info *space_info, | |
106 | u64 num_bytes); | |
280c2908 JB |
107 | int btrfs_init_space_info(struct btrfs_fs_info *fs_info); |
108 | void btrfs_update_space_info(struct btrfs_fs_info *info, u64 flags, | |
109 | u64 total_bytes, u64 bytes_used, | |
110 | u64 bytes_readonly, | |
111 | struct btrfs_space_info **space_info); | |
112 | struct btrfs_space_info *btrfs_find_space_info(struct btrfs_fs_info *info, | |
113 | u64 flags); | |
114 | u64 btrfs_space_info_used(struct btrfs_space_info *s_info, | |
115 | bool may_use_included); | |
116 | void btrfs_clear_space_info_full(struct btrfs_fs_info *info); | |
41783ef2 JB |
117 | int btrfs_can_overcommit(struct btrfs_fs_info *fs_info, |
118 | struct btrfs_space_info *space_info, u64 bytes, | |
119 | enum btrfs_reserve_flush_enum flush, | |
120 | bool system_chunk); | |
d44b72aa | 121 | |
8719aaae | 122 | #endif /* BTRFS_SPACE_INFO_H */ |