162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#ifndef BTRFS_FS_H
462306a36Sopenharmony_ci#define BTRFS_FS_H
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/blkdev.h>
762306a36Sopenharmony_ci#include <linux/fs.h>
862306a36Sopenharmony_ci#include <linux/btrfs_tree.h>
962306a36Sopenharmony_ci#include <linux/sizes.h>
1062306a36Sopenharmony_ci#include "extent-io-tree.h"
1162306a36Sopenharmony_ci#include "extent_map.h"
1262306a36Sopenharmony_ci#include "async-thread.h"
1362306a36Sopenharmony_ci#include "block-rsv.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define BTRFS_MAX_EXTENT_SIZE SZ_128M
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define BTRFS_OLDEST_GENERATION	0ULL
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define BTRFS_EMPTY_DIR_SIZE 0
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define BTRFS_DIRTY_METADATA_THRESH		SZ_32M
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define BTRFS_SUPER_INFO_OFFSET			SZ_64K
2462306a36Sopenharmony_ci#define BTRFS_SUPER_INFO_SIZE			4096
2562306a36Sopenharmony_cistatic_assert(sizeof(struct btrfs_super_block) == BTRFS_SUPER_INFO_SIZE);
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/*
2862306a36Sopenharmony_ci * Number of metadata items necessary for an unlink operation:
2962306a36Sopenharmony_ci *
3062306a36Sopenharmony_ci * 1 for the possible orphan item
3162306a36Sopenharmony_ci * 1 for the dir item
3262306a36Sopenharmony_ci * 1 for the dir index
3362306a36Sopenharmony_ci * 1 for the inode ref
3462306a36Sopenharmony_ci * 1 for the inode
3562306a36Sopenharmony_ci * 1 for the parent inode
3662306a36Sopenharmony_ci */
3762306a36Sopenharmony_ci#define BTRFS_UNLINK_METADATA_UNITS		6
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/*
4062306a36Sopenharmony_ci * The reserved space at the beginning of each device.  It covers the primary
4162306a36Sopenharmony_ci * super block and leaves space for potential use by other tools like
4262306a36Sopenharmony_ci * bootloaders or to lower potential damage of accidental overwrite.
4362306a36Sopenharmony_ci */
4462306a36Sopenharmony_ci#define BTRFS_DEVICE_RANGE_RESERVED			(SZ_1M)
4562306a36Sopenharmony_ci/*
4662306a36Sopenharmony_ci * Runtime (in-memory) states of filesystem
4762306a36Sopenharmony_ci */
4862306a36Sopenharmony_cienum {
4962306a36Sopenharmony_ci	/*
5062306a36Sopenharmony_ci	 * Filesystem is being remounted, allow to skip some operations, like
5162306a36Sopenharmony_ci	 * defrag
5262306a36Sopenharmony_ci	 */
5362306a36Sopenharmony_ci	BTRFS_FS_STATE_REMOUNTING,
5462306a36Sopenharmony_ci	/* Filesystem in RO mode */
5562306a36Sopenharmony_ci	BTRFS_FS_STATE_RO,
5662306a36Sopenharmony_ci	/* Track if a transaction abort has been reported on this filesystem */
5762306a36Sopenharmony_ci	BTRFS_FS_STATE_TRANS_ABORTED,
5862306a36Sopenharmony_ci	/*
5962306a36Sopenharmony_ci	 * Bio operations should be blocked on this filesystem because a source
6062306a36Sopenharmony_ci	 * or target device is being destroyed as part of a device replace
6162306a36Sopenharmony_ci	 */
6262306a36Sopenharmony_ci	BTRFS_FS_STATE_DEV_REPLACING,
6362306a36Sopenharmony_ci	/* The btrfs_fs_info created for self-tests */
6462306a36Sopenharmony_ci	BTRFS_FS_STATE_DUMMY_FS_INFO,
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	BTRFS_FS_STATE_NO_CSUMS,
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	/* Indicates there was an error cleaning up a log tree. */
6962306a36Sopenharmony_ci	BTRFS_FS_STATE_LOG_CLEANUP_ERROR,
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	BTRFS_FS_STATE_COUNT
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cienum {
7562306a36Sopenharmony_ci	BTRFS_FS_CLOSING_START,
7662306a36Sopenharmony_ci	BTRFS_FS_CLOSING_DONE,
7762306a36Sopenharmony_ci	BTRFS_FS_LOG_RECOVERING,
7862306a36Sopenharmony_ci	BTRFS_FS_OPEN,
7962306a36Sopenharmony_ci	BTRFS_FS_QUOTA_ENABLED,
8062306a36Sopenharmony_ci	BTRFS_FS_UPDATE_UUID_TREE_GEN,
8162306a36Sopenharmony_ci	BTRFS_FS_CREATING_FREE_SPACE_TREE,
8262306a36Sopenharmony_ci	BTRFS_FS_BTREE_ERR,
8362306a36Sopenharmony_ci	BTRFS_FS_LOG1_ERR,
8462306a36Sopenharmony_ci	BTRFS_FS_LOG2_ERR,
8562306a36Sopenharmony_ci	BTRFS_FS_QUOTA_OVERRIDE,
8662306a36Sopenharmony_ci	/* Used to record internally whether fs has been frozen */
8762306a36Sopenharmony_ci	BTRFS_FS_FROZEN,
8862306a36Sopenharmony_ci	/*
8962306a36Sopenharmony_ci	 * Indicate that balance has been set up from the ioctl and is in the
9062306a36Sopenharmony_ci	 * main phase. The fs_info::balance_ctl is initialized.
9162306a36Sopenharmony_ci	 */
9262306a36Sopenharmony_ci	BTRFS_FS_BALANCE_RUNNING,
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	/*
9562306a36Sopenharmony_ci	 * Indicate that relocation of a chunk has started, it's set per chunk
9662306a36Sopenharmony_ci	 * and is toggled between chunks.
9762306a36Sopenharmony_ci	 */
9862306a36Sopenharmony_ci	BTRFS_FS_RELOC_RUNNING,
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	/* Indicate that the cleaner thread is awake and doing something. */
10162306a36Sopenharmony_ci	BTRFS_FS_CLEANER_RUNNING,
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	/*
10462306a36Sopenharmony_ci	 * The checksumming has an optimized version and is considered fast,
10562306a36Sopenharmony_ci	 * so we don't need to offload checksums to workqueues.
10662306a36Sopenharmony_ci	 */
10762306a36Sopenharmony_ci	BTRFS_FS_CSUM_IMPL_FAST,
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	/* Indicate that the discard workqueue can service discards. */
11062306a36Sopenharmony_ci	BTRFS_FS_DISCARD_RUNNING,
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	/* Indicate that we need to cleanup space cache v1 */
11362306a36Sopenharmony_ci	BTRFS_FS_CLEANUP_SPACE_CACHE_V1,
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	/* Indicate that we can't trust the free space tree for caching yet */
11662306a36Sopenharmony_ci	BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED,
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	/* Indicate whether there are any tree modification log users */
11962306a36Sopenharmony_ci	BTRFS_FS_TREE_MOD_LOG_USERS,
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	/* Indicate that we want the transaction kthread to commit right now. */
12262306a36Sopenharmony_ci	BTRFS_FS_COMMIT_TRANS,
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	/* Indicate we have half completed snapshot deletions pending. */
12562306a36Sopenharmony_ci	BTRFS_FS_UNFINISHED_DROPS,
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	/* Indicate we have to finish a zone to do next allocation. */
12862306a36Sopenharmony_ci	BTRFS_FS_NEED_ZONE_FINISH,
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	/* Indicate that we want to commit the transaction. */
13162306a36Sopenharmony_ci	BTRFS_FS_NEED_TRANS_COMMIT,
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	/* This is set when active zone tracking is needed. */
13462306a36Sopenharmony_ci	BTRFS_FS_ACTIVE_ZONE_TRACKING,
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci	/*
13762306a36Sopenharmony_ci	 * Indicate if we have some features changed, this is mostly for
13862306a36Sopenharmony_ci	 * cleaner thread to update the sysfs interface.
13962306a36Sopenharmony_ci	 */
14062306a36Sopenharmony_ci	BTRFS_FS_FEATURE_CHANGED,
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci#if BITS_PER_LONG == 32
14362306a36Sopenharmony_ci	/* Indicate if we have error/warn message printed on 32bit systems */
14462306a36Sopenharmony_ci	BTRFS_FS_32BIT_ERROR,
14562306a36Sopenharmony_ci	BTRFS_FS_32BIT_WARN,
14662306a36Sopenharmony_ci#endif
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/*
15062306a36Sopenharmony_ci * Flags for mount options.
15162306a36Sopenharmony_ci *
15262306a36Sopenharmony_ci * Note: don't forget to add new options to btrfs_show_options()
15362306a36Sopenharmony_ci */
15462306a36Sopenharmony_cienum {
15562306a36Sopenharmony_ci	BTRFS_MOUNT_NODATASUM			= (1UL << 0),
15662306a36Sopenharmony_ci	BTRFS_MOUNT_NODATACOW			= (1UL << 1),
15762306a36Sopenharmony_ci	BTRFS_MOUNT_NOBARRIER			= (1UL << 2),
15862306a36Sopenharmony_ci	BTRFS_MOUNT_SSD				= (1UL << 3),
15962306a36Sopenharmony_ci	BTRFS_MOUNT_DEGRADED			= (1UL << 4),
16062306a36Sopenharmony_ci	BTRFS_MOUNT_COMPRESS			= (1UL << 5),
16162306a36Sopenharmony_ci	BTRFS_MOUNT_NOTREELOG   		= (1UL << 6),
16262306a36Sopenharmony_ci	BTRFS_MOUNT_FLUSHONCOMMIT		= (1UL << 7),
16362306a36Sopenharmony_ci	BTRFS_MOUNT_SSD_SPREAD			= (1UL << 8),
16462306a36Sopenharmony_ci	BTRFS_MOUNT_NOSSD			= (1UL << 9),
16562306a36Sopenharmony_ci	BTRFS_MOUNT_DISCARD_SYNC		= (1UL << 10),
16662306a36Sopenharmony_ci	BTRFS_MOUNT_FORCE_COMPRESS      	= (1UL << 11),
16762306a36Sopenharmony_ci	BTRFS_MOUNT_SPACE_CACHE			= (1UL << 12),
16862306a36Sopenharmony_ci	BTRFS_MOUNT_CLEAR_CACHE			= (1UL << 13),
16962306a36Sopenharmony_ci	BTRFS_MOUNT_USER_SUBVOL_RM_ALLOWED	= (1UL << 14),
17062306a36Sopenharmony_ci	BTRFS_MOUNT_ENOSPC_DEBUG		= (1UL << 15),
17162306a36Sopenharmony_ci	BTRFS_MOUNT_AUTO_DEFRAG			= (1UL << 16),
17262306a36Sopenharmony_ci	BTRFS_MOUNT_USEBACKUPROOT		= (1UL << 17),
17362306a36Sopenharmony_ci	BTRFS_MOUNT_SKIP_BALANCE		= (1UL << 18),
17462306a36Sopenharmony_ci	BTRFS_MOUNT_CHECK_INTEGRITY		= (1UL << 19),
17562306a36Sopenharmony_ci	BTRFS_MOUNT_CHECK_INTEGRITY_DATA	= (1UL << 20),
17662306a36Sopenharmony_ci	BTRFS_MOUNT_PANIC_ON_FATAL_ERROR	= (1UL << 21),
17762306a36Sopenharmony_ci	BTRFS_MOUNT_RESCAN_UUID_TREE		= (1UL << 22),
17862306a36Sopenharmony_ci	BTRFS_MOUNT_FRAGMENT_DATA		= (1UL << 23),
17962306a36Sopenharmony_ci	BTRFS_MOUNT_FRAGMENT_METADATA		= (1UL << 24),
18062306a36Sopenharmony_ci	BTRFS_MOUNT_FREE_SPACE_TREE		= (1UL << 25),
18162306a36Sopenharmony_ci	BTRFS_MOUNT_NOLOGREPLAY			= (1UL << 26),
18262306a36Sopenharmony_ci	BTRFS_MOUNT_REF_VERIFY			= (1UL << 27),
18362306a36Sopenharmony_ci	BTRFS_MOUNT_DISCARD_ASYNC		= (1UL << 28),
18462306a36Sopenharmony_ci	BTRFS_MOUNT_IGNOREBADROOTS		= (1UL << 29),
18562306a36Sopenharmony_ci	BTRFS_MOUNT_IGNOREDATACSUMS		= (1UL << 30),
18662306a36Sopenharmony_ci	BTRFS_MOUNT_NODISCARD			= (1UL << 31),
18762306a36Sopenharmony_ci};
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci/*
19062306a36Sopenharmony_ci * Compat flags that we support.  If any incompat flags are set other than the
19162306a36Sopenharmony_ci * ones specified below then we will fail to mount
19262306a36Sopenharmony_ci */
19362306a36Sopenharmony_ci#define BTRFS_FEATURE_COMPAT_SUPP		0ULL
19462306a36Sopenharmony_ci#define BTRFS_FEATURE_COMPAT_SAFE_SET		0ULL
19562306a36Sopenharmony_ci#define BTRFS_FEATURE_COMPAT_SAFE_CLEAR		0ULL
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci#define BTRFS_FEATURE_COMPAT_RO_SUPP			\
19862306a36Sopenharmony_ci	(BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE |	\
19962306a36Sopenharmony_ci	 BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID | \
20062306a36Sopenharmony_ci	 BTRFS_FEATURE_COMPAT_RO_VERITY |		\
20162306a36Sopenharmony_ci	 BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE)
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci#define BTRFS_FEATURE_COMPAT_RO_SAFE_SET	0ULL
20462306a36Sopenharmony_ci#define BTRFS_FEATURE_COMPAT_RO_SAFE_CLEAR	0ULL
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci#define BTRFS_FEATURE_INCOMPAT_SUPP_STABLE		\
20762306a36Sopenharmony_ci	(BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF |		\
20862306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL |	\
20962306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS |		\
21062306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_BIG_METADATA |		\
21162306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO |		\
21262306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_COMPRESS_ZSTD |		\
21362306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_RAID56 |		\
21462306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF |		\
21562306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA |	\
21662306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_NO_HOLES	|	\
21762306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_METADATA_UUID	|	\
21862306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_RAID1C34	|	\
21962306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_ZONED)
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci#ifdef CONFIG_BTRFS_DEBUG
22262306a36Sopenharmony_ci	/*
22362306a36Sopenharmony_ci	 * Features under developmen like Extent tree v2 support is enabled
22462306a36Sopenharmony_ci	 * only under CONFIG_BTRFS_DEBUG.
22562306a36Sopenharmony_ci	 */
22662306a36Sopenharmony_ci#define BTRFS_FEATURE_INCOMPAT_SUPP		\
22762306a36Sopenharmony_ci	(BTRFS_FEATURE_INCOMPAT_SUPP_STABLE |	\
22862306a36Sopenharmony_ci	 BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2)
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci#else
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci#define BTRFS_FEATURE_INCOMPAT_SUPP		\
23362306a36Sopenharmony_ci	(BTRFS_FEATURE_INCOMPAT_SUPP_STABLE)
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci#endif
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci#define BTRFS_FEATURE_INCOMPAT_SAFE_SET			\
23862306a36Sopenharmony_ci	(BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF)
23962306a36Sopenharmony_ci#define BTRFS_FEATURE_INCOMPAT_SAFE_CLEAR		0ULL
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci#define BTRFS_DEFAULT_COMMIT_INTERVAL	(30)
24262306a36Sopenharmony_ci#define BTRFS_DEFAULT_MAX_INLINE	(2048)
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_cistruct btrfs_dev_replace {
24562306a36Sopenharmony_ci	/* See #define above */
24662306a36Sopenharmony_ci	u64 replace_state;
24762306a36Sopenharmony_ci	/* Seconds since 1-Jan-1970 */
24862306a36Sopenharmony_ci	time64_t time_started;
24962306a36Sopenharmony_ci	/* Seconds since 1-Jan-1970 */
25062306a36Sopenharmony_ci	time64_t time_stopped;
25162306a36Sopenharmony_ci	atomic64_t num_write_errors;
25262306a36Sopenharmony_ci	atomic64_t num_uncorrectable_read_errors;
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	u64 cursor_left;
25562306a36Sopenharmony_ci	u64 committed_cursor_left;
25662306a36Sopenharmony_ci	u64 cursor_left_last_write_of_item;
25762306a36Sopenharmony_ci	u64 cursor_right;
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	/* See #define above */
26062306a36Sopenharmony_ci	u64 cont_reading_from_srcdev_mode;
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	int is_valid;
26362306a36Sopenharmony_ci	int item_needs_writeback;
26462306a36Sopenharmony_ci	struct btrfs_device *srcdev;
26562306a36Sopenharmony_ci	struct btrfs_device *tgtdev;
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	struct mutex lock_finishing_cancel_unmount;
26862306a36Sopenharmony_ci	struct rw_semaphore rwsem;
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci	struct btrfs_scrub_progress scrub_progress;
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci	struct percpu_counter bio_counter;
27362306a36Sopenharmony_ci	wait_queue_head_t replace_wait;
27462306a36Sopenharmony_ci};
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci/*
27762306a36Sopenharmony_ci * Free clusters are used to claim free space in relatively large chunks,
27862306a36Sopenharmony_ci * allowing us to do less seeky writes. They are used for all metadata
27962306a36Sopenharmony_ci * allocations. In ssd_spread mode they are also used for data allocations.
28062306a36Sopenharmony_ci */
28162306a36Sopenharmony_cistruct btrfs_free_cluster {
28262306a36Sopenharmony_ci	spinlock_t lock;
28362306a36Sopenharmony_ci	spinlock_t refill_lock;
28462306a36Sopenharmony_ci	struct rb_root root;
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	/* Largest extent in this cluster */
28762306a36Sopenharmony_ci	u64 max_size;
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci	/* First extent starting offset */
29062306a36Sopenharmony_ci	u64 window_start;
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci	/* We did a full search and couldn't create a cluster */
29362306a36Sopenharmony_ci	bool fragmented;
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	struct btrfs_block_group *block_group;
29662306a36Sopenharmony_ci	/*
29762306a36Sopenharmony_ci	 * When a cluster is allocated from a block group, we put the cluster
29862306a36Sopenharmony_ci	 * onto a list in the block group so that it can be freed before the
29962306a36Sopenharmony_ci	 * block group is freed.
30062306a36Sopenharmony_ci	 */
30162306a36Sopenharmony_ci	struct list_head block_group_list;
30262306a36Sopenharmony_ci};
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci/* Discard control. */
30562306a36Sopenharmony_ci/*
30662306a36Sopenharmony_ci * Async discard uses multiple lists to differentiate the discard filter
30762306a36Sopenharmony_ci * parameters.  Index 0 is for completely free block groups where we need to
30862306a36Sopenharmony_ci * ensure the entire block group is trimmed without being lossy.  Indices
30962306a36Sopenharmony_ci * afterwards represent monotonically decreasing discard filter sizes to
31062306a36Sopenharmony_ci * prioritize what should be discarded next.
31162306a36Sopenharmony_ci */
31262306a36Sopenharmony_ci#define BTRFS_NR_DISCARD_LISTS		3
31362306a36Sopenharmony_ci#define BTRFS_DISCARD_INDEX_UNUSED	0
31462306a36Sopenharmony_ci#define BTRFS_DISCARD_INDEX_START	1
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_cistruct btrfs_discard_ctl {
31762306a36Sopenharmony_ci	struct workqueue_struct *discard_workers;
31862306a36Sopenharmony_ci	struct delayed_work work;
31962306a36Sopenharmony_ci	spinlock_t lock;
32062306a36Sopenharmony_ci	struct btrfs_block_group *block_group;
32162306a36Sopenharmony_ci	struct list_head discard_list[BTRFS_NR_DISCARD_LISTS];
32262306a36Sopenharmony_ci	u64 prev_discard;
32362306a36Sopenharmony_ci	u64 prev_discard_time;
32462306a36Sopenharmony_ci	atomic_t discardable_extents;
32562306a36Sopenharmony_ci	atomic64_t discardable_bytes;
32662306a36Sopenharmony_ci	u64 max_discard_size;
32762306a36Sopenharmony_ci	u64 delay_ms;
32862306a36Sopenharmony_ci	u32 iops_limit;
32962306a36Sopenharmony_ci	u32 kbps_limit;
33062306a36Sopenharmony_ci	u64 discard_extent_bytes;
33162306a36Sopenharmony_ci	u64 discard_bitmap_bytes;
33262306a36Sopenharmony_ci	atomic64_t discard_bytes_saved;
33362306a36Sopenharmony_ci};
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci/*
33662306a36Sopenharmony_ci * Exclusive operations (device replace, resize, device add/remove, balance)
33762306a36Sopenharmony_ci */
33862306a36Sopenharmony_cienum btrfs_exclusive_operation {
33962306a36Sopenharmony_ci	BTRFS_EXCLOP_NONE,
34062306a36Sopenharmony_ci	BTRFS_EXCLOP_BALANCE_PAUSED,
34162306a36Sopenharmony_ci	BTRFS_EXCLOP_BALANCE,
34262306a36Sopenharmony_ci	BTRFS_EXCLOP_DEV_ADD,
34362306a36Sopenharmony_ci	BTRFS_EXCLOP_DEV_REMOVE,
34462306a36Sopenharmony_ci	BTRFS_EXCLOP_DEV_REPLACE,
34562306a36Sopenharmony_ci	BTRFS_EXCLOP_RESIZE,
34662306a36Sopenharmony_ci	BTRFS_EXCLOP_SWAP_ACTIVATE,
34762306a36Sopenharmony_ci};
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci/* Store data about transaction commits, exported via sysfs. */
35062306a36Sopenharmony_cistruct btrfs_commit_stats {
35162306a36Sopenharmony_ci	/* Total number of commits */
35262306a36Sopenharmony_ci	u64 commit_count;
35362306a36Sopenharmony_ci	/* The maximum commit duration so far in ns */
35462306a36Sopenharmony_ci	u64 max_commit_dur;
35562306a36Sopenharmony_ci	/* The last commit duration in ns */
35662306a36Sopenharmony_ci	u64 last_commit_dur;
35762306a36Sopenharmony_ci	/* The total commit duration in ns */
35862306a36Sopenharmony_ci	u64 total_commit_dur;
35962306a36Sopenharmony_ci};
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_cistruct btrfs_fs_info {
36262306a36Sopenharmony_ci	u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
36362306a36Sopenharmony_ci	unsigned long flags;
36462306a36Sopenharmony_ci	struct btrfs_root *tree_root;
36562306a36Sopenharmony_ci	struct btrfs_root *chunk_root;
36662306a36Sopenharmony_ci	struct btrfs_root *dev_root;
36762306a36Sopenharmony_ci	struct btrfs_root *fs_root;
36862306a36Sopenharmony_ci	struct btrfs_root *quota_root;
36962306a36Sopenharmony_ci	struct btrfs_root *uuid_root;
37062306a36Sopenharmony_ci	struct btrfs_root *data_reloc_root;
37162306a36Sopenharmony_ci	struct btrfs_root *block_group_root;
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci	/* The log root tree is a directory of all the other log roots */
37462306a36Sopenharmony_ci	struct btrfs_root *log_root_tree;
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	/* The tree that holds the global roots (csum, extent, etc) */
37762306a36Sopenharmony_ci	rwlock_t global_root_lock;
37862306a36Sopenharmony_ci	struct rb_root global_root_tree;
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	spinlock_t fs_roots_radix_lock;
38162306a36Sopenharmony_ci	struct radix_tree_root fs_roots_radix;
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	/* Block group cache stuff */
38462306a36Sopenharmony_ci	rwlock_t block_group_cache_lock;
38562306a36Sopenharmony_ci	struct rb_root_cached block_group_cache_tree;
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci	/* Keep track of unallocated space */
38862306a36Sopenharmony_ci	atomic64_t free_chunk_space;
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci	/* Track ranges which are used by log trees blocks/logged data extents */
39162306a36Sopenharmony_ci	struct extent_io_tree excluded_extents;
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci	/* logical->physical extent mapping */
39462306a36Sopenharmony_ci	struct extent_map_tree mapping_tree;
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci	/*
39762306a36Sopenharmony_ci	 * Block reservation for extent, checksum, root tree and delayed dir
39862306a36Sopenharmony_ci	 * index item.
39962306a36Sopenharmony_ci	 */
40062306a36Sopenharmony_ci	struct btrfs_block_rsv global_block_rsv;
40162306a36Sopenharmony_ci	/* Block reservation for metadata operations */
40262306a36Sopenharmony_ci	struct btrfs_block_rsv trans_block_rsv;
40362306a36Sopenharmony_ci	/* Block reservation for chunk tree */
40462306a36Sopenharmony_ci	struct btrfs_block_rsv chunk_block_rsv;
40562306a36Sopenharmony_ci	/* Block reservation for delayed operations */
40662306a36Sopenharmony_ci	struct btrfs_block_rsv delayed_block_rsv;
40762306a36Sopenharmony_ci	/* Block reservation for delayed refs */
40862306a36Sopenharmony_ci	struct btrfs_block_rsv delayed_refs_rsv;
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci	struct btrfs_block_rsv empty_block_rsv;
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci	u64 generation;
41362306a36Sopenharmony_ci	u64 last_trans_committed;
41462306a36Sopenharmony_ci	/*
41562306a36Sopenharmony_ci	 * Generation of the last transaction used for block group relocation
41662306a36Sopenharmony_ci	 * since the filesystem was last mounted (or 0 if none happened yet).
41762306a36Sopenharmony_ci	 * Must be written and read while holding btrfs_fs_info::commit_root_sem.
41862306a36Sopenharmony_ci	 */
41962306a36Sopenharmony_ci	u64 last_reloc_trans;
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ci	/*
42262306a36Sopenharmony_ci	 * This is updated to the current trans every time a full commit is
42362306a36Sopenharmony_ci	 * required instead of the faster short fsync log commits
42462306a36Sopenharmony_ci	 */
42562306a36Sopenharmony_ci	u64 last_trans_log_full_commit;
42662306a36Sopenharmony_ci	unsigned long mount_opt;
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ci	unsigned long compress_type:4;
42962306a36Sopenharmony_ci	unsigned int compress_level;
43062306a36Sopenharmony_ci	u32 commit_interval;
43162306a36Sopenharmony_ci	/*
43262306a36Sopenharmony_ci	 * It is a suggestive number, the read side is safe even it gets a
43362306a36Sopenharmony_ci	 * wrong number because we will write out the data into a regular
43462306a36Sopenharmony_ci	 * extent. The write side(mount/remount) is under ->s_umount lock,
43562306a36Sopenharmony_ci	 * so it is also safe.
43662306a36Sopenharmony_ci	 */
43762306a36Sopenharmony_ci	u64 max_inline;
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci	struct btrfs_transaction *running_transaction;
44062306a36Sopenharmony_ci	wait_queue_head_t transaction_throttle;
44162306a36Sopenharmony_ci	wait_queue_head_t transaction_wait;
44262306a36Sopenharmony_ci	wait_queue_head_t transaction_blocked_wait;
44362306a36Sopenharmony_ci	wait_queue_head_t async_submit_wait;
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ci	/*
44662306a36Sopenharmony_ci	 * Used to protect the incompat_flags, compat_flags, compat_ro_flags
44762306a36Sopenharmony_ci	 * when they are updated.
44862306a36Sopenharmony_ci	 *
44962306a36Sopenharmony_ci	 * Because we do not clear the flags for ever, so we needn't use
45062306a36Sopenharmony_ci	 * the lock on the read side.
45162306a36Sopenharmony_ci	 *
45262306a36Sopenharmony_ci	 * We also needn't use the lock when we mount the fs, because
45362306a36Sopenharmony_ci	 * there is no other task which will update the flag.
45462306a36Sopenharmony_ci	 */
45562306a36Sopenharmony_ci	spinlock_t super_lock;
45662306a36Sopenharmony_ci	struct btrfs_super_block *super_copy;
45762306a36Sopenharmony_ci	struct btrfs_super_block *super_for_commit;
45862306a36Sopenharmony_ci	struct super_block *sb;
45962306a36Sopenharmony_ci	struct inode *btree_inode;
46062306a36Sopenharmony_ci	struct mutex tree_log_mutex;
46162306a36Sopenharmony_ci	struct mutex transaction_kthread_mutex;
46262306a36Sopenharmony_ci	struct mutex cleaner_mutex;
46362306a36Sopenharmony_ci	struct mutex chunk_mutex;
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci	/*
46662306a36Sopenharmony_ci	 * This is taken to make sure we don't set block groups ro after the
46762306a36Sopenharmony_ci	 * free space cache has been allocated on them.
46862306a36Sopenharmony_ci	 */
46962306a36Sopenharmony_ci	struct mutex ro_block_group_mutex;
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci	/*
47262306a36Sopenharmony_ci	 * This is used during read/modify/write to make sure no two ios are
47362306a36Sopenharmony_ci	 * trying to mod the same stripe at the same time.
47462306a36Sopenharmony_ci	 */
47562306a36Sopenharmony_ci	struct btrfs_stripe_hash_table *stripe_hash_table;
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci	/*
47862306a36Sopenharmony_ci	 * This protects the ordered operations list only while we are
47962306a36Sopenharmony_ci	 * processing all of the entries on it.  This way we make sure the
48062306a36Sopenharmony_ci	 * commit code doesn't find the list temporarily empty because another
48162306a36Sopenharmony_ci	 * function happens to be doing non-waiting preflush before jumping
48262306a36Sopenharmony_ci	 * into the main commit.
48362306a36Sopenharmony_ci	 */
48462306a36Sopenharmony_ci	struct mutex ordered_operations_mutex;
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci	struct rw_semaphore commit_root_sem;
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ci	struct rw_semaphore cleanup_work_sem;
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_ci	struct rw_semaphore subvol_sem;
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci	spinlock_t trans_lock;
49362306a36Sopenharmony_ci	/*
49462306a36Sopenharmony_ci	 * The reloc mutex goes with the trans lock, it is taken during commit
49562306a36Sopenharmony_ci	 * to protect us from the relocation code.
49662306a36Sopenharmony_ci	 */
49762306a36Sopenharmony_ci	struct mutex reloc_mutex;
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_ci	struct list_head trans_list;
50062306a36Sopenharmony_ci	struct list_head dead_roots;
50162306a36Sopenharmony_ci	struct list_head caching_block_groups;
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_ci	spinlock_t delayed_iput_lock;
50462306a36Sopenharmony_ci	struct list_head delayed_iputs;
50562306a36Sopenharmony_ci	atomic_t nr_delayed_iputs;
50662306a36Sopenharmony_ci	wait_queue_head_t delayed_iputs_wait;
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ci	atomic64_t tree_mod_seq;
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci	/* This protects tree_mod_log and tree_mod_seq_list */
51162306a36Sopenharmony_ci	rwlock_t tree_mod_log_lock;
51262306a36Sopenharmony_ci	struct rb_root tree_mod_log;
51362306a36Sopenharmony_ci	struct list_head tree_mod_seq_list;
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ci	atomic_t async_delalloc_pages;
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci	/* This is used to protect the following list -- ordered_roots. */
51862306a36Sopenharmony_ci	spinlock_t ordered_root_lock;
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci	/*
52162306a36Sopenharmony_ci	 * All fs/file tree roots in which there are data=ordered extents
52262306a36Sopenharmony_ci	 * pending writeback are added into this list.
52362306a36Sopenharmony_ci	 *
52462306a36Sopenharmony_ci	 * These can span multiple transactions and basically include every
52562306a36Sopenharmony_ci	 * dirty data page that isn't from nodatacow.
52662306a36Sopenharmony_ci	 */
52762306a36Sopenharmony_ci	struct list_head ordered_roots;
52862306a36Sopenharmony_ci
52962306a36Sopenharmony_ci	struct mutex delalloc_root_mutex;
53062306a36Sopenharmony_ci	spinlock_t delalloc_root_lock;
53162306a36Sopenharmony_ci	/* All fs/file tree roots that have delalloc inodes. */
53262306a36Sopenharmony_ci	struct list_head delalloc_roots;
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_ci	/*
53562306a36Sopenharmony_ci	 * There is a pool of worker threads for checksumming during writes and
53662306a36Sopenharmony_ci	 * a pool for checksumming after reads.  This is because readers can
53762306a36Sopenharmony_ci	 * run with FS locks held, and the writers may be waiting for those
53862306a36Sopenharmony_ci	 * locks.  We don't want ordering in the pending list to cause
53962306a36Sopenharmony_ci	 * deadlocks, and so the two are serviced separately.
54062306a36Sopenharmony_ci	 *
54162306a36Sopenharmony_ci	 * A third pool does submit_bio to avoid deadlocking with the other two.
54262306a36Sopenharmony_ci	 */
54362306a36Sopenharmony_ci	struct btrfs_workqueue *workers;
54462306a36Sopenharmony_ci	struct btrfs_workqueue *delalloc_workers;
54562306a36Sopenharmony_ci	struct btrfs_workqueue *flush_workers;
54662306a36Sopenharmony_ci	struct workqueue_struct *endio_workers;
54762306a36Sopenharmony_ci	struct workqueue_struct *endio_meta_workers;
54862306a36Sopenharmony_ci	struct workqueue_struct *rmw_workers;
54962306a36Sopenharmony_ci	struct workqueue_struct *compressed_write_workers;
55062306a36Sopenharmony_ci	struct btrfs_workqueue *endio_write_workers;
55162306a36Sopenharmony_ci	struct btrfs_workqueue *endio_freespace_worker;
55262306a36Sopenharmony_ci	struct btrfs_workqueue *caching_workers;
55362306a36Sopenharmony_ci
55462306a36Sopenharmony_ci	/*
55562306a36Sopenharmony_ci	 * Fixup workers take dirty pages that didn't properly go through the
55662306a36Sopenharmony_ci	 * cow mechanism and make them safe to write.  It happens for the
55762306a36Sopenharmony_ci	 * sys_munmap function call path.
55862306a36Sopenharmony_ci	 */
55962306a36Sopenharmony_ci	struct btrfs_workqueue *fixup_workers;
56062306a36Sopenharmony_ci	struct btrfs_workqueue *delayed_workers;
56162306a36Sopenharmony_ci
56262306a36Sopenharmony_ci	struct task_struct *transaction_kthread;
56362306a36Sopenharmony_ci	struct task_struct *cleaner_kthread;
56462306a36Sopenharmony_ci	u32 thread_pool_size;
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_ci	struct kobject *space_info_kobj;
56762306a36Sopenharmony_ci	struct kobject *qgroups_kobj;
56862306a36Sopenharmony_ci	struct kobject *discard_kobj;
56962306a36Sopenharmony_ci
57062306a36Sopenharmony_ci	/* Used to keep from writing metadata until there is a nice batch */
57162306a36Sopenharmony_ci	struct percpu_counter dirty_metadata_bytes;
57262306a36Sopenharmony_ci	struct percpu_counter delalloc_bytes;
57362306a36Sopenharmony_ci	struct percpu_counter ordered_bytes;
57462306a36Sopenharmony_ci	s32 dirty_metadata_batch;
57562306a36Sopenharmony_ci	s32 delalloc_batch;
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci	/* Protected by 'trans_lock'. */
57862306a36Sopenharmony_ci	struct list_head dirty_cowonly_roots;
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci	struct btrfs_fs_devices *fs_devices;
58162306a36Sopenharmony_ci
58262306a36Sopenharmony_ci	/*
58362306a36Sopenharmony_ci	 * The space_info list is effectively read only after initial setup.
58462306a36Sopenharmony_ci	 * It is populated at mount time and cleaned up after all block groups
58562306a36Sopenharmony_ci	 * are removed.  RCU is used to protect it.
58662306a36Sopenharmony_ci	 */
58762306a36Sopenharmony_ci	struct list_head space_info;
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_ci	struct btrfs_space_info *data_sinfo;
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_ci	struct reloc_control *reloc_ctl;
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ci	/* data_alloc_cluster is only used in ssd_spread mode */
59462306a36Sopenharmony_ci	struct btrfs_free_cluster data_alloc_cluster;
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci	/* All metadata allocations go through this cluster. */
59762306a36Sopenharmony_ci	struct btrfs_free_cluster meta_alloc_cluster;
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci	/* Auto defrag inodes go here. */
60062306a36Sopenharmony_ci	spinlock_t defrag_inodes_lock;
60162306a36Sopenharmony_ci	struct rb_root defrag_inodes;
60262306a36Sopenharmony_ci	atomic_t defrag_running;
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_ci	/* Used to protect avail_{data, metadata, system}_alloc_bits */
60562306a36Sopenharmony_ci	seqlock_t profiles_lock;
60662306a36Sopenharmony_ci	/*
60762306a36Sopenharmony_ci	 * These three are in extended format (availability of single chunks is
60862306a36Sopenharmony_ci	 * denoted by BTRFS_AVAIL_ALLOC_BIT_SINGLE bit, other types are denoted
60962306a36Sopenharmony_ci	 * by corresponding BTRFS_BLOCK_GROUP_* bits)
61062306a36Sopenharmony_ci	 */
61162306a36Sopenharmony_ci	u64 avail_data_alloc_bits;
61262306a36Sopenharmony_ci	u64 avail_metadata_alloc_bits;
61362306a36Sopenharmony_ci	u64 avail_system_alloc_bits;
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ci	/* Balance state */
61662306a36Sopenharmony_ci	spinlock_t balance_lock;
61762306a36Sopenharmony_ci	struct mutex balance_mutex;
61862306a36Sopenharmony_ci	atomic_t balance_pause_req;
61962306a36Sopenharmony_ci	atomic_t balance_cancel_req;
62062306a36Sopenharmony_ci	struct btrfs_balance_control *balance_ctl;
62162306a36Sopenharmony_ci	wait_queue_head_t balance_wait_q;
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_ci	/* Cancellation requests for chunk relocation */
62462306a36Sopenharmony_ci	atomic_t reloc_cancel_req;
62562306a36Sopenharmony_ci
62662306a36Sopenharmony_ci	u32 data_chunk_allocations;
62762306a36Sopenharmony_ci	u32 metadata_ratio;
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_ci	void *bdev_holder;
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ci	/* Private scrub information */
63262306a36Sopenharmony_ci	struct mutex scrub_lock;
63362306a36Sopenharmony_ci	atomic_t scrubs_running;
63462306a36Sopenharmony_ci	atomic_t scrub_pause_req;
63562306a36Sopenharmony_ci	atomic_t scrubs_paused;
63662306a36Sopenharmony_ci	atomic_t scrub_cancel_req;
63762306a36Sopenharmony_ci	wait_queue_head_t scrub_pause_wait;
63862306a36Sopenharmony_ci	/*
63962306a36Sopenharmony_ci	 * The worker pointers are NULL iff the refcount is 0, ie. scrub is not
64062306a36Sopenharmony_ci	 * running.
64162306a36Sopenharmony_ci	 */
64262306a36Sopenharmony_ci	refcount_t scrub_workers_refcnt;
64362306a36Sopenharmony_ci	struct workqueue_struct *scrub_workers;
64462306a36Sopenharmony_ci	struct btrfs_subpage_info *subpage_info;
64562306a36Sopenharmony_ci
64662306a36Sopenharmony_ci	struct btrfs_discard_ctl discard_ctl;
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci#ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
64962306a36Sopenharmony_ci	u32 check_integrity_print_mask;
65062306a36Sopenharmony_ci#endif
65162306a36Sopenharmony_ci	/* Is qgroup tracking in a consistent state? */
65262306a36Sopenharmony_ci	u64 qgroup_flags;
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci	/* Holds configuration and tracking. Protected by qgroup_lock. */
65562306a36Sopenharmony_ci	struct rb_root qgroup_tree;
65662306a36Sopenharmony_ci	spinlock_t qgroup_lock;
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci	/*
65962306a36Sopenharmony_ci	 * Used to avoid frequently calling ulist_alloc()/ulist_free()
66062306a36Sopenharmony_ci	 * when doing qgroup accounting, it must be protected by qgroup_lock.
66162306a36Sopenharmony_ci	 */
66262306a36Sopenharmony_ci	struct ulist *qgroup_ulist;
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ci	/*
66562306a36Sopenharmony_ci	 * Protect user change for quota operations. If a transaction is needed,
66662306a36Sopenharmony_ci	 * it must be started before locking this lock.
66762306a36Sopenharmony_ci	 */
66862306a36Sopenharmony_ci	struct mutex qgroup_ioctl_lock;
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci	/* List of dirty qgroups to be written at next commit. */
67162306a36Sopenharmony_ci	struct list_head dirty_qgroups;
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_ci	/* Used by qgroup for an efficient tree traversal. */
67462306a36Sopenharmony_ci	u64 qgroup_seq;
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_ci	/* Qgroup rescan items. */
67762306a36Sopenharmony_ci	/* Protects the progress item */
67862306a36Sopenharmony_ci	struct mutex qgroup_rescan_lock;
67962306a36Sopenharmony_ci	struct btrfs_key qgroup_rescan_progress;
68062306a36Sopenharmony_ci	struct btrfs_workqueue *qgroup_rescan_workers;
68162306a36Sopenharmony_ci	struct completion qgroup_rescan_completion;
68262306a36Sopenharmony_ci	struct btrfs_work qgroup_rescan_work;
68362306a36Sopenharmony_ci	/* Protected by qgroup_rescan_lock */
68462306a36Sopenharmony_ci	bool qgroup_rescan_running;
68562306a36Sopenharmony_ci	u8 qgroup_drop_subtree_thres;
68662306a36Sopenharmony_ci
68762306a36Sopenharmony_ci	/*
68862306a36Sopenharmony_ci	 * If this is not 0, then it indicates a serious filesystem error has
68962306a36Sopenharmony_ci	 * happened and it contains that error (negative errno value).
69062306a36Sopenharmony_ci	 */
69162306a36Sopenharmony_ci	int fs_error;
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci	/* Filesystem state */
69462306a36Sopenharmony_ci	unsigned long fs_state;
69562306a36Sopenharmony_ci
69662306a36Sopenharmony_ci	struct btrfs_delayed_root *delayed_root;
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_ci	/* Extent buffer radix tree */
69962306a36Sopenharmony_ci	spinlock_t buffer_lock;
70062306a36Sopenharmony_ci	/* Entries are eb->start / sectorsize */
70162306a36Sopenharmony_ci	struct radix_tree_root buffer_radix;
70262306a36Sopenharmony_ci
70362306a36Sopenharmony_ci	/* Next backup root to be overwritten */
70462306a36Sopenharmony_ci	int backup_root_index;
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	/* Device replace state */
70762306a36Sopenharmony_ci	struct btrfs_dev_replace dev_replace;
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_ci	struct semaphore uuid_tree_rescan_sem;
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_ci	/* Used to reclaim the metadata space in the background. */
71262306a36Sopenharmony_ci	struct work_struct async_reclaim_work;
71362306a36Sopenharmony_ci	struct work_struct async_data_reclaim_work;
71462306a36Sopenharmony_ci	struct work_struct preempt_reclaim_work;
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci	/* Reclaim partially filled block groups in the background */
71762306a36Sopenharmony_ci	struct work_struct reclaim_bgs_work;
71862306a36Sopenharmony_ci	struct list_head reclaim_bgs;
71962306a36Sopenharmony_ci	int bg_reclaim_threshold;
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_ci	spinlock_t unused_bgs_lock;
72262306a36Sopenharmony_ci	struct list_head unused_bgs;
72362306a36Sopenharmony_ci	struct mutex unused_bg_unpin_mutex;
72462306a36Sopenharmony_ci	/* Protect block groups that are going to be deleted */
72562306a36Sopenharmony_ci	struct mutex reclaim_bgs_lock;
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci	/* Cached block sizes */
72862306a36Sopenharmony_ci	u32 nodesize;
72962306a36Sopenharmony_ci	u32 sectorsize;
73062306a36Sopenharmony_ci	/* ilog2 of sectorsize, use to avoid 64bit division */
73162306a36Sopenharmony_ci	u32 sectorsize_bits;
73262306a36Sopenharmony_ci	u32 csum_size;
73362306a36Sopenharmony_ci	u32 csums_per_leaf;
73462306a36Sopenharmony_ci	u32 stripesize;
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_ci	/*
73762306a36Sopenharmony_ci	 * Maximum size of an extent. BTRFS_MAX_EXTENT_SIZE on regular
73862306a36Sopenharmony_ci	 * filesystem, on zoned it depends on the device constraints.
73962306a36Sopenharmony_ci	 */
74062306a36Sopenharmony_ci	u64 max_extent_size;
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ci	/* Block groups and devices containing active swapfiles. */
74362306a36Sopenharmony_ci	spinlock_t swapfile_pins_lock;
74462306a36Sopenharmony_ci	struct rb_root swapfile_pins;
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci	struct crypto_shash *csum_shash;
74762306a36Sopenharmony_ci
74862306a36Sopenharmony_ci	/* Type of exclusive operation running, protected by super_lock */
74962306a36Sopenharmony_ci	enum btrfs_exclusive_operation exclusive_operation;
75062306a36Sopenharmony_ci
75162306a36Sopenharmony_ci	/*
75262306a36Sopenharmony_ci	 * Zone size > 0 when in ZONED mode, otherwise it's used for a check
75362306a36Sopenharmony_ci	 * if the mode is enabled
75462306a36Sopenharmony_ci	 */
75562306a36Sopenharmony_ci	u64 zone_size;
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_ci	/* Constraints for ZONE_APPEND commands: */
75862306a36Sopenharmony_ci	struct queue_limits limits;
75962306a36Sopenharmony_ci	u64 max_zone_append_size;
76062306a36Sopenharmony_ci
76162306a36Sopenharmony_ci	struct mutex zoned_meta_io_lock;
76262306a36Sopenharmony_ci	spinlock_t treelog_bg_lock;
76362306a36Sopenharmony_ci	u64 treelog_bg;
76462306a36Sopenharmony_ci
76562306a36Sopenharmony_ci	/*
76662306a36Sopenharmony_ci	 * Start of the dedicated data relocation block group, protected by
76762306a36Sopenharmony_ci	 * relocation_bg_lock.
76862306a36Sopenharmony_ci	 */
76962306a36Sopenharmony_ci	spinlock_t relocation_bg_lock;
77062306a36Sopenharmony_ci	u64 data_reloc_bg;
77162306a36Sopenharmony_ci	struct mutex zoned_data_reloc_io_lock;
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_ci	struct btrfs_block_group *active_meta_bg;
77462306a36Sopenharmony_ci	struct btrfs_block_group *active_system_bg;
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci	u64 nr_global_roots;
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_ci	spinlock_t zone_active_bgs_lock;
77962306a36Sopenharmony_ci	struct list_head zone_active_bgs;
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_ci	/* Updates are not protected by any lock */
78262306a36Sopenharmony_ci	struct btrfs_commit_stats commit_stats;
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_ci	/*
78562306a36Sopenharmony_ci	 * Last generation where we dropped a non-relocation root.
78662306a36Sopenharmony_ci	 * Use btrfs_set_last_root_drop_gen() and btrfs_get_last_root_drop_gen()
78762306a36Sopenharmony_ci	 * to change it and to read it, respectively.
78862306a36Sopenharmony_ci	 */
78962306a36Sopenharmony_ci	u64 last_root_drop_gen;
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ci	/*
79262306a36Sopenharmony_ci	 * Annotations for transaction events (structures are empty when
79362306a36Sopenharmony_ci	 * compiled without lockdep).
79462306a36Sopenharmony_ci	 */
79562306a36Sopenharmony_ci	struct lockdep_map btrfs_trans_num_writers_map;
79662306a36Sopenharmony_ci	struct lockdep_map btrfs_trans_num_extwriters_map;
79762306a36Sopenharmony_ci	struct lockdep_map btrfs_state_change_map[4];
79862306a36Sopenharmony_ci	struct lockdep_map btrfs_trans_pending_ordered_map;
79962306a36Sopenharmony_ci	struct lockdep_map btrfs_ordered_extent_map;
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_ci#ifdef CONFIG_BTRFS_FS_REF_VERIFY
80262306a36Sopenharmony_ci	spinlock_t ref_verify_lock;
80362306a36Sopenharmony_ci	struct rb_root block_tree;
80462306a36Sopenharmony_ci#endif
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci#ifdef CONFIG_BTRFS_DEBUG
80762306a36Sopenharmony_ci	struct kobject *debug_kobj;
80862306a36Sopenharmony_ci	struct list_head allocated_roots;
80962306a36Sopenharmony_ci
81062306a36Sopenharmony_ci	spinlock_t eb_leak_lock;
81162306a36Sopenharmony_ci	struct list_head allocated_ebs;
81262306a36Sopenharmony_ci#endif
81362306a36Sopenharmony_ci};
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_cistatic inline void btrfs_set_last_root_drop_gen(struct btrfs_fs_info *fs_info,
81662306a36Sopenharmony_ci						u64 gen)
81762306a36Sopenharmony_ci{
81862306a36Sopenharmony_ci	WRITE_ONCE(fs_info->last_root_drop_gen, gen);
81962306a36Sopenharmony_ci}
82062306a36Sopenharmony_ci
82162306a36Sopenharmony_cistatic inline u64 btrfs_get_last_root_drop_gen(const struct btrfs_fs_info *fs_info)
82262306a36Sopenharmony_ci{
82362306a36Sopenharmony_ci	return READ_ONCE(fs_info->last_root_drop_gen);
82462306a36Sopenharmony_ci}
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_ci/*
82762306a36Sopenharmony_ci * Take the number of bytes to be checksummed and figure out how many leaves
82862306a36Sopenharmony_ci * it would require to store the csums for that many bytes.
82962306a36Sopenharmony_ci */
83062306a36Sopenharmony_cistatic inline u64 btrfs_csum_bytes_to_leaves(
83162306a36Sopenharmony_ci			const struct btrfs_fs_info *fs_info, u64 csum_bytes)
83262306a36Sopenharmony_ci{
83362306a36Sopenharmony_ci	const u64 num_csums = csum_bytes >> fs_info->sectorsize_bits;
83462306a36Sopenharmony_ci
83562306a36Sopenharmony_ci	return DIV_ROUND_UP_ULL(num_csums, fs_info->csums_per_leaf);
83662306a36Sopenharmony_ci}
83762306a36Sopenharmony_ci
83862306a36Sopenharmony_ci/*
83962306a36Sopenharmony_ci * Use this if we would be adding new items, as we could split nodes as we cow
84062306a36Sopenharmony_ci * down the tree.
84162306a36Sopenharmony_ci */
84262306a36Sopenharmony_cistatic inline u64 btrfs_calc_insert_metadata_size(const struct btrfs_fs_info *fs_info,
84362306a36Sopenharmony_ci						  unsigned num_items)
84462306a36Sopenharmony_ci{
84562306a36Sopenharmony_ci	return (u64)fs_info->nodesize * BTRFS_MAX_LEVEL * 2 * num_items;
84662306a36Sopenharmony_ci}
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_ci/*
84962306a36Sopenharmony_ci * Doing a truncate or a modification won't result in new nodes or leaves, just
85062306a36Sopenharmony_ci * what we need for COW.
85162306a36Sopenharmony_ci */
85262306a36Sopenharmony_cistatic inline u64 btrfs_calc_metadata_size(const struct btrfs_fs_info *fs_info,
85362306a36Sopenharmony_ci						 unsigned num_items)
85462306a36Sopenharmony_ci{
85562306a36Sopenharmony_ci	return (u64)fs_info->nodesize * BTRFS_MAX_LEVEL * num_items;
85662306a36Sopenharmony_ci}
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r->fs_info) >> 4) - \
85962306a36Sopenharmony_ci					sizeof(struct btrfs_item))
86062306a36Sopenharmony_ci
86162306a36Sopenharmony_cistatic inline bool btrfs_is_zoned(const struct btrfs_fs_info *fs_info)
86262306a36Sopenharmony_ci{
86362306a36Sopenharmony_ci	return IS_ENABLED(CONFIG_BLK_DEV_ZONED) && fs_info->zone_size > 0;
86462306a36Sopenharmony_ci}
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_ci/*
86762306a36Sopenharmony_ci * Count how many fs_info->max_extent_size cover the @size
86862306a36Sopenharmony_ci */
86962306a36Sopenharmony_cistatic inline u32 count_max_extents(struct btrfs_fs_info *fs_info, u64 size)
87062306a36Sopenharmony_ci{
87162306a36Sopenharmony_ci#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
87262306a36Sopenharmony_ci	if (!fs_info)
87362306a36Sopenharmony_ci		return div_u64(size + BTRFS_MAX_EXTENT_SIZE - 1, BTRFS_MAX_EXTENT_SIZE);
87462306a36Sopenharmony_ci#endif
87562306a36Sopenharmony_ci
87662306a36Sopenharmony_ci	return div_u64(size + fs_info->max_extent_size - 1, fs_info->max_extent_size);
87762306a36Sopenharmony_ci}
87862306a36Sopenharmony_ci
87962306a36Sopenharmony_cibool btrfs_exclop_start(struct btrfs_fs_info *fs_info,
88062306a36Sopenharmony_ci			enum btrfs_exclusive_operation type);
88162306a36Sopenharmony_cibool btrfs_exclop_start_try_lock(struct btrfs_fs_info *fs_info,
88262306a36Sopenharmony_ci				 enum btrfs_exclusive_operation type);
88362306a36Sopenharmony_civoid btrfs_exclop_start_unlock(struct btrfs_fs_info *fs_info);
88462306a36Sopenharmony_civoid btrfs_exclop_finish(struct btrfs_fs_info *fs_info);
88562306a36Sopenharmony_civoid btrfs_exclop_balance(struct btrfs_fs_info *fs_info,
88662306a36Sopenharmony_ci			  enum btrfs_exclusive_operation op);
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_ci/* Compatibility and incompatibility defines */
88962306a36Sopenharmony_civoid __btrfs_set_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag,
89062306a36Sopenharmony_ci			     const char *name);
89162306a36Sopenharmony_civoid __btrfs_clear_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag,
89262306a36Sopenharmony_ci			       const char *name);
89362306a36Sopenharmony_civoid __btrfs_set_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag,
89462306a36Sopenharmony_ci			      const char *name);
89562306a36Sopenharmony_civoid __btrfs_clear_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag,
89662306a36Sopenharmony_ci				const char *name);
89762306a36Sopenharmony_ci
89862306a36Sopenharmony_ci#define __btrfs_fs_incompat(fs_info, flags)				\
89962306a36Sopenharmony_ci	(!!(btrfs_super_incompat_flags((fs_info)->super_copy) & (flags)))
90062306a36Sopenharmony_ci
90162306a36Sopenharmony_ci#define __btrfs_fs_compat_ro(fs_info, flags)				\
90262306a36Sopenharmony_ci	(!!(btrfs_super_compat_ro_flags((fs_info)->super_copy) & (flags)))
90362306a36Sopenharmony_ci
90462306a36Sopenharmony_ci#define btrfs_set_fs_incompat(__fs_info, opt)				\
90562306a36Sopenharmony_ci	__btrfs_set_fs_incompat((__fs_info), BTRFS_FEATURE_INCOMPAT_##opt, #opt)
90662306a36Sopenharmony_ci
90762306a36Sopenharmony_ci#define btrfs_clear_fs_incompat(__fs_info, opt)				\
90862306a36Sopenharmony_ci	__btrfs_clear_fs_incompat((__fs_info), BTRFS_FEATURE_INCOMPAT_##opt, #opt)
90962306a36Sopenharmony_ci
91062306a36Sopenharmony_ci#define btrfs_fs_incompat(fs_info, opt)					\
91162306a36Sopenharmony_ci	__btrfs_fs_incompat((fs_info), BTRFS_FEATURE_INCOMPAT_##opt)
91262306a36Sopenharmony_ci
91362306a36Sopenharmony_ci#define btrfs_set_fs_compat_ro(__fs_info, opt)				\
91462306a36Sopenharmony_ci	__btrfs_set_fs_compat_ro((__fs_info), BTRFS_FEATURE_COMPAT_RO_##opt, #opt)
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_ci#define btrfs_clear_fs_compat_ro(__fs_info, opt)			\
91762306a36Sopenharmony_ci	__btrfs_clear_fs_compat_ro((__fs_info), BTRFS_FEATURE_COMPAT_RO_##opt, #opt)
91862306a36Sopenharmony_ci
91962306a36Sopenharmony_ci#define btrfs_fs_compat_ro(fs_info, opt)				\
92062306a36Sopenharmony_ci	__btrfs_fs_compat_ro((fs_info), BTRFS_FEATURE_COMPAT_RO_##opt)
92162306a36Sopenharmony_ci
92262306a36Sopenharmony_ci#define btrfs_clear_opt(o, opt)		((o) &= ~BTRFS_MOUNT_##opt)
92362306a36Sopenharmony_ci#define btrfs_set_opt(o, opt)		((o) |= BTRFS_MOUNT_##opt)
92462306a36Sopenharmony_ci#define btrfs_raw_test_opt(o, opt)	((o) & BTRFS_MOUNT_##opt)
92562306a36Sopenharmony_ci#define btrfs_test_opt(fs_info, opt)	((fs_info)->mount_opt & \
92662306a36Sopenharmony_ci					 BTRFS_MOUNT_##opt)
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci#define btrfs_set_and_info(fs_info, opt, fmt, args...)			\
92962306a36Sopenharmony_cido {									\
93062306a36Sopenharmony_ci	if (!btrfs_test_opt(fs_info, opt))				\
93162306a36Sopenharmony_ci		btrfs_info(fs_info, fmt, ##args);			\
93262306a36Sopenharmony_ci	btrfs_set_opt(fs_info->mount_opt, opt);				\
93362306a36Sopenharmony_ci} while (0)
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci#define btrfs_clear_and_info(fs_info, opt, fmt, args...)		\
93662306a36Sopenharmony_cido {									\
93762306a36Sopenharmony_ci	if (btrfs_test_opt(fs_info, opt))				\
93862306a36Sopenharmony_ci		btrfs_info(fs_info, fmt, ##args);			\
93962306a36Sopenharmony_ci	btrfs_clear_opt(fs_info->mount_opt, opt);			\
94062306a36Sopenharmony_ci} while (0)
94162306a36Sopenharmony_ci
94262306a36Sopenharmony_cistatic inline int btrfs_fs_closing(struct btrfs_fs_info *fs_info)
94362306a36Sopenharmony_ci{
94462306a36Sopenharmony_ci	/* Do it this way so we only ever do one test_bit in the normal case. */
94562306a36Sopenharmony_ci	if (test_bit(BTRFS_FS_CLOSING_START, &fs_info->flags)) {
94662306a36Sopenharmony_ci		if (test_bit(BTRFS_FS_CLOSING_DONE, &fs_info->flags))
94762306a36Sopenharmony_ci			return 2;
94862306a36Sopenharmony_ci		return 1;
94962306a36Sopenharmony_ci	}
95062306a36Sopenharmony_ci	return 0;
95162306a36Sopenharmony_ci}
95262306a36Sopenharmony_ci
95362306a36Sopenharmony_ci/*
95462306a36Sopenharmony_ci * If we remount the fs to be R/O or umount the fs, the cleaner needn't do
95562306a36Sopenharmony_ci * anything except sleeping. This function is used to check the status of
95662306a36Sopenharmony_ci * the fs.
95762306a36Sopenharmony_ci * We check for BTRFS_FS_STATE_RO to avoid races with a concurrent remount,
95862306a36Sopenharmony_ci * since setting and checking for SB_RDONLY in the superblock's flags is not
95962306a36Sopenharmony_ci * atomic.
96062306a36Sopenharmony_ci */
96162306a36Sopenharmony_cistatic inline int btrfs_need_cleaner_sleep(struct btrfs_fs_info *fs_info)
96262306a36Sopenharmony_ci{
96362306a36Sopenharmony_ci	return test_bit(BTRFS_FS_STATE_RO, &fs_info->fs_state) ||
96462306a36Sopenharmony_ci		btrfs_fs_closing(fs_info);
96562306a36Sopenharmony_ci}
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_cistatic inline void btrfs_wake_unfinished_drop(struct btrfs_fs_info *fs_info)
96862306a36Sopenharmony_ci{
96962306a36Sopenharmony_ci	clear_and_wake_up_bit(BTRFS_FS_UNFINISHED_DROPS, &fs_info->flags);
97062306a36Sopenharmony_ci}
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_ci#define BTRFS_FS_ERROR(fs_info)	(READ_ONCE((fs_info)->fs_error))
97362306a36Sopenharmony_ci
97462306a36Sopenharmony_ci#define BTRFS_FS_LOG_CLEANUP_ERROR(fs_info)				\
97562306a36Sopenharmony_ci	(unlikely(test_bit(BTRFS_FS_STATE_LOG_CLEANUP_ERROR,		\
97662306a36Sopenharmony_ci			   &(fs_info)->fs_state)))
97762306a36Sopenharmony_ci
97862306a36Sopenharmony_ci#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
97962306a36Sopenharmony_ci
98062306a36Sopenharmony_ci#define EXPORT_FOR_TESTS
98162306a36Sopenharmony_ci
98262306a36Sopenharmony_cistatic inline int btrfs_is_testing(struct btrfs_fs_info *fs_info)
98362306a36Sopenharmony_ci{
98462306a36Sopenharmony_ci	return test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state);
98562306a36Sopenharmony_ci}
98662306a36Sopenharmony_ci
98762306a36Sopenharmony_civoid btrfs_test_destroy_inode(struct inode *inode);
98862306a36Sopenharmony_ci
98962306a36Sopenharmony_ci#else
99062306a36Sopenharmony_ci
99162306a36Sopenharmony_ci#define EXPORT_FOR_TESTS static
99262306a36Sopenharmony_ci
99362306a36Sopenharmony_cistatic inline int btrfs_is_testing(struct btrfs_fs_info *fs_info)
99462306a36Sopenharmony_ci{
99562306a36Sopenharmony_ci	return 0;
99662306a36Sopenharmony_ci}
99762306a36Sopenharmony_ci#endif
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci#endif
1000