]> Git Repo - linux.git/blob - fs/btrfs/extent-io-tree.h
Linux 6.14-rc3
[linux.git] / fs / btrfs / extent-io-tree.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2
3 #ifndef BTRFS_EXTENT_IO_TREE_H
4 #define BTRFS_EXTENT_IO_TREE_H
5
6 #include <linux/rbtree.h>
7 #include <linux/spinlock.h>
8 #include <linux/refcount.h>
9 #include <linux/list.h>
10 #include <linux/wait.h>
11 #include "misc.h"
12
13 struct extent_changeset;
14 struct btrfs_fs_info;
15 struct btrfs_inode;
16
17 /* Bits for the extent state */
18 enum {
19         ENUM_BIT(EXTENT_DIRTY),
20         ENUM_BIT(EXTENT_UPTODATE),
21         ENUM_BIT(EXTENT_LOCKED),
22         ENUM_BIT(EXTENT_DIO_LOCKED),
23         ENUM_BIT(EXTENT_NEW),
24         ENUM_BIT(EXTENT_DELALLOC),
25         ENUM_BIT(EXTENT_DEFRAG),
26         ENUM_BIT(EXTENT_BOUNDARY),
27         ENUM_BIT(EXTENT_NODATASUM),
28         ENUM_BIT(EXTENT_CLEAR_META_RESV),
29         ENUM_BIT(EXTENT_NEED_WAIT),
30         ENUM_BIT(EXTENT_NORESERVE),
31         ENUM_BIT(EXTENT_QGROUP_RESERVED),
32         ENUM_BIT(EXTENT_CLEAR_DATA_RESV),
33         /*
34          * Must be cleared only during ordered extent completion or on error
35          * paths if we did not manage to submit bios and create the ordered
36          * extents for the range.  Should not be cleared during page release
37          * and page invalidation (if there is an ordered extent in flight),
38          * that is left for the ordered extent completion.
39          */
40         ENUM_BIT(EXTENT_DELALLOC_NEW),
41         /*
42          * When an ordered extent successfully completes for a region marked as
43          * a new delalloc range, use this flag when clearing a new delalloc
44          * range to indicate that the VFS' inode number of bytes should be
45          * incremented and the inode's new delalloc bytes decremented, in an
46          * atomic way to prevent races with stat(2).
47          */
48         ENUM_BIT(EXTENT_ADD_INODE_BYTES),
49         /*
50          * Set during truncate when we're clearing an entire range and we just
51          * want the extent states to go away.
52          */
53         ENUM_BIT(EXTENT_CLEAR_ALL_BITS),
54
55         /*
56          * This must be last.
57          *
58          * Bit not representing a state but a request for NOWAIT semantics,
59          * e.g. when allocating memory, and must be masked out from the other
60          * bits.
61          */
62         ENUM_BIT(EXTENT_NOWAIT)
63 };
64
65 #define EXTENT_DO_ACCOUNTING    (EXTENT_CLEAR_META_RESV | \
66                                  EXTENT_CLEAR_DATA_RESV)
67 #define EXTENT_CTLBITS          (EXTENT_DO_ACCOUNTING | \
68                                  EXTENT_ADD_INODE_BYTES | \
69                                  EXTENT_CLEAR_ALL_BITS)
70
71 #define EXTENT_LOCK_BITS        (EXTENT_LOCKED | EXTENT_DIO_LOCKED)
72
73 /*
74  * Redefined bits above which are used only in the device allocation tree,
75  * shouldn't be using EXTENT_LOCKED / EXTENT_BOUNDARY / EXTENT_CLEAR_META_RESV
76  * / EXTENT_CLEAR_DATA_RESV because they have special meaning to the bit
77  * manipulation functions
78  */
79 #define CHUNK_ALLOCATED                         EXTENT_DIRTY
80 #define CHUNK_TRIMMED                           EXTENT_DEFRAG
81 #define CHUNK_STATE_MASK                        (CHUNK_ALLOCATED |              \
82                                                  CHUNK_TRIMMED)
83
84 enum {
85         IO_TREE_FS_PINNED_EXTENTS,
86         IO_TREE_FS_EXCLUDED_EXTENTS,
87         IO_TREE_BTREE_INODE_IO,
88         IO_TREE_INODE_IO,
89         IO_TREE_RELOC_BLOCKS,
90         IO_TREE_TRANS_DIRTY_PAGES,
91         IO_TREE_ROOT_DIRTY_LOG_PAGES,
92         IO_TREE_INODE_FILE_EXTENT,
93         IO_TREE_LOG_CSUM_RANGE,
94         IO_TREE_SELFTEST,
95         IO_TREE_DEVICE_ALLOC_STATE,
96 };
97
98 struct extent_io_tree {
99         struct rb_root state;
100         /*
101          * The fs_info is needed for trace points, a tree attached to an inode
102          * needs the inode.
103          *
104          * owner == IO_TREE_INODE_IO - then inode is valid and fs_info can be
105          *                             accessed as inode->root->fs_info
106          */
107         union {
108                 struct btrfs_fs_info *fs_info;
109                 struct btrfs_inode *inode;
110         };
111
112         /* Who owns this io tree, should be one of IO_TREE_* */
113         u8 owner;
114
115         spinlock_t lock;
116 };
117
118 struct extent_state {
119         u64 start;
120         u64 end; /* inclusive */
121         struct rb_node rb_node;
122
123         /* ADD NEW ELEMENTS AFTER THIS */
124         wait_queue_head_t wq;
125         refcount_t refs;
126         u32 state;
127
128 #ifdef CONFIG_BTRFS_DEBUG
129         struct list_head leak_list;
130 #endif
131 };
132
133 struct btrfs_inode *extent_io_tree_to_inode(struct extent_io_tree *tree);
134 const struct btrfs_inode *extent_io_tree_to_inode_const(const struct extent_io_tree *tree);
135 const struct btrfs_fs_info *extent_io_tree_to_fs_info(const struct extent_io_tree *tree);
136
137 void extent_io_tree_init(struct btrfs_fs_info *fs_info,
138                          struct extent_io_tree *tree, unsigned int owner);
139 void extent_io_tree_release(struct extent_io_tree *tree);
140 int __lock_extent(struct extent_io_tree *tree, u64 start, u64 end, u32 bits,
141                   struct extent_state **cached);
142 bool __try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end, u32 bits,
143                        struct extent_state **cached);
144
145 static inline int lock_extent(struct extent_io_tree *tree, u64 start, u64 end,
146                               struct extent_state **cached)
147 {
148         return __lock_extent(tree, start, end, EXTENT_LOCKED, cached);
149 }
150
151 static inline bool try_lock_extent(struct extent_io_tree *tree, u64 start,
152                                    u64 end, struct extent_state **cached)
153 {
154         return __try_lock_extent(tree, start, end, EXTENT_LOCKED, cached);
155 }
156
157 int __init extent_state_init_cachep(void);
158 void __cold extent_state_free_cachep(void);
159
160 u64 count_range_bits(struct extent_io_tree *tree,
161                      u64 *start, u64 search_end,
162                      u64 max_bytes, u32 bits, int contig,
163                      struct extent_state **cached_state);
164
165 void free_extent_state(struct extent_state *state);
166 bool test_range_bit(struct extent_io_tree *tree, u64 start, u64 end, u32 bit,
167                     struct extent_state *cached_state);
168 bool test_range_bit_exists(struct extent_io_tree *tree, u64 start, u64 end, u32 bit);
169 int clear_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
170                              u32 bits, struct extent_changeset *changeset);
171 int __clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
172                        u32 bits, struct extent_state **cached,
173                        struct extent_changeset *changeset);
174
175 static inline int clear_extent_bit(struct extent_io_tree *tree, u64 start,
176                                    u64 end, u32 bits,
177                                    struct extent_state **cached)
178 {
179         return __clear_extent_bit(tree, start, end, bits, cached, NULL);
180 }
181
182 static inline int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end,
183                                 struct extent_state **cached)
184 {
185         return __clear_extent_bit(tree, start, end, EXTENT_LOCKED, cached, NULL);
186 }
187
188 static inline int clear_extent_bits(struct extent_io_tree *tree, u64 start,
189                                     u64 end, u32 bits)
190 {
191         return clear_extent_bit(tree, start, end, bits, NULL);
192 }
193
194 int set_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
195                            u32 bits, struct extent_changeset *changeset);
196 int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
197                    u32 bits, struct extent_state **cached_state);
198
199 static inline int clear_extent_uptodate(struct extent_io_tree *tree, u64 start,
200                 u64 end, struct extent_state **cached_state)
201 {
202         return __clear_extent_bit(tree, start, end, EXTENT_UPTODATE,
203                                   cached_state, NULL);
204 }
205
206 static inline int clear_extent_dirty(struct extent_io_tree *tree, u64 start,
207                                      u64 end, struct extent_state **cached)
208 {
209         return clear_extent_bit(tree, start, end,
210                                 EXTENT_DIRTY | EXTENT_DELALLOC |
211                                 EXTENT_DO_ACCOUNTING, cached);
212 }
213
214 int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
215                        u32 bits, u32 clear_bits,
216                        struct extent_state **cached_state);
217
218 bool find_first_extent_bit(struct extent_io_tree *tree, u64 start,
219                            u64 *start_ret, u64 *end_ret, u32 bits,
220                            struct extent_state **cached_state);
221 void find_first_clear_extent_bit(struct extent_io_tree *tree, u64 start,
222                                  u64 *start_ret, u64 *end_ret, u32 bits);
223 int find_contiguous_extent_bit(struct extent_io_tree *tree, u64 start,
224                                u64 *start_ret, u64 *end_ret, u32 bits);
225 bool btrfs_find_delalloc_range(struct extent_io_tree *tree, u64 *start,
226                                u64 *end, u64 max_bytes,
227                                struct extent_state **cached_state);
228 static inline int lock_dio_extent(struct extent_io_tree *tree, u64 start,
229                                   u64 end, struct extent_state **cached)
230 {
231         return __lock_extent(tree, start, end, EXTENT_DIO_LOCKED, cached);
232 }
233
234 static inline bool try_lock_dio_extent(struct extent_io_tree *tree, u64 start,
235                                        u64 end, struct extent_state **cached)
236 {
237         return __try_lock_extent(tree, start, end, EXTENT_DIO_LOCKED, cached);
238 }
239
240 static inline int unlock_dio_extent(struct extent_io_tree *tree, u64 start,
241                                     u64 end, struct extent_state **cached)
242 {
243         return __clear_extent_bit(tree, start, end, EXTENT_DIO_LOCKED, cached, NULL);
244 }
245
246 #endif /* BTRFS_EXTENT_IO_TREE_H */
This page took 0.043992 seconds and 4 git commands to generate.