]>
Commit | Line | Data |
---|---|---|
c7f13d42 JB |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | ||
3 | #ifndef BTRFS_FS_H | |
4 | #define BTRFS_FS_H | |
5 | ||
243cf8d1 | 6 | #include <linux/blkdev.h> |
3683fbbc | 7 | #include <linux/sizes.h> |
5693a128 DS |
8 | #include <linux/time64.h> |
9 | #include <linux/compiler.h> | |
10 | #include <linux/math.h> | |
11 | #include <linux/atomic.h> | |
5693a128 DS |
12 | #include <linux/percpu_counter.h> |
13 | #include <linux/completion.h> | |
14 | #include <linux/lockdep.h> | |
15 | #include <linux/spinlock.h> | |
16 | #include <linux/mutex.h> | |
5693a128 DS |
17 | #include <linux/rwsem.h> |
18 | #include <linux/semaphore.h> | |
19 | #include <linux/list.h> | |
378f25d3 | 20 | #include <linux/pagemap.h> |
5693a128 DS |
21 | #include <linux/radix-tree.h> |
22 | #include <linux/workqueue.h> | |
23 | #include <linux/wait.h> | |
24 | #include <linux/wait_bit.h> | |
25 | #include <linux/sched.h> | |
26 | #include <linux/rbtree.h> | |
27 | #include <uapi/linux/btrfs.h> | |
28 | #include <uapi/linux/btrfs_tree.h> | |
3683fbbc | 29 | #include "extent-io-tree.h" |
3683fbbc JB |
30 | #include "async-thread.h" |
31 | #include "block-rsv.h" | |
5693a128 DS |
32 | |
33 | struct inode; | |
34 | struct super_block; | |
35 | struct kobject; | |
36 | struct reloc_control; | |
37 | struct crypto_shash; | |
38 | struct ulist; | |
39 | struct btrfs_device; | |
40 | struct btrfs_block_group; | |
41 | struct btrfs_root; | |
42 | struct btrfs_fs_devices; | |
43 | struct btrfs_transaction; | |
44 | struct btrfs_delayed_root; | |
45 | struct btrfs_balance_control; | |
46 | struct btrfs_subpage_info; | |
47 | struct btrfs_stripe_hash_table; | |
48 | struct btrfs_space_info; | |
3683fbbc | 49 | |
a56159d4 JB |
50 | #define BTRFS_MAX_EXTENT_SIZE SZ_128M |
51 | ||
52 | #define BTRFS_OLDEST_GENERATION 0ULL | |
53 | ||
54 | #define BTRFS_EMPTY_DIR_SIZE 0 | |
55 | ||
56 | #define BTRFS_DIRTY_METADATA_THRESH SZ_32M | |
57 | ||
58 | #define BTRFS_SUPER_INFO_OFFSET SZ_64K | |
59 | #define BTRFS_SUPER_INFO_SIZE 4096 | |
60 | static_assert(sizeof(struct btrfs_super_block) == BTRFS_SUPER_INFO_SIZE); | |
61 | ||
5630e2bc FM |
62 | /* |
63 | * Number of metadata items necessary for an unlink operation: | |
64 | * | |
65 | * 1 for the possible orphan item | |
66 | * 1 for the dir item | |
67 | * 1 for the dir index | |
68 | * 1 for the inode ref | |
69 | * 1 for the inode | |
70 | * 1 for the parent inode | |
71 | */ | |
72 | #define BTRFS_UNLINK_METADATA_UNITS 6 | |
73 | ||
a56159d4 JB |
74 | /* |
75 | * The reserved space at the beginning of each device. It covers the primary | |
76 | * super block and leaves space for potential use by other tools like | |
77 | * bootloaders or to lower potential damage of accidental overwrite. | |
78 | */ | |
79 | #define BTRFS_DEVICE_RANGE_RESERVED (SZ_1M) | |
ec8eb376 JB |
80 | /* |
81 | * Runtime (in-memory) states of filesystem | |
82 | */ | |
83 | enum { | |
ec8eb376 JB |
84 | /* |
85 | * Filesystem is being remounted, allow to skip some operations, like | |
86 | * defrag | |
87 | */ | |
88 | BTRFS_FS_STATE_REMOUNTING, | |
89 | /* Filesystem in RO mode */ | |
90 | BTRFS_FS_STATE_RO, | |
91 | /* Track if a transaction abort has been reported on this filesystem */ | |
92 | BTRFS_FS_STATE_TRANS_ABORTED, | |
93 | /* | |
94 | * Bio operations should be blocked on this filesystem because a source | |
95 | * or target device is being destroyed as part of a device replace | |
96 | */ | |
97 | BTRFS_FS_STATE_DEV_REPLACING, | |
98 | /* The btrfs_fs_info created for self-tests */ | |
99 | BTRFS_FS_STATE_DUMMY_FS_INFO, | |
100 | ||
169aaaf2 QW |
101 | /* Checksum errors are ignored. */ |
102 | BTRFS_FS_STATE_NO_DATA_CSUMS, | |
103 | BTRFS_FS_STATE_SKIP_META_CSUMS, | |
ec8eb376 JB |
104 | |
105 | /* Indicates there was an error cleaning up a log tree. */ | |
106 | BTRFS_FS_STATE_LOG_CLEANUP_ERROR, | |
107 | ||
108 | BTRFS_FS_STATE_COUNT | |
109 | }; | |
110 | ||
7966a6b5 JB |
111 | enum { |
112 | BTRFS_FS_CLOSING_START, | |
113 | BTRFS_FS_CLOSING_DONE, | |
114 | BTRFS_FS_LOG_RECOVERING, | |
115 | BTRFS_FS_OPEN, | |
116 | BTRFS_FS_QUOTA_ENABLED, | |
117 | BTRFS_FS_UPDATE_UUID_TREE_GEN, | |
118 | BTRFS_FS_CREATING_FREE_SPACE_TREE, | |
119 | BTRFS_FS_BTREE_ERR, | |
120 | BTRFS_FS_LOG1_ERR, | |
121 | BTRFS_FS_LOG2_ERR, | |
122 | BTRFS_FS_QUOTA_OVERRIDE, | |
123 | /* Used to record internally whether fs has been frozen */ | |
124 | BTRFS_FS_FROZEN, | |
125 | /* | |
126 | * Indicate that balance has been set up from the ioctl and is in the | |
127 | * main phase. The fs_info::balance_ctl is initialized. | |
128 | */ | |
129 | BTRFS_FS_BALANCE_RUNNING, | |
130 | ||
131 | /* | |
132 | * Indicate that relocation of a chunk has started, it's set per chunk | |
133 | * and is toggled between chunks. | |
134 | */ | |
135 | BTRFS_FS_RELOC_RUNNING, | |
136 | ||
137 | /* Indicate that the cleaner thread is awake and doing something. */ | |
138 | BTRFS_FS_CLEANER_RUNNING, | |
139 | ||
140 | /* | |
141 | * The checksumming has an optimized version and is considered fast, | |
142 | * so we don't need to offload checksums to workqueues. | |
143 | */ | |
144 | BTRFS_FS_CSUM_IMPL_FAST, | |
145 | ||
146 | /* Indicate that the discard workqueue can service discards. */ | |
147 | BTRFS_FS_DISCARD_RUNNING, | |
148 | ||
149 | /* Indicate that we need to cleanup space cache v1 */ | |
150 | BTRFS_FS_CLEANUP_SPACE_CACHE_V1, | |
151 | ||
152 | /* Indicate that we can't trust the free space tree for caching yet */ | |
153 | BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED, | |
154 | ||
155 | /* Indicate whether there are any tree modification log users */ | |
156 | BTRFS_FS_TREE_MOD_LOG_USERS, | |
157 | ||
158 | /* Indicate that we want the transaction kthread to commit right now. */ | |
159 | BTRFS_FS_COMMIT_TRANS, | |
160 | ||
161 | /* Indicate we have half completed snapshot deletions pending. */ | |
162 | BTRFS_FS_UNFINISHED_DROPS, | |
163 | ||
164 | /* Indicate we have to finish a zone to do next allocation. */ | |
165 | BTRFS_FS_NEED_ZONE_FINISH, | |
166 | ||
c52cc7b7 JB |
167 | /* Indicate that we want to commit the transaction. */ |
168 | BTRFS_FS_NEED_TRANS_COMMIT, | |
169 | ||
bf1f1fec JB |
170 | /* This is set when active zone tracking is needed. */ |
171 | BTRFS_FS_ACTIVE_ZONE_TRACKING, | |
85e79ec7 | 172 | |
b7625f46 QW |
173 | /* |
174 | * Indicate if we have some features changed, this is mostly for | |
175 | * cleaner thread to update the sysfs interface. | |
176 | */ | |
177 | BTRFS_FS_FEATURE_CHANGED, | |
178 | ||
6d3a6194 QW |
179 | /* |
180 | * Indicate that we have found a tree block which is only aligned to | |
181 | * sectorsize, but not to nodesize. This should be rare nowadays. | |
182 | */ | |
183 | BTRFS_FS_UNALIGNED_TREE_BLOCK, | |
184 | ||
7966a6b5 JB |
185 | #if BITS_PER_LONG == 32 |
186 | /* Indicate if we have error/warn message printed on 32bit systems */ | |
187 | BTRFS_FS_32BIT_ERROR, | |
188 | BTRFS_FS_32BIT_WARN, | |
189 | #endif | |
190 | }; | |
191 | ||
fc97a410 JB |
192 | /* |
193 | * Flags for mount options. | |
194 | * | |
195 | * Note: don't forget to add new options to btrfs_show_options() | |
196 | */ | |
197 | enum { | |
c3ece6b7 QW |
198 | BTRFS_MOUNT_NODATASUM = (1ULL << 0), |
199 | BTRFS_MOUNT_NODATACOW = (1ULL << 1), | |
200 | BTRFS_MOUNT_NOBARRIER = (1ULL << 2), | |
201 | BTRFS_MOUNT_SSD = (1ULL << 3), | |
202 | BTRFS_MOUNT_DEGRADED = (1ULL << 4), | |
203 | BTRFS_MOUNT_COMPRESS = (1ULL << 5), | |
204 | BTRFS_MOUNT_NOTREELOG = (1ULL << 6), | |
205 | BTRFS_MOUNT_FLUSHONCOMMIT = (1ULL << 7), | |
206 | BTRFS_MOUNT_SSD_SPREAD = (1ULL << 8), | |
207 | BTRFS_MOUNT_NOSSD = (1ULL << 9), | |
208 | BTRFS_MOUNT_DISCARD_SYNC = (1ULL << 10), | |
209 | BTRFS_MOUNT_FORCE_COMPRESS = (1ULL << 11), | |
210 | BTRFS_MOUNT_SPACE_CACHE = (1ULL << 12), | |
211 | BTRFS_MOUNT_CLEAR_CACHE = (1ULL << 13), | |
212 | BTRFS_MOUNT_USER_SUBVOL_RM_ALLOWED = (1ULL << 14), | |
213 | BTRFS_MOUNT_ENOSPC_DEBUG = (1ULL << 15), | |
214 | BTRFS_MOUNT_AUTO_DEFRAG = (1ULL << 16), | |
215 | BTRFS_MOUNT_USEBACKUPROOT = (1ULL << 17), | |
216 | BTRFS_MOUNT_SKIP_BALANCE = (1ULL << 18), | |
217 | BTRFS_MOUNT_PANIC_ON_FATAL_ERROR = (1ULL << 19), | |
218 | BTRFS_MOUNT_RESCAN_UUID_TREE = (1ULL << 20), | |
219 | BTRFS_MOUNT_FRAGMENT_DATA = (1ULL << 21), | |
220 | BTRFS_MOUNT_FRAGMENT_METADATA = (1ULL << 22), | |
221 | BTRFS_MOUNT_FREE_SPACE_TREE = (1ULL << 23), | |
222 | BTRFS_MOUNT_NOLOGREPLAY = (1ULL << 24), | |
223 | BTRFS_MOUNT_REF_VERIFY = (1ULL << 25), | |
224 | BTRFS_MOUNT_DISCARD_ASYNC = (1ULL << 26), | |
225 | BTRFS_MOUNT_IGNOREBADROOTS = (1ULL << 27), | |
226 | BTRFS_MOUNT_IGNOREDATACSUMS = (1ULL << 28), | |
227 | BTRFS_MOUNT_NODISCARD = (1ULL << 29), | |
228 | BTRFS_MOUNT_NOSPACECACHE = (1ULL << 30), | |
229 | BTRFS_MOUNT_IGNOREMETACSUMS = (1ULL << 31), | |
32e62165 | 230 | BTRFS_MOUNT_IGNORESUPERFLAGS = (1ULL << 32), |
fc97a410 JB |
231 | }; |
232 | ||
d83eb482 JB |
233 | /* |
234 | * Compat flags that we support. If any incompat flags are set other than the | |
235 | * ones specified below then we will fail to mount | |
236 | */ | |
237 | #define BTRFS_FEATURE_COMPAT_SUPP 0ULL | |
238 | #define BTRFS_FEATURE_COMPAT_SAFE_SET 0ULL | |
239 | #define BTRFS_FEATURE_COMPAT_SAFE_CLEAR 0ULL | |
240 | ||
241 | #define BTRFS_FEATURE_COMPAT_RO_SUPP \ | |
242 | (BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE | \ | |
243 | BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID | \ | |
244 | BTRFS_FEATURE_COMPAT_RO_VERITY | \ | |
245 | BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE) | |
246 | ||
247 | #define BTRFS_FEATURE_COMPAT_RO_SAFE_SET 0ULL | |
248 | #define BTRFS_FEATURE_COMPAT_RO_SAFE_CLEAR 0ULL | |
249 | ||
0f202b25 | 250 | #define BTRFS_FEATURE_INCOMPAT_SUPP_STABLE \ |
d83eb482 JB |
251 | (BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF | \ |
252 | BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL | \ | |
253 | BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS | \ | |
254 | BTRFS_FEATURE_INCOMPAT_BIG_METADATA | \ | |
255 | BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO | \ | |
256 | BTRFS_FEATURE_INCOMPAT_COMPRESS_ZSTD | \ | |
257 | BTRFS_FEATURE_INCOMPAT_RAID56 | \ | |
258 | BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF | \ | |
259 | BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA | \ | |
260 | BTRFS_FEATURE_INCOMPAT_NO_HOLES | \ | |
261 | BTRFS_FEATURE_INCOMPAT_METADATA_UUID | \ | |
262 | BTRFS_FEATURE_INCOMPAT_RAID1C34 | \ | |
182940f4 BB |
263 | BTRFS_FEATURE_INCOMPAT_ZONED | \ |
264 | BTRFS_FEATURE_INCOMPAT_SIMPLE_QUOTA) | |
0f202b25 | 265 | |
67cd3f22 | 266 | #ifdef CONFIG_BTRFS_EXPERIMENTAL |
0f202b25 AJ |
267 | /* |
268 | * Features under developmen like Extent tree v2 support is enabled | |
67cd3f22 | 269 | * only under CONFIG_BTRFS_EXPERIMENTAL |
0f202b25 AJ |
270 | */ |
271 | #define BTRFS_FEATURE_INCOMPAT_SUPP \ | |
272 | (BTRFS_FEATURE_INCOMPAT_SUPP_STABLE | \ | |
e9b9b911 | 273 | BTRFS_FEATURE_INCOMPAT_RAID_STRIPE_TREE | \ |
d83eb482 | 274 | BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2) |
0f202b25 | 275 | |
d83eb482 | 276 | #else |
0f202b25 AJ |
277 | |
278 | #define BTRFS_FEATURE_INCOMPAT_SUPP \ | |
279 | (BTRFS_FEATURE_INCOMPAT_SUPP_STABLE) | |
280 | ||
d83eb482 JB |
281 | #endif |
282 | ||
283 | #define BTRFS_FEATURE_INCOMPAT_SAFE_SET \ | |
284 | (BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF) | |
285 | #define BTRFS_FEATURE_INCOMPAT_SAFE_CLEAR 0ULL | |
286 | ||
fc97a410 JB |
287 | #define BTRFS_DEFAULT_COMMIT_INTERVAL (30) |
288 | #define BTRFS_DEFAULT_MAX_INLINE (2048) | |
289 | ||
a56159d4 JB |
290 | struct btrfs_dev_replace { |
291 | /* See #define above */ | |
292 | u64 replace_state; | |
293 | /* Seconds since 1-Jan-1970 */ | |
294 | time64_t time_started; | |
295 | /* Seconds since 1-Jan-1970 */ | |
296 | time64_t time_stopped; | |
297 | atomic64_t num_write_errors; | |
298 | atomic64_t num_uncorrectable_read_errors; | |
299 | ||
300 | u64 cursor_left; | |
301 | u64 committed_cursor_left; | |
302 | u64 cursor_left_last_write_of_item; | |
303 | u64 cursor_right; | |
304 | ||
305 | /* See #define above */ | |
306 | u64 cont_reading_from_srcdev_mode; | |
307 | ||
308 | int is_valid; | |
309 | int item_needs_writeback; | |
310 | struct btrfs_device *srcdev; | |
311 | struct btrfs_device *tgtdev; | |
312 | ||
313 | struct mutex lock_finishing_cancel_unmount; | |
314 | struct rw_semaphore rwsem; | |
315 | ||
316 | struct btrfs_scrub_progress scrub_progress; | |
317 | ||
318 | struct percpu_counter bio_counter; | |
319 | wait_queue_head_t replace_wait; | |
8cca35cb JT |
320 | |
321 | struct task_struct *replace_task; | |
a56159d4 JB |
322 | }; |
323 | ||
324 | /* | |
325 | * Free clusters are used to claim free space in relatively large chunks, | |
326 | * allowing us to do less seeky writes. They are used for all metadata | |
327 | * allocations. In ssd_spread mode they are also used for data allocations. | |
328 | */ | |
329 | struct btrfs_free_cluster { | |
330 | spinlock_t lock; | |
331 | spinlock_t refill_lock; | |
332 | struct rb_root root; | |
333 | ||
334 | /* Largest extent in this cluster */ | |
335 | u64 max_size; | |
336 | ||
337 | /* First extent starting offset */ | |
338 | u64 window_start; | |
339 | ||
340 | /* We did a full search and couldn't create a cluster */ | |
341 | bool fragmented; | |
342 | ||
343 | struct btrfs_block_group *block_group; | |
344 | /* | |
345 | * When a cluster is allocated from a block group, we put the cluster | |
346 | * onto a list in the block group so that it can be freed before the | |
347 | * block group is freed. | |
348 | */ | |
349 | struct list_head block_group_list; | |
350 | }; | |
351 | ||
352 | /* Discard control. */ | |
353 | /* | |
354 | * Async discard uses multiple lists to differentiate the discard filter | |
355 | * parameters. Index 0 is for completely free block groups where we need to | |
356 | * ensure the entire block group is trimmed without being lossy. Indices | |
357 | * afterwards represent monotonically decreasing discard filter sizes to | |
358 | * prioritize what should be discarded next. | |
359 | */ | |
360 | #define BTRFS_NR_DISCARD_LISTS 3 | |
361 | #define BTRFS_DISCARD_INDEX_UNUSED 0 | |
362 | #define BTRFS_DISCARD_INDEX_START 1 | |
363 | ||
364 | struct btrfs_discard_ctl { | |
365 | struct workqueue_struct *discard_workers; | |
366 | struct delayed_work work; | |
367 | spinlock_t lock; | |
368 | struct btrfs_block_group *block_group; | |
369 | struct list_head discard_list[BTRFS_NR_DISCARD_LISTS]; | |
370 | u64 prev_discard; | |
371 | u64 prev_discard_time; | |
372 | atomic_t discardable_extents; | |
373 | atomic64_t discardable_bytes; | |
374 | u64 max_discard_size; | |
375 | u64 delay_ms; | |
376 | u32 iops_limit; | |
377 | u32 kbps_limit; | |
378 | u64 discard_extent_bytes; | |
379 | u64 discard_bitmap_bytes; | |
380 | atomic64_t discard_bytes_saved; | |
381 | }; | |
382 | ||
383 | /* | |
384 | * Exclusive operations (device replace, resize, device add/remove, balance) | |
385 | */ | |
386 | enum btrfs_exclusive_operation { | |
387 | BTRFS_EXCLOP_NONE, | |
388 | BTRFS_EXCLOP_BALANCE_PAUSED, | |
389 | BTRFS_EXCLOP_BALANCE, | |
390 | BTRFS_EXCLOP_DEV_ADD, | |
391 | BTRFS_EXCLOP_DEV_REMOVE, | |
392 | BTRFS_EXCLOP_DEV_REPLACE, | |
393 | BTRFS_EXCLOP_RESIZE, | |
394 | BTRFS_EXCLOP_SWAP_ACTIVATE, | |
395 | }; | |
396 | ||
397 | /* Store data about transaction commits, exported via sysfs. */ | |
398 | struct btrfs_commit_stats { | |
399 | /* Total number of commits */ | |
400 | u64 commit_count; | |
401 | /* The maximum commit duration so far in ns */ | |
402 | u64 max_commit_dur; | |
403 | /* The last commit duration in ns */ | |
404 | u64 last_commit_dur; | |
405 | /* The total commit duration in ns */ | |
406 | u64 total_commit_dur; | |
407 | }; | |
408 | ||
409 | struct btrfs_fs_info { | |
410 | u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; | |
411 | unsigned long flags; | |
412 | struct btrfs_root *tree_root; | |
413 | struct btrfs_root *chunk_root; | |
414 | struct btrfs_root *dev_root; | |
415 | struct btrfs_root *fs_root; | |
416 | struct btrfs_root *quota_root; | |
417 | struct btrfs_root *uuid_root; | |
418 | struct btrfs_root *data_reloc_root; | |
419 | struct btrfs_root *block_group_root; | |
51502090 | 420 | struct btrfs_root *stripe_root; |
a56159d4 JB |
421 | |
422 | /* The log root tree is a directory of all the other log roots */ | |
423 | struct btrfs_root *log_root_tree; | |
424 | ||
425 | /* The tree that holds the global roots (csum, extent, etc) */ | |
426 | rwlock_t global_root_lock; | |
427 | struct rb_root global_root_tree; | |
428 | ||
429 | spinlock_t fs_roots_radix_lock; | |
430 | struct radix_tree_root fs_roots_radix; | |
431 | ||
432 | /* Block group cache stuff */ | |
433 | rwlock_t block_group_cache_lock; | |
434 | struct rb_root_cached block_group_cache_tree; | |
435 | ||
436 | /* Keep track of unallocated space */ | |
437 | atomic64_t free_chunk_space; | |
438 | ||
439 | /* Track ranges which are used by log trees blocks/logged data extents */ | |
440 | struct extent_io_tree excluded_extents; | |
441 | ||
442 | /* logical->physical extent mapping */ | |
7dc66abb FM |
443 | struct rb_root_cached mapping_tree; |
444 | rwlock_t mapping_tree_lock; | |
a56159d4 JB |
445 | |
446 | /* | |
447 | * Block reservation for extent, checksum, root tree and delayed dir | |
448 | * index item. | |
449 | */ | |
450 | struct btrfs_block_rsv global_block_rsv; | |
451 | /* Block reservation for metadata operations */ | |
452 | struct btrfs_block_rsv trans_block_rsv; | |
453 | /* Block reservation for chunk tree */ | |
454 | struct btrfs_block_rsv chunk_block_rsv; | |
455 | /* Block reservation for delayed operations */ | |
456 | struct btrfs_block_rsv delayed_block_rsv; | |
457 | /* Block reservation for delayed refs */ | |
458 | struct btrfs_block_rsv delayed_refs_rsv; | |
459 | ||
460 | struct btrfs_block_rsv empty_block_rsv; | |
461 | ||
4a4f8fe2 FM |
462 | /* |
463 | * Updated while holding the lock 'trans_lock'. Due to the life cycle of | |
464 | * a transaction, it can be directly read while holding a transaction | |
465 | * handle, everywhere else must be read with btrfs_get_fs_generation(). | |
466 | * Should always be updated using btrfs_set_fs_generation(). | |
467 | */ | |
a56159d4 | 468 | u64 generation; |
0124855f FM |
469 | /* |
470 | * Always use btrfs_get_last_trans_committed() and | |
471 | * btrfs_set_last_trans_committed() to read and update this field. | |
472 | */ | |
a56159d4 JB |
473 | u64 last_trans_committed; |
474 | /* | |
475 | * Generation of the last transaction used for block group relocation | |
476 | * since the filesystem was last mounted (or 0 if none happened yet). | |
477 | * Must be written and read while holding btrfs_fs_info::commit_root_sem. | |
478 | */ | |
479 | u64 last_reloc_trans; | |
a56159d4 JB |
480 | |
481 | /* | |
482 | * This is updated to the current trans every time a full commit is | |
483 | * required instead of the faster short fsync log commits | |
484 | */ | |
485 | u64 last_trans_log_full_commit; | |
c3ece6b7 | 486 | unsigned long long mount_opt; |
a56159d4 JB |
487 | |
488 | unsigned long compress_type:4; | |
489 | unsigned int compress_level; | |
490 | u32 commit_interval; | |
491 | /* | |
492 | * It is a suggestive number, the read side is safe even it gets a | |
493 | * wrong number because we will write out the data into a regular | |
494 | * extent. The write side(mount/remount) is under ->s_umount lock, | |
495 | * so it is also safe. | |
496 | */ | |
497 | u64 max_inline; | |
498 | ||
499 | struct btrfs_transaction *running_transaction; | |
500 | wait_queue_head_t transaction_throttle; | |
501 | wait_queue_head_t transaction_wait; | |
502 | wait_queue_head_t transaction_blocked_wait; | |
503 | wait_queue_head_t async_submit_wait; | |
504 | ||
505 | /* | |
506 | * Used to protect the incompat_flags, compat_flags, compat_ro_flags | |
507 | * when they are updated. | |
508 | * | |
509 | * Because we do not clear the flags for ever, so we needn't use | |
510 | * the lock on the read side. | |
511 | * | |
512 | * We also needn't use the lock when we mount the fs, because | |
513 | * there is no other task which will update the flag. | |
514 | */ | |
515 | spinlock_t super_lock; | |
516 | struct btrfs_super_block *super_copy; | |
517 | struct btrfs_super_block *super_for_commit; | |
518 | struct super_block *sb; | |
519 | struct inode *btree_inode; | |
520 | struct mutex tree_log_mutex; | |
521 | struct mutex transaction_kthread_mutex; | |
522 | struct mutex cleaner_mutex; | |
523 | struct mutex chunk_mutex; | |
524 | ||
525 | /* | |
526 | * This is taken to make sure we don't set block groups ro after the | |
527 | * free space cache has been allocated on them. | |
528 | */ | |
529 | struct mutex ro_block_group_mutex; | |
530 | ||
531 | /* | |
532 | * This is used during read/modify/write to make sure no two ios are | |
533 | * trying to mod the same stripe at the same time. | |
534 | */ | |
535 | struct btrfs_stripe_hash_table *stripe_hash_table; | |
536 | ||
537 | /* | |
538 | * This protects the ordered operations list only while we are | |
539 | * processing all of the entries on it. This way we make sure the | |
540 | * commit code doesn't find the list temporarily empty because another | |
541 | * function happens to be doing non-waiting preflush before jumping | |
542 | * into the main commit. | |
543 | */ | |
544 | struct mutex ordered_operations_mutex; | |
545 | ||
546 | struct rw_semaphore commit_root_sem; | |
547 | ||
548 | struct rw_semaphore cleanup_work_sem; | |
549 | ||
550 | struct rw_semaphore subvol_sem; | |
551 | ||
552 | spinlock_t trans_lock; | |
553 | /* | |
554 | * The reloc mutex goes with the trans lock, it is taken during commit | |
555 | * to protect us from the relocation code. | |
556 | */ | |
557 | struct mutex reloc_mutex; | |
558 | ||
559 | struct list_head trans_list; | |
560 | struct list_head dead_roots; | |
561 | struct list_head caching_block_groups; | |
562 | ||
563 | spinlock_t delayed_iput_lock; | |
564 | struct list_head delayed_iputs; | |
565 | atomic_t nr_delayed_iputs; | |
566 | wait_queue_head_t delayed_iputs_wait; | |
567 | ||
568 | atomic64_t tree_mod_seq; | |
569 | ||
570 | /* This protects tree_mod_log and tree_mod_seq_list */ | |
571 | rwlock_t tree_mod_log_lock; | |
572 | struct rb_root tree_mod_log; | |
573 | struct list_head tree_mod_seq_list; | |
574 | ||
575 | atomic_t async_delalloc_pages; | |
576 | ||
577 | /* This is used to protect the following list -- ordered_roots. */ | |
578 | spinlock_t ordered_root_lock; | |
579 | ||
580 | /* | |
581 | * All fs/file tree roots in which there are data=ordered extents | |
582 | * pending writeback are added into this list. | |
583 | * | |
584 | * These can span multiple transactions and basically include every | |
585 | * dirty data page that isn't from nodatacow. | |
586 | */ | |
587 | struct list_head ordered_roots; | |
588 | ||
589 | struct mutex delalloc_root_mutex; | |
590 | spinlock_t delalloc_root_lock; | |
591 | /* All fs/file tree roots that have delalloc inodes. */ | |
592 | struct list_head delalloc_roots; | |
593 | ||
594 | /* | |
595 | * There is a pool of worker threads for checksumming during writes and | |
596 | * a pool for checksumming after reads. This is because readers can | |
597 | * run with FS locks held, and the writers may be waiting for those | |
598 | * locks. We don't want ordering in the pending list to cause | |
599 | * deadlocks, and so the two are serviced separately. | |
600 | * | |
601 | * A third pool does submit_bio to avoid deadlocking with the other two. | |
602 | */ | |
603 | struct btrfs_workqueue *workers; | |
a56159d4 JB |
604 | struct btrfs_workqueue *delalloc_workers; |
605 | struct btrfs_workqueue *flush_workers; | |
606 | struct workqueue_struct *endio_workers; | |
607 | struct workqueue_struct *endio_meta_workers; | |
a56159d4 JB |
608 | struct workqueue_struct *rmw_workers; |
609 | struct workqueue_struct *compressed_write_workers; | |
610 | struct btrfs_workqueue *endio_write_workers; | |
611 | struct btrfs_workqueue *endio_freespace_worker; | |
612 | struct btrfs_workqueue *caching_workers; | |
613 | ||
614 | /* | |
615 | * Fixup workers take dirty pages that didn't properly go through the | |
616 | * cow mechanism and make them safe to write. It happens for the | |
617 | * sys_munmap function call path. | |
618 | */ | |
619 | struct btrfs_workqueue *fixup_workers; | |
620 | struct btrfs_workqueue *delayed_workers; | |
621 | ||
622 | struct task_struct *transaction_kthread; | |
623 | struct task_struct *cleaner_kthread; | |
624 | u32 thread_pool_size; | |
625 | ||
626 | struct kobject *space_info_kobj; | |
627 | struct kobject *qgroups_kobj; | |
628 | struct kobject *discard_kobj; | |
629 | ||
22fb0d99 AJ |
630 | /* Track the number of blocks (sectors) read by the filesystem. */ |
631 | struct percpu_counter stats_read_blocks; | |
632 | ||
a56159d4 JB |
633 | /* Used to keep from writing metadata until there is a nice batch */ |
634 | struct percpu_counter dirty_metadata_bytes; | |
635 | struct percpu_counter delalloc_bytes; | |
636 | struct percpu_counter ordered_bytes; | |
637 | s32 dirty_metadata_batch; | |
638 | s32 delalloc_batch; | |
639 | ||
f1d97e76 | 640 | struct percpu_counter evictable_extent_maps; |
e7fa8450 FM |
641 | u64 em_shrinker_last_root; |
642 | u64 em_shrinker_last_ino; | |
643 | atomic64_t em_shrinker_nr_to_scan; | |
644 | struct work_struct em_shrinker_work; | |
f1d97e76 | 645 | |
08eb2ad9 | 646 | /* Protected by 'trans_lock'. */ |
a56159d4 JB |
647 | struct list_head dirty_cowonly_roots; |
648 | ||
649 | struct btrfs_fs_devices *fs_devices; | |
650 | ||
651 | /* | |
652 | * The space_info list is effectively read only after initial setup. | |
653 | * It is populated at mount time and cleaned up after all block groups | |
654 | * are removed. RCU is used to protect it. | |
655 | */ | |
656 | struct list_head space_info; | |
657 | ||
658 | struct btrfs_space_info *data_sinfo; | |
659 | ||
660 | struct reloc_control *reloc_ctl; | |
661 | ||
662 | /* data_alloc_cluster is only used in ssd_spread mode */ | |
663 | struct btrfs_free_cluster data_alloc_cluster; | |
664 | ||
665 | /* All metadata allocations go through this cluster. */ | |
666 | struct btrfs_free_cluster meta_alloc_cluster; | |
667 | ||
668 | /* Auto defrag inodes go here. */ | |
669 | spinlock_t defrag_inodes_lock; | |
670 | struct rb_root defrag_inodes; | |
671 | atomic_t defrag_running; | |
672 | ||
673 | /* Used to protect avail_{data, metadata, system}_alloc_bits */ | |
674 | seqlock_t profiles_lock; | |
675 | /* | |
676 | * These three are in extended format (availability of single chunks is | |
677 | * denoted by BTRFS_AVAIL_ALLOC_BIT_SINGLE bit, other types are denoted | |
678 | * by corresponding BTRFS_BLOCK_GROUP_* bits) | |
679 | */ | |
680 | u64 avail_data_alloc_bits; | |
681 | u64 avail_metadata_alloc_bits; | |
682 | u64 avail_system_alloc_bits; | |
683 | ||
684 | /* Balance state */ | |
685 | spinlock_t balance_lock; | |
686 | struct mutex balance_mutex; | |
687 | atomic_t balance_pause_req; | |
688 | atomic_t balance_cancel_req; | |
689 | struct btrfs_balance_control *balance_ctl; | |
690 | wait_queue_head_t balance_wait_q; | |
691 | ||
692 | /* Cancellation requests for chunk relocation */ | |
693 | atomic_t reloc_cancel_req; | |
694 | ||
695 | u32 data_chunk_allocations; | |
696 | u32 metadata_ratio; | |
697 | ||
698 | void *bdev_holder; | |
699 | ||
700 | /* Private scrub information */ | |
701 | struct mutex scrub_lock; | |
702 | atomic_t scrubs_running; | |
703 | atomic_t scrub_pause_req; | |
704 | atomic_t scrubs_paused; | |
705 | atomic_t scrub_cancel_req; | |
706 | wait_queue_head_t scrub_pause_wait; | |
707 | /* | |
708 | * The worker pointers are NULL iff the refcount is 0, ie. scrub is not | |
709 | * running. | |
710 | */ | |
711 | refcount_t scrub_workers_refcnt; | |
ce4a71ee | 712 | u32 sectors_per_page; |
a56159d4 | 713 | struct workqueue_struct *scrub_workers; |
a56159d4 JB |
714 | |
715 | struct btrfs_discard_ctl discard_ctl; | |
716 | ||
a56159d4 JB |
717 | /* Is qgroup tracking in a consistent state? */ |
718 | u64 qgroup_flags; | |
719 | ||
720 | /* Holds configuration and tracking. Protected by qgroup_lock. */ | |
721 | struct rb_root qgroup_tree; | |
722 | spinlock_t qgroup_lock; | |
723 | ||
724 | /* | |
725 | * Used to avoid frequently calling ulist_alloc()/ulist_free() | |
726 | * when doing qgroup accounting, it must be protected by qgroup_lock. | |
727 | */ | |
728 | struct ulist *qgroup_ulist; | |
729 | ||
730 | /* | |
731 | * Protect user change for quota operations. If a transaction is needed, | |
732 | * it must be started before locking this lock. | |
733 | */ | |
734 | struct mutex qgroup_ioctl_lock; | |
735 | ||
736 | /* List of dirty qgroups to be written at next commit. */ | |
737 | struct list_head dirty_qgroups; | |
738 | ||
739 | /* Used by qgroup for an efficient tree traversal. */ | |
740 | u64 qgroup_seq; | |
741 | ||
742 | /* Qgroup rescan items. */ | |
743 | /* Protects the progress item */ | |
744 | struct mutex qgroup_rescan_lock; | |
745 | struct btrfs_key qgroup_rescan_progress; | |
746 | struct btrfs_workqueue *qgroup_rescan_workers; | |
747 | struct completion qgroup_rescan_completion; | |
748 | struct btrfs_work qgroup_rescan_work; | |
749 | /* Protected by qgroup_rescan_lock */ | |
750 | bool qgroup_rescan_running; | |
751 | u8 qgroup_drop_subtree_thres; | |
bd7c1ea3 | 752 | u64 qgroup_enable_gen; |
a56159d4 | 753 | |
ae3364e5 FM |
754 | /* |
755 | * If this is not 0, then it indicates a serious filesystem error has | |
756 | * happened and it contains that error (negative errno value). | |
757 | */ | |
758 | int fs_error; | |
759 | ||
a56159d4 JB |
760 | /* Filesystem state */ |
761 | unsigned long fs_state; | |
762 | ||
763 | struct btrfs_delayed_root *delayed_root; | |
764 | ||
765 | /* Extent buffer radix tree */ | |
766 | spinlock_t buffer_lock; | |
767 | /* Entries are eb->start / sectorsize */ | |
768 | struct radix_tree_root buffer_radix; | |
769 | ||
770 | /* Next backup root to be overwritten */ | |
771 | int backup_root_index; | |
772 | ||
773 | /* Device replace state */ | |
774 | struct btrfs_dev_replace dev_replace; | |
775 | ||
776 | struct semaphore uuid_tree_rescan_sem; | |
777 | ||
778 | /* Used to reclaim the metadata space in the background. */ | |
779 | struct work_struct async_reclaim_work; | |
780 | struct work_struct async_data_reclaim_work; | |
781 | struct work_struct preempt_reclaim_work; | |
782 | ||
783 | /* Reclaim partially filled block groups in the background */ | |
784 | struct work_struct reclaim_bgs_work; | |
4d945011 | 785 | /* Protected by unused_bgs_lock. */ |
a56159d4 JB |
786 | struct list_head reclaim_bgs; |
787 | int bg_reclaim_threshold; | |
788 | ||
4d945011 | 789 | /* Protects the lists unused_bgs and reclaim_bgs. */ |
a56159d4 | 790 | spinlock_t unused_bgs_lock; |
4d945011 | 791 | /* Protected by unused_bgs_lock. */ |
a56159d4 JB |
792 | struct list_head unused_bgs; |
793 | struct mutex unused_bg_unpin_mutex; | |
794 | /* Protect block groups that are going to be deleted */ | |
795 | struct mutex reclaim_bgs_lock; | |
796 | ||
797 | /* Cached block sizes */ | |
798 | u32 nodesize; | |
799 | u32 sectorsize; | |
800 | /* ilog2 of sectorsize, use to avoid 64bit division */ | |
801 | u32 sectorsize_bits; | |
802 | u32 csum_size; | |
803 | u32 csums_per_leaf; | |
804 | u32 stripesize; | |
805 | ||
806 | /* | |
807 | * Maximum size of an extent. BTRFS_MAX_EXTENT_SIZE on regular | |
808 | * filesystem, on zoned it depends on the device constraints. | |
809 | */ | |
810 | u64 max_extent_size; | |
811 | ||
812 | /* Block groups and devices containing active swapfiles. */ | |
813 | spinlock_t swapfile_pins_lock; | |
814 | struct rb_root swapfile_pins; | |
815 | ||
816 | struct crypto_shash *csum_shash; | |
817 | ||
818 | /* Type of exclusive operation running, protected by super_lock */ | |
819 | enum btrfs_exclusive_operation exclusive_operation; | |
820 | ||
821 | /* | |
822 | * Zone size > 0 when in ZONED mode, otherwise it's used for a check | |
823 | * if the mode is enabled | |
824 | */ | |
825 | u64 zone_size; | |
826 | ||
243cf8d1 CH |
827 | /* Constraints for ZONE_APPEND commands: */ |
828 | struct queue_limits limits; | |
a56159d4 | 829 | u64 max_zone_append_size; |
243cf8d1 | 830 | |
a56159d4 JB |
831 | struct mutex zoned_meta_io_lock; |
832 | spinlock_t treelog_bg_lock; | |
833 | u64 treelog_bg; | |
834 | ||
835 | /* | |
836 | * Start of the dedicated data relocation block group, protected by | |
837 | * relocation_bg_lock. | |
838 | */ | |
839 | spinlock_t relocation_bg_lock; | |
840 | u64 data_reloc_bg; | |
841 | struct mutex zoned_data_reloc_io_lock; | |
842 | ||
13bb483d NA |
843 | struct btrfs_block_group *active_meta_bg; |
844 | struct btrfs_block_group *active_system_bg; | |
845 | ||
a56159d4 JB |
846 | u64 nr_global_roots; |
847 | ||
848 | spinlock_t zone_active_bgs_lock; | |
849 | struct list_head zone_active_bgs; | |
850 | ||
851 | /* Updates are not protected by any lock */ | |
852 | struct btrfs_commit_stats commit_stats; | |
853 | ||
854 | /* | |
855 | * Last generation where we dropped a non-relocation root. | |
856 | * Use btrfs_set_last_root_drop_gen() and btrfs_get_last_root_drop_gen() | |
857 | * to change it and to read it, respectively. | |
858 | */ | |
859 | u64 last_root_drop_gen; | |
860 | ||
861 | /* | |
862 | * Annotations for transaction events (structures are empty when | |
863 | * compiled without lockdep). | |
864 | */ | |
865 | struct lockdep_map btrfs_trans_num_writers_map; | |
866 | struct lockdep_map btrfs_trans_num_extwriters_map; | |
867 | struct lockdep_map btrfs_state_change_map[4]; | |
868 | struct lockdep_map btrfs_trans_pending_ordered_map; | |
869 | struct lockdep_map btrfs_ordered_extent_map; | |
870 | ||
871 | #ifdef CONFIG_BTRFS_FS_REF_VERIFY | |
872 | spinlock_t ref_verify_lock; | |
873 | struct rb_root block_tree; | |
874 | #endif | |
875 | ||
876 | #ifdef CONFIG_BTRFS_DEBUG | |
877 | struct kobject *debug_kobj; | |
878 | struct list_head allocated_roots; | |
879 | ||
880 | spinlock_t eb_leak_lock; | |
881 | struct list_head allocated_ebs; | |
882 | #endif | |
883 | }; | |
884 | ||
c8293894 DS |
885 | #define folio_to_inode(_folio) (BTRFS_I(_Generic((_folio), \ |
886 | struct folio *: (_folio))->mapping->host)) | |
887 | ||
b33d2e53 DS |
888 | #define folio_to_fs_info(_folio) (folio_to_inode(_folio)->root->fs_info) |
889 | ||
41044b41 DS |
890 | #define inode_to_fs_info(_inode) (BTRFS_I(_Generic((_inode), \ |
891 | struct inode *: (_inode)))->root->fs_info) | |
892 | ||
378f25d3 FM |
893 | static inline gfp_t btrfs_alloc_write_mask(struct address_space *mapping) |
894 | { | |
895 | return mapping_gfp_constraint(mapping, ~__GFP_FS); | |
896 | } | |
897 | ||
4a4f8fe2 FM |
898 | static inline u64 btrfs_get_fs_generation(const struct btrfs_fs_info *fs_info) |
899 | { | |
900 | return READ_ONCE(fs_info->generation); | |
901 | } | |
902 | ||
903 | static inline void btrfs_set_fs_generation(struct btrfs_fs_info *fs_info, u64 gen) | |
904 | { | |
905 | WRITE_ONCE(fs_info->generation, gen); | |
906 | } | |
907 | ||
0124855f FM |
908 | static inline u64 btrfs_get_last_trans_committed(const struct btrfs_fs_info *fs_info) |
909 | { | |
910 | return READ_ONCE(fs_info->last_trans_committed); | |
911 | } | |
912 | ||
913 | static inline void btrfs_set_last_trans_committed(struct btrfs_fs_info *fs_info, u64 gen) | |
914 | { | |
915 | WRITE_ONCE(fs_info->last_trans_committed, gen); | |
916 | } | |
917 | ||
a56159d4 JB |
918 | static inline void btrfs_set_last_root_drop_gen(struct btrfs_fs_info *fs_info, |
919 | u64 gen) | |
920 | { | |
921 | WRITE_ONCE(fs_info->last_root_drop_gen, gen); | |
922 | } | |
923 | ||
924 | static inline u64 btrfs_get_last_root_drop_gen(const struct btrfs_fs_info *fs_info) | |
925 | { | |
926 | return READ_ONCE(fs_info->last_root_drop_gen); | |
927 | } | |
928 | ||
a56159d4 JB |
929 | /* |
930 | * Take the number of bytes to be checksummed and figure out how many leaves | |
931 | * it would require to store the csums for that many bytes. | |
932 | */ | |
933 | static inline u64 btrfs_csum_bytes_to_leaves( | |
934 | const struct btrfs_fs_info *fs_info, u64 csum_bytes) | |
935 | { | |
936 | const u64 num_csums = csum_bytes >> fs_info->sectorsize_bits; | |
937 | ||
938 | return DIV_ROUND_UP_ULL(num_csums, fs_info->csums_per_leaf); | |
939 | } | |
940 | ||
941 | /* | |
942 | * Use this if we would be adding new items, as we could split nodes as we cow | |
943 | * down the tree. | |
944 | */ | |
d1085c9c | 945 | static inline u64 btrfs_calc_insert_metadata_size(const struct btrfs_fs_info *fs_info, |
a56159d4 JB |
946 | unsigned num_items) |
947 | { | |
948 | return (u64)fs_info->nodesize * BTRFS_MAX_LEVEL * 2 * num_items; | |
949 | } | |
950 | ||
951 | /* | |
952 | * Doing a truncate or a modification won't result in new nodes or leaves, just | |
953 | * what we need for COW. | |
954 | */ | |
d1085c9c | 955 | static inline u64 btrfs_calc_metadata_size(const struct btrfs_fs_info *fs_info, |
a56159d4 JB |
956 | unsigned num_items) |
957 | { | |
958 | return (u64)fs_info->nodesize * BTRFS_MAX_LEVEL * num_items; | |
959 | } | |
960 | ||
961 | #define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r->fs_info) >> 4) - \ | |
962 | sizeof(struct btrfs_item)) | |
963 | ||
a4545b74 FM |
964 | #define BTRFS_BYTES_TO_BLKS(fs_info, bytes) ((bytes) >> (fs_info)->sectorsize_bits) |
965 | ||
a56159d4 JB |
966 | static inline bool btrfs_is_zoned(const struct btrfs_fs_info *fs_info) |
967 | { | |
dd8b7b04 | 968 | return IS_ENABLED(CONFIG_BLK_DEV_ZONED) && fs_info->zone_size > 0; |
a56159d4 JB |
969 | } |
970 | ||
971 | /* | |
972 | * Count how many fs_info->max_extent_size cover the @size | |
973 | */ | |
2917f741 | 974 | static inline u32 count_max_extents(const struct btrfs_fs_info *fs_info, u64 size) |
a56159d4 JB |
975 | { |
976 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS | |
977 | if (!fs_info) | |
978 | return div_u64(size + BTRFS_MAX_EXTENT_SIZE - 1, BTRFS_MAX_EXTENT_SIZE); | |
979 | #endif | |
980 | ||
981 | return div_u64(size + fs_info->max_extent_size - 1, fs_info->max_extent_size); | |
982 | } | |
983 | ||
984 | bool btrfs_exclop_start(struct btrfs_fs_info *fs_info, | |
985 | enum btrfs_exclusive_operation type); | |
986 | bool btrfs_exclop_start_try_lock(struct btrfs_fs_info *fs_info, | |
987 | enum btrfs_exclusive_operation type); | |
988 | void btrfs_exclop_start_unlock(struct btrfs_fs_info *fs_info); | |
989 | void btrfs_exclop_finish(struct btrfs_fs_info *fs_info); | |
990 | void btrfs_exclop_balance(struct btrfs_fs_info *fs_info, | |
991 | enum btrfs_exclusive_operation op); | |
992 | ||
5ab2b180 DS |
993 | int btrfs_check_ioctl_vol_args_path(const struct btrfs_ioctl_vol_args *vol_args); |
994 | ||
a6f0bcf9 FM |
995 | u16 btrfs_csum_type_size(u16 type); |
996 | int btrfs_super_csum_size(const struct btrfs_super_block *s); | |
997 | const char *btrfs_super_csum_name(u16 csum_type); | |
998 | const char *btrfs_super_csum_driver(u16 csum_type); | |
999 | size_t __attribute_const__ btrfs_get_num_csums(void); | |
1000 | ||
6a2b3d7a FM |
1001 | static inline bool btrfs_is_empty_uuid(const u8 *uuid) |
1002 | { | |
1003 | return uuid_is_null((const uuid_t *)uuid); | |
1004 | } | |
a5b3f117 | 1005 | |
c7f13d42 JB |
1006 | /* Compatibility and incompatibility defines */ |
1007 | void __btrfs_set_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag, | |
1008 | const char *name); | |
1009 | void __btrfs_clear_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag, | |
1010 | const char *name); | |
1011 | void __btrfs_set_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag, | |
1012 | const char *name); | |
1013 | void __btrfs_clear_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag, | |
1014 | const char *name); | |
1015 | ||
0d3a9cf8 JB |
1016 | #define __btrfs_fs_incompat(fs_info, flags) \ |
1017 | (!!(btrfs_super_incompat_flags((fs_info)->super_copy) & (flags))) | |
1018 | ||
1019 | #define __btrfs_fs_compat_ro(fs_info, flags) \ | |
1020 | (!!(btrfs_super_compat_ro_flags((fs_info)->super_copy) & (flags))) | |
1021 | ||
c7f13d42 JB |
1022 | #define btrfs_set_fs_incompat(__fs_info, opt) \ |
1023 | __btrfs_set_fs_incompat((__fs_info), BTRFS_FEATURE_INCOMPAT_##opt, #opt) | |
1024 | ||
1025 | #define btrfs_clear_fs_incompat(__fs_info, opt) \ | |
1026 | __btrfs_clear_fs_incompat((__fs_info), BTRFS_FEATURE_INCOMPAT_##opt, #opt) | |
1027 | ||
1028 | #define btrfs_fs_incompat(fs_info, opt) \ | |
1029 | __btrfs_fs_incompat((fs_info), BTRFS_FEATURE_INCOMPAT_##opt) | |
1030 | ||
1031 | #define btrfs_set_fs_compat_ro(__fs_info, opt) \ | |
1032 | __btrfs_set_fs_compat_ro((__fs_info), BTRFS_FEATURE_COMPAT_RO_##opt, #opt) | |
1033 | ||
1034 | #define btrfs_clear_fs_compat_ro(__fs_info, opt) \ | |
1035 | __btrfs_clear_fs_compat_ro((__fs_info), BTRFS_FEATURE_COMPAT_RO_##opt, #opt) | |
1036 | ||
1037 | #define btrfs_fs_compat_ro(fs_info, opt) \ | |
1038 | __btrfs_fs_compat_ro((fs_info), BTRFS_FEATURE_COMPAT_RO_##opt) | |
1039 | ||
fc97a410 JB |
1040 | #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt) |
1041 | #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) | |
1042 | #define btrfs_raw_test_opt(o, opt) ((o) & BTRFS_MOUNT_##opt) | |
1043 | #define btrfs_test_opt(fs_info, opt) ((fs_info)->mount_opt & \ | |
1044 | BTRFS_MOUNT_##opt) | |
1045 | ||
2917f741 | 1046 | static inline int btrfs_fs_closing(const struct btrfs_fs_info *fs_info) |
c7f13d42 JB |
1047 | { |
1048 | /* Do it this way so we only ever do one test_bit in the normal case. */ | |
1049 | if (test_bit(BTRFS_FS_CLOSING_START, &fs_info->flags)) { | |
1050 | if (test_bit(BTRFS_FS_CLOSING_DONE, &fs_info->flags)) | |
1051 | return 2; | |
1052 | return 1; | |
1053 | } | |
1054 | return 0; | |
1055 | } | |
1056 | ||
1057 | /* | |
1058 | * If we remount the fs to be R/O or umount the fs, the cleaner needn't do | |
1059 | * anything except sleeping. This function is used to check the status of | |
1060 | * the fs. | |
1061 | * We check for BTRFS_FS_STATE_RO to avoid races with a concurrent remount, | |
1062 | * since setting and checking for SB_RDONLY in the superblock's flags is not | |
1063 | * atomic. | |
1064 | */ | |
2917f741 | 1065 | static inline int btrfs_need_cleaner_sleep(const struct btrfs_fs_info *fs_info) |
c7f13d42 JB |
1066 | { |
1067 | return test_bit(BTRFS_FS_STATE_RO, &fs_info->fs_state) || | |
1068 | btrfs_fs_closing(fs_info); | |
1069 | } | |
1070 | ||
7966a6b5 JB |
1071 | static inline void btrfs_wake_unfinished_drop(struct btrfs_fs_info *fs_info) |
1072 | { | |
1073 | clear_and_wake_up_bit(BTRFS_FS_UNFINISHED_DROPS, &fs_info->flags); | |
1074 | } | |
1075 | ||
ae3364e5 FM |
1076 | #define BTRFS_FS_ERROR(fs_info) (READ_ONCE((fs_info)->fs_error)) |
1077 | ||
ec8eb376 JB |
1078 | #define BTRFS_FS_LOG_CLEANUP_ERROR(fs_info) \ |
1079 | (unlikely(test_bit(BTRFS_FS_STATE_LOG_CLEANUP_ERROR, \ | |
1080 | &(fs_info)->fs_state))) | |
1081 | ||
22053022 FM |
1082 | /* |
1083 | * We use folio flag owner_2 to indicate there is an ordered extent with | |
1084 | * unfinished IO. | |
1085 | */ | |
1086 | #define folio_test_ordered(folio) folio_test_owner_2(folio) | |
1087 | #define folio_set_ordered(folio) folio_set_owner_2(folio) | |
1088 | #define folio_clear_ordered(folio) folio_clear_owner_2(folio) | |
1089 | ||
ec8eb376 | 1090 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS |
6a6b4daf JB |
1091 | |
1092 | #define EXPORT_FOR_TESTS | |
1093 | ||
2917f741 | 1094 | static inline int btrfs_is_testing(const struct btrfs_fs_info *fs_info) |
ec8eb376 JB |
1095 | { |
1096 | return test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state); | |
1097 | } | |
6a6b4daf JB |
1098 | |
1099 | void btrfs_test_destroy_inode(struct inode *inode); | |
1100 | ||
ec8eb376 | 1101 | #else |
6a6b4daf JB |
1102 | |
1103 | #define EXPORT_FOR_TESTS static | |
1104 | ||
2917f741 | 1105 | static inline int btrfs_is_testing(const struct btrfs_fs_info *fs_info) |
ec8eb376 JB |
1106 | { |
1107 | return 0; | |
1108 | } | |
1109 | #endif | |
1110 | ||
c7f13d42 | 1111 | #endif |