]>
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> | |
17 | #include <linux/rwlock_types.h> | |
18 | #include <linux/rwsem.h> | |
19 | #include <linux/semaphore.h> | |
20 | #include <linux/list.h> | |
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 AJ |
265 | |
266 | #ifdef CONFIG_BTRFS_DEBUG | |
267 | /* | |
268 | * Features under developmen like Extent tree v2 support is enabled | |
269 | * only under CONFIG_BTRFS_DEBUG. | |
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; | |
320 | }; | |
321 | ||
322 | /* | |
323 | * Free clusters are used to claim free space in relatively large chunks, | |
324 | * allowing us to do less seeky writes. They are used for all metadata | |
325 | * allocations. In ssd_spread mode they are also used for data allocations. | |
326 | */ | |
327 | struct btrfs_free_cluster { | |
328 | spinlock_t lock; | |
329 | spinlock_t refill_lock; | |
330 | struct rb_root root; | |
331 | ||
332 | /* Largest extent in this cluster */ | |
333 | u64 max_size; | |
334 | ||
335 | /* First extent starting offset */ | |
336 | u64 window_start; | |
337 | ||
338 | /* We did a full search and couldn't create a cluster */ | |
339 | bool fragmented; | |
340 | ||
341 | struct btrfs_block_group *block_group; | |
342 | /* | |
343 | * When a cluster is allocated from a block group, we put the cluster | |
344 | * onto a list in the block group so that it can be freed before the | |
345 | * block group is freed. | |
346 | */ | |
347 | struct list_head block_group_list; | |
348 | }; | |
349 | ||
350 | /* Discard control. */ | |
351 | /* | |
352 | * Async discard uses multiple lists to differentiate the discard filter | |
353 | * parameters. Index 0 is for completely free block groups where we need to | |
354 | * ensure the entire block group is trimmed without being lossy. Indices | |
355 | * afterwards represent monotonically decreasing discard filter sizes to | |
356 | * prioritize what should be discarded next. | |
357 | */ | |
358 | #define BTRFS_NR_DISCARD_LISTS 3 | |
359 | #define BTRFS_DISCARD_INDEX_UNUSED 0 | |
360 | #define BTRFS_DISCARD_INDEX_START 1 | |
361 | ||
362 | struct btrfs_discard_ctl { | |
363 | struct workqueue_struct *discard_workers; | |
364 | struct delayed_work work; | |
365 | spinlock_t lock; | |
366 | struct btrfs_block_group *block_group; | |
367 | struct list_head discard_list[BTRFS_NR_DISCARD_LISTS]; | |
368 | u64 prev_discard; | |
369 | u64 prev_discard_time; | |
370 | atomic_t discardable_extents; | |
371 | atomic64_t discardable_bytes; | |
372 | u64 max_discard_size; | |
373 | u64 delay_ms; | |
374 | u32 iops_limit; | |
375 | u32 kbps_limit; | |
376 | u64 discard_extent_bytes; | |
377 | u64 discard_bitmap_bytes; | |
378 | atomic64_t discard_bytes_saved; | |
379 | }; | |
380 | ||
381 | /* | |
382 | * Exclusive operations (device replace, resize, device add/remove, balance) | |
383 | */ | |
384 | enum btrfs_exclusive_operation { | |
385 | BTRFS_EXCLOP_NONE, | |
386 | BTRFS_EXCLOP_BALANCE_PAUSED, | |
387 | BTRFS_EXCLOP_BALANCE, | |
388 | BTRFS_EXCLOP_DEV_ADD, | |
389 | BTRFS_EXCLOP_DEV_REMOVE, | |
390 | BTRFS_EXCLOP_DEV_REPLACE, | |
391 | BTRFS_EXCLOP_RESIZE, | |
392 | BTRFS_EXCLOP_SWAP_ACTIVATE, | |
393 | }; | |
394 | ||
395 | /* Store data about transaction commits, exported via sysfs. */ | |
396 | struct btrfs_commit_stats { | |
397 | /* Total number of commits */ | |
398 | u64 commit_count; | |
399 | /* The maximum commit duration so far in ns */ | |
400 | u64 max_commit_dur; | |
401 | /* The last commit duration in ns */ | |
402 | u64 last_commit_dur; | |
403 | /* The total commit duration in ns */ | |
404 | u64 total_commit_dur; | |
405 | }; | |
406 | ||
407 | struct btrfs_fs_info { | |
408 | u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; | |
409 | unsigned long flags; | |
410 | struct btrfs_root *tree_root; | |
411 | struct btrfs_root *chunk_root; | |
412 | struct btrfs_root *dev_root; | |
413 | struct btrfs_root *fs_root; | |
414 | struct btrfs_root *quota_root; | |
415 | struct btrfs_root *uuid_root; | |
416 | struct btrfs_root *data_reloc_root; | |
417 | struct btrfs_root *block_group_root; | |
51502090 | 418 | struct btrfs_root *stripe_root; |
a56159d4 JB |
419 | |
420 | /* The log root tree is a directory of all the other log roots */ | |
421 | struct btrfs_root *log_root_tree; | |
422 | ||
423 | /* The tree that holds the global roots (csum, extent, etc) */ | |
424 | rwlock_t global_root_lock; | |
425 | struct rb_root global_root_tree; | |
426 | ||
427 | spinlock_t fs_roots_radix_lock; | |
428 | struct radix_tree_root fs_roots_radix; | |
429 | ||
430 | /* Block group cache stuff */ | |
431 | rwlock_t block_group_cache_lock; | |
432 | struct rb_root_cached block_group_cache_tree; | |
433 | ||
434 | /* Keep track of unallocated space */ | |
435 | atomic64_t free_chunk_space; | |
436 | ||
437 | /* Track ranges which are used by log trees blocks/logged data extents */ | |
438 | struct extent_io_tree excluded_extents; | |
439 | ||
440 | /* logical->physical extent mapping */ | |
7dc66abb FM |
441 | struct rb_root_cached mapping_tree; |
442 | rwlock_t mapping_tree_lock; | |
a56159d4 JB |
443 | |
444 | /* | |
445 | * Block reservation for extent, checksum, root tree and delayed dir | |
446 | * index item. | |
447 | */ | |
448 | struct btrfs_block_rsv global_block_rsv; | |
449 | /* Block reservation for metadata operations */ | |
450 | struct btrfs_block_rsv trans_block_rsv; | |
451 | /* Block reservation for chunk tree */ | |
452 | struct btrfs_block_rsv chunk_block_rsv; | |
453 | /* Block reservation for delayed operations */ | |
454 | struct btrfs_block_rsv delayed_block_rsv; | |
455 | /* Block reservation for delayed refs */ | |
456 | struct btrfs_block_rsv delayed_refs_rsv; | |
457 | ||
458 | struct btrfs_block_rsv empty_block_rsv; | |
459 | ||
4a4f8fe2 FM |
460 | /* |
461 | * Updated while holding the lock 'trans_lock'. Due to the life cycle of | |
462 | * a transaction, it can be directly read while holding a transaction | |
463 | * handle, everywhere else must be read with btrfs_get_fs_generation(). | |
464 | * Should always be updated using btrfs_set_fs_generation(). | |
465 | */ | |
a56159d4 | 466 | u64 generation; |
0124855f FM |
467 | /* |
468 | * Always use btrfs_get_last_trans_committed() and | |
469 | * btrfs_set_last_trans_committed() to read and update this field. | |
470 | */ | |
a56159d4 JB |
471 | u64 last_trans_committed; |
472 | /* | |
473 | * Generation of the last transaction used for block group relocation | |
474 | * since the filesystem was last mounted (or 0 if none happened yet). | |
475 | * Must be written and read while holding btrfs_fs_info::commit_root_sem. | |
476 | */ | |
477 | u64 last_reloc_trans; | |
a56159d4 JB |
478 | |
479 | /* | |
480 | * This is updated to the current trans every time a full commit is | |
481 | * required instead of the faster short fsync log commits | |
482 | */ | |
483 | u64 last_trans_log_full_commit; | |
c3ece6b7 | 484 | unsigned long long mount_opt; |
a56159d4 JB |
485 | |
486 | unsigned long compress_type:4; | |
487 | unsigned int compress_level; | |
488 | u32 commit_interval; | |
489 | /* | |
490 | * It is a suggestive number, the read side is safe even it gets a | |
491 | * wrong number because we will write out the data into a regular | |
492 | * extent. The write side(mount/remount) is under ->s_umount lock, | |
493 | * so it is also safe. | |
494 | */ | |
495 | u64 max_inline; | |
496 | ||
497 | struct btrfs_transaction *running_transaction; | |
498 | wait_queue_head_t transaction_throttle; | |
499 | wait_queue_head_t transaction_wait; | |
500 | wait_queue_head_t transaction_blocked_wait; | |
501 | wait_queue_head_t async_submit_wait; | |
502 | ||
503 | /* | |
504 | * Used to protect the incompat_flags, compat_flags, compat_ro_flags | |
505 | * when they are updated. | |
506 | * | |
507 | * Because we do not clear the flags for ever, so we needn't use | |
508 | * the lock on the read side. | |
509 | * | |
510 | * We also needn't use the lock when we mount the fs, because | |
511 | * there is no other task which will update the flag. | |
512 | */ | |
513 | spinlock_t super_lock; | |
514 | struct btrfs_super_block *super_copy; | |
515 | struct btrfs_super_block *super_for_commit; | |
516 | struct super_block *sb; | |
517 | struct inode *btree_inode; | |
518 | struct mutex tree_log_mutex; | |
519 | struct mutex transaction_kthread_mutex; | |
520 | struct mutex cleaner_mutex; | |
521 | struct mutex chunk_mutex; | |
522 | ||
523 | /* | |
524 | * This is taken to make sure we don't set block groups ro after the | |
525 | * free space cache has been allocated on them. | |
526 | */ | |
527 | struct mutex ro_block_group_mutex; | |
528 | ||
529 | /* | |
530 | * This is used during read/modify/write to make sure no two ios are | |
531 | * trying to mod the same stripe at the same time. | |
532 | */ | |
533 | struct btrfs_stripe_hash_table *stripe_hash_table; | |
534 | ||
535 | /* | |
536 | * This protects the ordered operations list only while we are | |
537 | * processing all of the entries on it. This way we make sure the | |
538 | * commit code doesn't find the list temporarily empty because another | |
539 | * function happens to be doing non-waiting preflush before jumping | |
540 | * into the main commit. | |
541 | */ | |
542 | struct mutex ordered_operations_mutex; | |
543 | ||
544 | struct rw_semaphore commit_root_sem; | |
545 | ||
546 | struct rw_semaphore cleanup_work_sem; | |
547 | ||
548 | struct rw_semaphore subvol_sem; | |
549 | ||
550 | spinlock_t trans_lock; | |
551 | /* | |
552 | * The reloc mutex goes with the trans lock, it is taken during commit | |
553 | * to protect us from the relocation code. | |
554 | */ | |
555 | struct mutex reloc_mutex; | |
556 | ||
557 | struct list_head trans_list; | |
558 | struct list_head dead_roots; | |
559 | struct list_head caching_block_groups; | |
560 | ||
561 | spinlock_t delayed_iput_lock; | |
562 | struct list_head delayed_iputs; | |
563 | atomic_t nr_delayed_iputs; | |
564 | wait_queue_head_t delayed_iputs_wait; | |
565 | ||
566 | atomic64_t tree_mod_seq; | |
567 | ||
568 | /* This protects tree_mod_log and tree_mod_seq_list */ | |
569 | rwlock_t tree_mod_log_lock; | |
570 | struct rb_root tree_mod_log; | |
571 | struct list_head tree_mod_seq_list; | |
572 | ||
573 | atomic_t async_delalloc_pages; | |
574 | ||
575 | /* This is used to protect the following list -- ordered_roots. */ | |
576 | spinlock_t ordered_root_lock; | |
577 | ||
578 | /* | |
579 | * All fs/file tree roots in which there are data=ordered extents | |
580 | * pending writeback are added into this list. | |
581 | * | |
582 | * These can span multiple transactions and basically include every | |
583 | * dirty data page that isn't from nodatacow. | |
584 | */ | |
585 | struct list_head ordered_roots; | |
586 | ||
587 | struct mutex delalloc_root_mutex; | |
588 | spinlock_t delalloc_root_lock; | |
589 | /* All fs/file tree roots that have delalloc inodes. */ | |
590 | struct list_head delalloc_roots; | |
591 | ||
592 | /* | |
593 | * There is a pool of worker threads for checksumming during writes and | |
594 | * a pool for checksumming after reads. This is because readers can | |
595 | * run with FS locks held, and the writers may be waiting for those | |
596 | * locks. We don't want ordering in the pending list to cause | |
597 | * deadlocks, and so the two are serviced separately. | |
598 | * | |
599 | * A third pool does submit_bio to avoid deadlocking with the other two. | |
600 | */ | |
601 | struct btrfs_workqueue *workers; | |
a56159d4 JB |
602 | struct btrfs_workqueue *delalloc_workers; |
603 | struct btrfs_workqueue *flush_workers; | |
604 | struct workqueue_struct *endio_workers; | |
605 | struct workqueue_struct *endio_meta_workers; | |
a56159d4 JB |
606 | struct workqueue_struct *rmw_workers; |
607 | struct workqueue_struct *compressed_write_workers; | |
608 | struct btrfs_workqueue *endio_write_workers; | |
609 | struct btrfs_workqueue *endio_freespace_worker; | |
610 | struct btrfs_workqueue *caching_workers; | |
611 | ||
612 | /* | |
613 | * Fixup workers take dirty pages that didn't properly go through the | |
614 | * cow mechanism and make them safe to write. It happens for the | |
615 | * sys_munmap function call path. | |
616 | */ | |
617 | struct btrfs_workqueue *fixup_workers; | |
618 | struct btrfs_workqueue *delayed_workers; | |
619 | ||
620 | struct task_struct *transaction_kthread; | |
621 | struct task_struct *cleaner_kthread; | |
622 | u32 thread_pool_size; | |
623 | ||
624 | struct kobject *space_info_kobj; | |
625 | struct kobject *qgroups_kobj; | |
626 | struct kobject *discard_kobj; | |
627 | ||
628 | /* Used to keep from writing metadata until there is a nice batch */ | |
629 | struct percpu_counter dirty_metadata_bytes; | |
630 | struct percpu_counter delalloc_bytes; | |
631 | struct percpu_counter ordered_bytes; | |
632 | s32 dirty_metadata_batch; | |
633 | s32 delalloc_batch; | |
634 | ||
f1d97e76 | 635 | struct percpu_counter evictable_extent_maps; |
44849405 | 636 | spinlock_t extent_map_shrinker_lock; |
956a17d9 FM |
637 | u64 extent_map_shrinker_last_root; |
638 | u64 extent_map_shrinker_last_ino; | |
f1d97e76 | 639 | |
08eb2ad9 | 640 | /* Protected by 'trans_lock'. */ |
a56159d4 JB |
641 | struct list_head dirty_cowonly_roots; |
642 | ||
643 | struct btrfs_fs_devices *fs_devices; | |
644 | ||
645 | /* | |
646 | * The space_info list is effectively read only after initial setup. | |
647 | * It is populated at mount time and cleaned up after all block groups | |
648 | * are removed. RCU is used to protect it. | |
649 | */ | |
650 | struct list_head space_info; | |
651 | ||
652 | struct btrfs_space_info *data_sinfo; | |
653 | ||
654 | struct reloc_control *reloc_ctl; | |
655 | ||
656 | /* data_alloc_cluster is only used in ssd_spread mode */ | |
657 | struct btrfs_free_cluster data_alloc_cluster; | |
658 | ||
659 | /* All metadata allocations go through this cluster. */ | |
660 | struct btrfs_free_cluster meta_alloc_cluster; | |
661 | ||
662 | /* Auto defrag inodes go here. */ | |
663 | spinlock_t defrag_inodes_lock; | |
664 | struct rb_root defrag_inodes; | |
665 | atomic_t defrag_running; | |
666 | ||
667 | /* Used to protect avail_{data, metadata, system}_alloc_bits */ | |
668 | seqlock_t profiles_lock; | |
669 | /* | |
670 | * These three are in extended format (availability of single chunks is | |
671 | * denoted by BTRFS_AVAIL_ALLOC_BIT_SINGLE bit, other types are denoted | |
672 | * by corresponding BTRFS_BLOCK_GROUP_* bits) | |
673 | */ | |
674 | u64 avail_data_alloc_bits; | |
675 | u64 avail_metadata_alloc_bits; | |
676 | u64 avail_system_alloc_bits; | |
677 | ||
678 | /* Balance state */ | |
679 | spinlock_t balance_lock; | |
680 | struct mutex balance_mutex; | |
681 | atomic_t balance_pause_req; | |
682 | atomic_t balance_cancel_req; | |
683 | struct btrfs_balance_control *balance_ctl; | |
684 | wait_queue_head_t balance_wait_q; | |
685 | ||
686 | /* Cancellation requests for chunk relocation */ | |
687 | atomic_t reloc_cancel_req; | |
688 | ||
689 | u32 data_chunk_allocations; | |
690 | u32 metadata_ratio; | |
691 | ||
692 | void *bdev_holder; | |
693 | ||
694 | /* Private scrub information */ | |
695 | struct mutex scrub_lock; | |
696 | atomic_t scrubs_running; | |
697 | atomic_t scrub_pause_req; | |
698 | atomic_t scrubs_paused; | |
699 | atomic_t scrub_cancel_req; | |
700 | wait_queue_head_t scrub_pause_wait; | |
701 | /* | |
702 | * The worker pointers are NULL iff the refcount is 0, ie. scrub is not | |
703 | * running. | |
704 | */ | |
705 | refcount_t scrub_workers_refcnt; | |
ce4a71ee | 706 | u32 sectors_per_page; |
a56159d4 | 707 | struct workqueue_struct *scrub_workers; |
a56159d4 JB |
708 | |
709 | struct btrfs_discard_ctl discard_ctl; | |
710 | ||
a56159d4 JB |
711 | /* Is qgroup tracking in a consistent state? */ |
712 | u64 qgroup_flags; | |
713 | ||
714 | /* Holds configuration and tracking. Protected by qgroup_lock. */ | |
715 | struct rb_root qgroup_tree; | |
716 | spinlock_t qgroup_lock; | |
717 | ||
718 | /* | |
719 | * Used to avoid frequently calling ulist_alloc()/ulist_free() | |
720 | * when doing qgroup accounting, it must be protected by qgroup_lock. | |
721 | */ | |
722 | struct ulist *qgroup_ulist; | |
723 | ||
724 | /* | |
725 | * Protect user change for quota operations. If a transaction is needed, | |
726 | * it must be started before locking this lock. | |
727 | */ | |
728 | struct mutex qgroup_ioctl_lock; | |
729 | ||
730 | /* List of dirty qgroups to be written at next commit. */ | |
731 | struct list_head dirty_qgroups; | |
732 | ||
733 | /* Used by qgroup for an efficient tree traversal. */ | |
734 | u64 qgroup_seq; | |
735 | ||
736 | /* Qgroup rescan items. */ | |
737 | /* Protects the progress item */ | |
738 | struct mutex qgroup_rescan_lock; | |
739 | struct btrfs_key qgroup_rescan_progress; | |
740 | struct btrfs_workqueue *qgroup_rescan_workers; | |
741 | struct completion qgroup_rescan_completion; | |
742 | struct btrfs_work qgroup_rescan_work; | |
743 | /* Protected by qgroup_rescan_lock */ | |
744 | bool qgroup_rescan_running; | |
745 | u8 qgroup_drop_subtree_thres; | |
bd7c1ea3 | 746 | u64 qgroup_enable_gen; |
a56159d4 | 747 | |
ae3364e5 FM |
748 | /* |
749 | * If this is not 0, then it indicates a serious filesystem error has | |
750 | * happened and it contains that error (negative errno value). | |
751 | */ | |
752 | int fs_error; | |
753 | ||
a56159d4 JB |
754 | /* Filesystem state */ |
755 | unsigned long fs_state; | |
756 | ||
757 | struct btrfs_delayed_root *delayed_root; | |
758 | ||
759 | /* Extent buffer radix tree */ | |
760 | spinlock_t buffer_lock; | |
761 | /* Entries are eb->start / sectorsize */ | |
762 | struct radix_tree_root buffer_radix; | |
763 | ||
764 | /* Next backup root to be overwritten */ | |
765 | int backup_root_index; | |
766 | ||
767 | /* Device replace state */ | |
768 | struct btrfs_dev_replace dev_replace; | |
769 | ||
770 | struct semaphore uuid_tree_rescan_sem; | |
771 | ||
772 | /* Used to reclaim the metadata space in the background. */ | |
773 | struct work_struct async_reclaim_work; | |
774 | struct work_struct async_data_reclaim_work; | |
775 | struct work_struct preempt_reclaim_work; | |
776 | ||
777 | /* Reclaim partially filled block groups in the background */ | |
778 | struct work_struct reclaim_bgs_work; | |
4d945011 | 779 | /* Protected by unused_bgs_lock. */ |
a56159d4 JB |
780 | struct list_head reclaim_bgs; |
781 | int bg_reclaim_threshold; | |
782 | ||
4d945011 | 783 | /* Protects the lists unused_bgs and reclaim_bgs. */ |
a56159d4 | 784 | spinlock_t unused_bgs_lock; |
4d945011 | 785 | /* Protected by unused_bgs_lock. */ |
a56159d4 JB |
786 | struct list_head unused_bgs; |
787 | struct mutex unused_bg_unpin_mutex; | |
788 | /* Protect block groups that are going to be deleted */ | |
789 | struct mutex reclaim_bgs_lock; | |
790 | ||
791 | /* Cached block sizes */ | |
792 | u32 nodesize; | |
793 | u32 sectorsize; | |
794 | /* ilog2 of sectorsize, use to avoid 64bit division */ | |
795 | u32 sectorsize_bits; | |
796 | u32 csum_size; | |
797 | u32 csums_per_leaf; | |
798 | u32 stripesize; | |
799 | ||
800 | /* | |
801 | * Maximum size of an extent. BTRFS_MAX_EXTENT_SIZE on regular | |
802 | * filesystem, on zoned it depends on the device constraints. | |
803 | */ | |
804 | u64 max_extent_size; | |
805 | ||
806 | /* Block groups and devices containing active swapfiles. */ | |
807 | spinlock_t swapfile_pins_lock; | |
808 | struct rb_root swapfile_pins; | |
809 | ||
810 | struct crypto_shash *csum_shash; | |
811 | ||
812 | /* Type of exclusive operation running, protected by super_lock */ | |
813 | enum btrfs_exclusive_operation exclusive_operation; | |
814 | ||
815 | /* | |
816 | * Zone size > 0 when in ZONED mode, otherwise it's used for a check | |
817 | * if the mode is enabled | |
818 | */ | |
819 | u64 zone_size; | |
820 | ||
243cf8d1 CH |
821 | /* Constraints for ZONE_APPEND commands: */ |
822 | struct queue_limits limits; | |
a56159d4 | 823 | u64 max_zone_append_size; |
243cf8d1 | 824 | |
a56159d4 JB |
825 | struct mutex zoned_meta_io_lock; |
826 | spinlock_t treelog_bg_lock; | |
827 | u64 treelog_bg; | |
828 | ||
829 | /* | |
830 | * Start of the dedicated data relocation block group, protected by | |
831 | * relocation_bg_lock. | |
832 | */ | |
833 | spinlock_t relocation_bg_lock; | |
834 | u64 data_reloc_bg; | |
835 | struct mutex zoned_data_reloc_io_lock; | |
836 | ||
13bb483d NA |
837 | struct btrfs_block_group *active_meta_bg; |
838 | struct btrfs_block_group *active_system_bg; | |
839 | ||
a56159d4 JB |
840 | u64 nr_global_roots; |
841 | ||
842 | spinlock_t zone_active_bgs_lock; | |
843 | struct list_head zone_active_bgs; | |
844 | ||
845 | /* Updates are not protected by any lock */ | |
846 | struct btrfs_commit_stats commit_stats; | |
847 | ||
848 | /* | |
849 | * Last generation where we dropped a non-relocation root. | |
850 | * Use btrfs_set_last_root_drop_gen() and btrfs_get_last_root_drop_gen() | |
851 | * to change it and to read it, respectively. | |
852 | */ | |
853 | u64 last_root_drop_gen; | |
854 | ||
855 | /* | |
856 | * Annotations for transaction events (structures are empty when | |
857 | * compiled without lockdep). | |
858 | */ | |
859 | struct lockdep_map btrfs_trans_num_writers_map; | |
860 | struct lockdep_map btrfs_trans_num_extwriters_map; | |
861 | struct lockdep_map btrfs_state_change_map[4]; | |
862 | struct lockdep_map btrfs_trans_pending_ordered_map; | |
863 | struct lockdep_map btrfs_ordered_extent_map; | |
864 | ||
865 | #ifdef CONFIG_BTRFS_FS_REF_VERIFY | |
866 | spinlock_t ref_verify_lock; | |
867 | struct rb_root block_tree; | |
868 | #endif | |
869 | ||
870 | #ifdef CONFIG_BTRFS_DEBUG | |
871 | struct kobject *debug_kobj; | |
872 | struct list_head allocated_roots; | |
873 | ||
874 | spinlock_t eb_leak_lock; | |
875 | struct list_head allocated_ebs; | |
876 | #endif | |
877 | }; | |
878 | ||
c8293894 DS |
879 | #define page_to_inode(_page) (BTRFS_I(_Generic((_page), \ |
880 | struct page *: (_page))->mapping->host)) | |
881 | #define folio_to_inode(_folio) (BTRFS_I(_Generic((_folio), \ | |
882 | struct folio *: (_folio))->mapping->host)) | |
883 | ||
b33d2e53 DS |
884 | #define page_to_fs_info(_page) (page_to_inode(_page)->root->fs_info) |
885 | #define folio_to_fs_info(_folio) (folio_to_inode(_folio)->root->fs_info) | |
886 | ||
41044b41 DS |
887 | #define inode_to_fs_info(_inode) (BTRFS_I(_Generic((_inode), \ |
888 | struct inode *: (_inode)))->root->fs_info) | |
889 | ||
4a4f8fe2 FM |
890 | static inline u64 btrfs_get_fs_generation(const struct btrfs_fs_info *fs_info) |
891 | { | |
892 | return READ_ONCE(fs_info->generation); | |
893 | } | |
894 | ||
895 | static inline void btrfs_set_fs_generation(struct btrfs_fs_info *fs_info, u64 gen) | |
896 | { | |
897 | WRITE_ONCE(fs_info->generation, gen); | |
898 | } | |
899 | ||
0124855f FM |
900 | static inline u64 btrfs_get_last_trans_committed(const struct btrfs_fs_info *fs_info) |
901 | { | |
902 | return READ_ONCE(fs_info->last_trans_committed); | |
903 | } | |
904 | ||
905 | static inline void btrfs_set_last_trans_committed(struct btrfs_fs_info *fs_info, u64 gen) | |
906 | { | |
907 | WRITE_ONCE(fs_info->last_trans_committed, gen); | |
908 | } | |
909 | ||
a56159d4 JB |
910 | static inline void btrfs_set_last_root_drop_gen(struct btrfs_fs_info *fs_info, |
911 | u64 gen) | |
912 | { | |
913 | WRITE_ONCE(fs_info->last_root_drop_gen, gen); | |
914 | } | |
915 | ||
916 | static inline u64 btrfs_get_last_root_drop_gen(const struct btrfs_fs_info *fs_info) | |
917 | { | |
918 | return READ_ONCE(fs_info->last_root_drop_gen); | |
919 | } | |
920 | ||
a56159d4 JB |
921 | /* |
922 | * Take the number of bytes to be checksummed and figure out how many leaves | |
923 | * it would require to store the csums for that many bytes. | |
924 | */ | |
925 | static inline u64 btrfs_csum_bytes_to_leaves( | |
926 | const struct btrfs_fs_info *fs_info, u64 csum_bytes) | |
927 | { | |
928 | const u64 num_csums = csum_bytes >> fs_info->sectorsize_bits; | |
929 | ||
930 | return DIV_ROUND_UP_ULL(num_csums, fs_info->csums_per_leaf); | |
931 | } | |
932 | ||
933 | /* | |
934 | * Use this if we would be adding new items, as we could split nodes as we cow | |
935 | * down the tree. | |
936 | */ | |
d1085c9c | 937 | static inline u64 btrfs_calc_insert_metadata_size(const struct btrfs_fs_info *fs_info, |
a56159d4 JB |
938 | unsigned num_items) |
939 | { | |
940 | return (u64)fs_info->nodesize * BTRFS_MAX_LEVEL * 2 * num_items; | |
941 | } | |
942 | ||
943 | /* | |
944 | * Doing a truncate or a modification won't result in new nodes or leaves, just | |
945 | * what we need for COW. | |
946 | */ | |
d1085c9c | 947 | static inline u64 btrfs_calc_metadata_size(const struct btrfs_fs_info *fs_info, |
a56159d4 JB |
948 | unsigned num_items) |
949 | { | |
950 | return (u64)fs_info->nodesize * BTRFS_MAX_LEVEL * num_items; | |
951 | } | |
952 | ||
953 | #define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r->fs_info) >> 4) - \ | |
954 | sizeof(struct btrfs_item)) | |
955 | ||
956 | static inline bool btrfs_is_zoned(const struct btrfs_fs_info *fs_info) | |
957 | { | |
dd8b7b04 | 958 | return IS_ENABLED(CONFIG_BLK_DEV_ZONED) && fs_info->zone_size > 0; |
a56159d4 JB |
959 | } |
960 | ||
961 | /* | |
962 | * Count how many fs_info->max_extent_size cover the @size | |
963 | */ | |
2917f741 | 964 | static inline u32 count_max_extents(const struct btrfs_fs_info *fs_info, u64 size) |
a56159d4 JB |
965 | { |
966 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS | |
967 | if (!fs_info) | |
968 | return div_u64(size + BTRFS_MAX_EXTENT_SIZE - 1, BTRFS_MAX_EXTENT_SIZE); | |
969 | #endif | |
970 | ||
971 | return div_u64(size + fs_info->max_extent_size - 1, fs_info->max_extent_size); | |
972 | } | |
973 | ||
974 | bool btrfs_exclop_start(struct btrfs_fs_info *fs_info, | |
975 | enum btrfs_exclusive_operation type); | |
976 | bool btrfs_exclop_start_try_lock(struct btrfs_fs_info *fs_info, | |
977 | enum btrfs_exclusive_operation type); | |
978 | void btrfs_exclop_start_unlock(struct btrfs_fs_info *fs_info); | |
979 | void btrfs_exclop_finish(struct btrfs_fs_info *fs_info); | |
980 | void btrfs_exclop_balance(struct btrfs_fs_info *fs_info, | |
981 | enum btrfs_exclusive_operation op); | |
982 | ||
5ab2b180 DS |
983 | int btrfs_check_ioctl_vol_args_path(const struct btrfs_ioctl_vol_args *vol_args); |
984 | ||
c7f13d42 JB |
985 | /* Compatibility and incompatibility defines */ |
986 | void __btrfs_set_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag, | |
987 | const char *name); | |
988 | void __btrfs_clear_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag, | |
989 | const char *name); | |
990 | void __btrfs_set_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag, | |
991 | const char *name); | |
992 | void __btrfs_clear_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag, | |
993 | const char *name); | |
994 | ||
0d3a9cf8 JB |
995 | #define __btrfs_fs_incompat(fs_info, flags) \ |
996 | (!!(btrfs_super_incompat_flags((fs_info)->super_copy) & (flags))) | |
997 | ||
998 | #define __btrfs_fs_compat_ro(fs_info, flags) \ | |
999 | (!!(btrfs_super_compat_ro_flags((fs_info)->super_copy) & (flags))) | |
1000 | ||
c7f13d42 JB |
1001 | #define btrfs_set_fs_incompat(__fs_info, opt) \ |
1002 | __btrfs_set_fs_incompat((__fs_info), BTRFS_FEATURE_INCOMPAT_##opt, #opt) | |
1003 | ||
1004 | #define btrfs_clear_fs_incompat(__fs_info, opt) \ | |
1005 | __btrfs_clear_fs_incompat((__fs_info), BTRFS_FEATURE_INCOMPAT_##opt, #opt) | |
1006 | ||
1007 | #define btrfs_fs_incompat(fs_info, opt) \ | |
1008 | __btrfs_fs_incompat((fs_info), BTRFS_FEATURE_INCOMPAT_##opt) | |
1009 | ||
1010 | #define btrfs_set_fs_compat_ro(__fs_info, opt) \ | |
1011 | __btrfs_set_fs_compat_ro((__fs_info), BTRFS_FEATURE_COMPAT_RO_##opt, #opt) | |
1012 | ||
1013 | #define btrfs_clear_fs_compat_ro(__fs_info, opt) \ | |
1014 | __btrfs_clear_fs_compat_ro((__fs_info), BTRFS_FEATURE_COMPAT_RO_##opt, #opt) | |
1015 | ||
1016 | #define btrfs_fs_compat_ro(fs_info, opt) \ | |
1017 | __btrfs_fs_compat_ro((fs_info), BTRFS_FEATURE_COMPAT_RO_##opt) | |
1018 | ||
fc97a410 JB |
1019 | #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt) |
1020 | #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) | |
1021 | #define btrfs_raw_test_opt(o, opt) ((o) & BTRFS_MOUNT_##opt) | |
1022 | #define btrfs_test_opt(fs_info, opt) ((fs_info)->mount_opt & \ | |
1023 | BTRFS_MOUNT_##opt) | |
1024 | ||
2917f741 | 1025 | static inline int btrfs_fs_closing(const struct btrfs_fs_info *fs_info) |
c7f13d42 JB |
1026 | { |
1027 | /* Do it this way so we only ever do one test_bit in the normal case. */ | |
1028 | if (test_bit(BTRFS_FS_CLOSING_START, &fs_info->flags)) { | |
1029 | if (test_bit(BTRFS_FS_CLOSING_DONE, &fs_info->flags)) | |
1030 | return 2; | |
1031 | return 1; | |
1032 | } | |
1033 | return 0; | |
1034 | } | |
1035 | ||
1036 | /* | |
1037 | * If we remount the fs to be R/O or umount the fs, the cleaner needn't do | |
1038 | * anything except sleeping. This function is used to check the status of | |
1039 | * the fs. | |
1040 | * We check for BTRFS_FS_STATE_RO to avoid races with a concurrent remount, | |
1041 | * since setting and checking for SB_RDONLY in the superblock's flags is not | |
1042 | * atomic. | |
1043 | */ | |
2917f741 | 1044 | static inline int btrfs_need_cleaner_sleep(const struct btrfs_fs_info *fs_info) |
c7f13d42 JB |
1045 | { |
1046 | return test_bit(BTRFS_FS_STATE_RO, &fs_info->fs_state) || | |
1047 | btrfs_fs_closing(fs_info); | |
1048 | } | |
1049 | ||
7966a6b5 JB |
1050 | static inline void btrfs_wake_unfinished_drop(struct btrfs_fs_info *fs_info) |
1051 | { | |
1052 | clear_and_wake_up_bit(BTRFS_FS_UNFINISHED_DROPS, &fs_info->flags); | |
1053 | } | |
1054 | ||
ae3364e5 FM |
1055 | #define BTRFS_FS_ERROR(fs_info) (READ_ONCE((fs_info)->fs_error)) |
1056 | ||
ec8eb376 JB |
1057 | #define BTRFS_FS_LOG_CLEANUP_ERROR(fs_info) \ |
1058 | (unlikely(test_bit(BTRFS_FS_STATE_LOG_CLEANUP_ERROR, \ | |
1059 | &(fs_info)->fs_state))) | |
1060 | ||
1061 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS | |
6a6b4daf JB |
1062 | |
1063 | #define EXPORT_FOR_TESTS | |
1064 | ||
2917f741 | 1065 | static inline int btrfs_is_testing(const struct btrfs_fs_info *fs_info) |
ec8eb376 JB |
1066 | { |
1067 | return test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state); | |
1068 | } | |
6a6b4daf JB |
1069 | |
1070 | void btrfs_test_destroy_inode(struct inode *inode); | |
1071 | ||
ec8eb376 | 1072 | #else |
6a6b4daf JB |
1073 | |
1074 | #define EXPORT_FOR_TESTS static | |
1075 | ||
2917f741 | 1076 | static inline int btrfs_is_testing(const struct btrfs_fs_info *fs_info) |
ec8eb376 JB |
1077 | { |
1078 | return 0; | |
1079 | } | |
1080 | #endif | |
1081 | ||
c7f13d42 | 1082 | #endif |