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