^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2007 Oracle. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef BTRFS_CTREE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define BTRFS_CTREE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/sched/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/highmem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/rwsem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/semaphore.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/completion.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/backing-dev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/wait.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <trace/events/btrfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <asm/kmap_types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <asm/unaligned.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/pagemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/btrfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/btrfs_tree.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/security.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/sizes.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/dynamic_debug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/refcount.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/crc32c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include "extent-io-tree.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include "extent_io.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include "extent_map.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include "async-thread.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include "block-rsv.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include "locking.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct btrfs_trans_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct btrfs_transaction;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct btrfs_pending_snapshot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) struct btrfs_delayed_ref_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct btrfs_space_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct btrfs_block_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) extern struct kmem_cache *btrfs_trans_handle_cachep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) extern struct kmem_cache *btrfs_bit_radix_cachep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) extern struct kmem_cache *btrfs_path_cachep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) extern struct kmem_cache *btrfs_free_space_cachep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) extern struct kmem_cache *btrfs_free_space_bitmap_cachep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct btrfs_ordered_sum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct btrfs_ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define BTRFS_MAGIC 0x4D5F53665248425FULL /* ascii _BHRfS_M, no null */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * Maximum number of mirrors that can be available for all profiles counting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * the target device of dev-replace as one. During an active device replace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * procedure, the target device of the copy operation is a mirror for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * filesystem data as well that can be used to read data in order to repair
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * read errors on other disks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * Current value is derived from RAID1C4 with 4 copies.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define BTRFS_MAX_MIRRORS (4 + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define BTRFS_MAX_LEVEL 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define BTRFS_OLDEST_GENERATION 0ULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * the max metadata block size. This limit is somewhat artificial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * but the memmove costs go through the roof for larger blocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define BTRFS_MAX_METADATA_BLOCKSIZE 65536
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * we can actually store much bigger names, but lets not confuse the rest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * of linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define BTRFS_NAME_LEN 255
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * Theoretical limit is larger, but we keep this down to a sane
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * value. That should limit greatly the possibility of collisions on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * inode ref items.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define BTRFS_LINK_MAX 65535U
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define BTRFS_EMPTY_DIR_SIZE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* ioprio of readahead is set to idle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define BTRFS_IOPRIO_READA (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define BTRFS_DIRTY_METADATA_THRESH SZ_32M
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * Use large batch size to reduce overhead of metadata updates. On the reader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * side, we only read it when we are close to ENOSPC and the read overhead is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * mostly related to the number of CPUs, so it is OK to use arbitrary large
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * value here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define BTRFS_TOTAL_BYTES_PINNED_BATCH SZ_128M
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define BTRFS_MAX_EXTENT_SIZE SZ_128M
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) * Deltas are an effective way to populate global statistics. Give macro names
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) * to make it clear what we're doing. An example is discard_extents in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * btrfs_free_space_ctl.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define BTRFS_STAT_NR_ENTRIES 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define BTRFS_STAT_CURR 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define BTRFS_STAT_PREV 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * Count how many BTRFS_MAX_EXTENT_SIZE cover the @size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static inline u32 count_max_extents(u64 size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) return div_u64(size + BTRFS_MAX_EXTENT_SIZE - 1, BTRFS_MAX_EXTENT_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) static inline unsigned long btrfs_chunk_item_size(int num_stripes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) BUG_ON(num_stripes == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) return sizeof(struct btrfs_chunk) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) sizeof(struct btrfs_stripe) * (num_stripes - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * Runtime (in-memory) states of filesystem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* Global indicator of serious filesystem errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) BTRFS_FS_STATE_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * Filesystem is being remounted, allow to skip some operations, like
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * defrag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) BTRFS_FS_STATE_REMOUNTING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* Track if a transaction abort has been reported on this filesystem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) BTRFS_FS_STATE_TRANS_ABORTED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) * Bio operations should be blocked on this filesystem because a source
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * or target device is being destroyed as part of a device replace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) BTRFS_FS_STATE_DEV_REPLACING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* The btrfs_fs_info created for self-tests */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) BTRFS_FS_STATE_DUMMY_FS_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define BTRFS_BACKREF_REV_MAX 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define BTRFS_BACKREF_REV_SHIFT 56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define BTRFS_BACKREF_REV_MASK (((u64)BTRFS_BACKREF_REV_MAX - 1) << \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) BTRFS_BACKREF_REV_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define BTRFS_OLD_BACKREF_REV 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define BTRFS_MIXED_BACKREF_REV 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * every tree block (leaf or node) starts with this header.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) struct btrfs_header {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /* these first four must match the super block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) u8 csum[BTRFS_CSUM_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) __le64 bytenr; /* which block this node is supposed to live in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) __le64 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) /* allowed to be different from the super from here on down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) __le64 generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) __le64 owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) __le32 nritems;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) u8 level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) * this is a very generous portion of the super block, giving us
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) * room to translate 14 chunks with 3 stripes each.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) * just in case we somehow lose the roots and are not able to mount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) * we store an array of the roots from previous transactions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) * in the super.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define BTRFS_NUM_BACKUP_ROOTS 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) struct btrfs_root_backup {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) __le64 tree_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) __le64 tree_root_gen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) __le64 chunk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) __le64 chunk_root_gen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) __le64 extent_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) __le64 extent_root_gen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) __le64 fs_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) __le64 fs_root_gen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) __le64 dev_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) __le64 dev_root_gen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) __le64 csum_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) __le64 csum_root_gen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) __le64 total_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) __le64 bytes_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) __le64 num_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) /* future */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) __le64 unused_64[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) u8 tree_root_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) u8 chunk_root_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) u8 extent_root_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) u8 fs_root_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) u8 dev_root_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) u8 csum_root_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* future and to align */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) u8 unused_8[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * the super block basically lists the main trees of the FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * it currently lacks any block count etc etc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) struct btrfs_super_block {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /* the first 4 fields must match struct btrfs_header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) u8 csum[BTRFS_CSUM_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) /* FS specific UUID, visible to user */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) u8 fsid[BTRFS_FSID_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) __le64 bytenr; /* this block number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) __le64 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* allowed to be different from the btrfs_header from here own down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) __le64 magic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) __le64 generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) __le64 root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) __le64 chunk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) __le64 log_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /* this will help find the new super based on the log root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) __le64 log_root_transid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) __le64 total_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) __le64 bytes_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) __le64 root_dir_objectid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) __le64 num_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) __le32 sectorsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) __le32 nodesize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) __le32 __unused_leafsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) __le32 stripesize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) __le32 sys_chunk_array_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) __le64 chunk_root_generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) __le64 compat_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) __le64 compat_ro_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) __le64 incompat_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) __le16 csum_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) u8 root_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) u8 chunk_root_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) u8 log_root_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) struct btrfs_dev_item dev_item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) char label[BTRFS_LABEL_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) __le64 cache_generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) __le64 uuid_tree_generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) /* the UUID written into btree blocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) u8 metadata_uuid[BTRFS_FSID_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) /* future expansion */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) __le64 reserved[28];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) struct btrfs_root_backup super_roots[BTRFS_NUM_BACKUP_ROOTS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) * Compat flags that we support. If any incompat flags are set other than the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) * ones specified below then we will fail to mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) #define BTRFS_FEATURE_COMPAT_SUPP 0ULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) #define BTRFS_FEATURE_COMPAT_SAFE_SET 0ULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) #define BTRFS_FEATURE_COMPAT_SAFE_CLEAR 0ULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) #define BTRFS_FEATURE_COMPAT_RO_SUPP \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) (BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) #define BTRFS_FEATURE_COMPAT_RO_SAFE_SET 0ULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) #define BTRFS_FEATURE_COMPAT_RO_SAFE_CLEAR 0ULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define BTRFS_FEATURE_INCOMPAT_SUPP \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) (BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) BTRFS_FEATURE_INCOMPAT_BIG_METADATA | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) BTRFS_FEATURE_INCOMPAT_COMPRESS_ZSTD | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) BTRFS_FEATURE_INCOMPAT_RAID56 | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) BTRFS_FEATURE_INCOMPAT_NO_HOLES | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) BTRFS_FEATURE_INCOMPAT_METADATA_UUID | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) BTRFS_FEATURE_INCOMPAT_RAID1C34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) #define BTRFS_FEATURE_INCOMPAT_SAFE_SET \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) (BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) #define BTRFS_FEATURE_INCOMPAT_SAFE_CLEAR 0ULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) * A leaf is full of items. offset and size tell us where to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) * the item in the leaf (relative to the start of the data area)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) struct btrfs_item {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) struct btrfs_disk_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) __le32 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) __le32 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) * leaves have an item area and a data area:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) * [item0, item1....itemN] [free space] [dataN...data1, data0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) * The data is separate from the items to get the keys closer together
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) * during searches.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) struct btrfs_leaf {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) struct btrfs_header header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) struct btrfs_item items[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) * all non-leaf blocks are nodes, they hold only keys and pointers to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) * other blocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) struct btrfs_key_ptr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) struct btrfs_disk_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) __le64 blockptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) __le64 generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) struct btrfs_node {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) struct btrfs_header header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) struct btrfs_key_ptr ptrs[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) * btrfs_paths remember the path taken from the root down to the leaf.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) * level 0 is always the leaf, and nodes[1...BTRFS_MAX_LEVEL] will point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) * to any other levels that are present.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) * The slots array records the index of the item or block pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) * used while walking the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) enum { READA_NONE, READA_BACK, READA_FORWARD };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) struct btrfs_path {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) struct extent_buffer *nodes[BTRFS_MAX_LEVEL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) int slots[BTRFS_MAX_LEVEL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) /* if there is real range locking, this locks field will change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) u8 locks[BTRFS_MAX_LEVEL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) u8 reada;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) /* keep some upper locks as we walk down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) u8 lowest_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) * set by btrfs_split_item, tells search_slot to keep all locks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) * and to force calls to keep space in the nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) unsigned int search_for_split:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) unsigned int keep_locks:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) unsigned int skip_locking:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) unsigned int leave_spinning:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) unsigned int search_commit_root:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) unsigned int need_commit_sem:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) unsigned int skip_release_on_error:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) unsigned int recurse:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) #define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r->fs_info) >> 4) - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) sizeof(struct btrfs_item))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) struct btrfs_dev_replace {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) u64 replace_state; /* see #define above */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) time64_t time_started; /* seconds since 1-Jan-1970 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) time64_t time_stopped; /* seconds since 1-Jan-1970 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) atomic64_t num_write_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) atomic64_t num_uncorrectable_read_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) u64 cursor_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) u64 committed_cursor_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) u64 cursor_left_last_write_of_item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) u64 cursor_right;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) u64 cont_reading_from_srcdev_mode; /* see #define above */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) int is_valid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) int item_needs_writeback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) struct btrfs_device *srcdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) struct btrfs_device *tgtdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) struct mutex lock_finishing_cancel_unmount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) struct rw_semaphore rwsem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) struct btrfs_scrub_progress scrub_progress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) struct percpu_counter bio_counter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) wait_queue_head_t replace_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) * free clusters are used to claim free space in relatively large chunks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) * allowing us to do less seeky writes. They are used for all metadata
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) * allocations. In ssd_spread mode they are also used for data allocations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) struct btrfs_free_cluster {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) spinlock_t refill_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) struct rb_root root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) /* largest extent in this cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) u64 max_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) /* first extent starting offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) u64 window_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) /* We did a full search and couldn't create a cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) bool fragmented;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) struct btrfs_block_group *block_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) * when a cluster is allocated from a block group, we put the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) * cluster onto a list in the block group so that it can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) * be freed before the block group is freed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) struct list_head block_group_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) enum btrfs_caching_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) BTRFS_CACHE_NO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) BTRFS_CACHE_STARTED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) BTRFS_CACHE_FAST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) BTRFS_CACHE_FINISHED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) BTRFS_CACHE_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) * Tree to record all locked full stripes of a RAID5/6 block group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) struct btrfs_full_stripe_locks_tree {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) struct rb_root root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) struct mutex lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) /* Discard control. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * Async discard uses multiple lists to differentiate the discard filter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * parameters. Index 0 is for completely free block groups where we need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * ensure the entire block group is trimmed without being lossy. Indices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * afterwards represent monotonically decreasing discard filter sizes to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) * prioritize what should be discarded next.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) #define BTRFS_NR_DISCARD_LISTS 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) #define BTRFS_DISCARD_INDEX_UNUSED 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) #define BTRFS_DISCARD_INDEX_START 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) struct btrfs_discard_ctl {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) struct workqueue_struct *discard_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) struct delayed_work work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) struct btrfs_block_group *block_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) struct list_head discard_list[BTRFS_NR_DISCARD_LISTS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) u64 prev_discard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) atomic_t discardable_extents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) atomic64_t discardable_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) u64 max_discard_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) unsigned long delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) u32 iops_limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) u32 kbps_limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) u64 discard_extent_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) u64 discard_bitmap_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) atomic64_t discard_bytes_saved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) /* delayed seq elem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) struct seq_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) u64 seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) #define SEQ_LIST_INIT(name) { .list = LIST_HEAD_INIT((name).list), .seq = 0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) #define SEQ_LAST ((u64)-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) enum btrfs_orphan_cleanup_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) ORPHAN_CLEANUP_STARTED = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) ORPHAN_CLEANUP_DONE = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) void btrfs_init_async_reclaim_work(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) /* fs_info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) struct reloc_control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) struct btrfs_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) struct btrfs_fs_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) struct btrfs_balance_control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) struct btrfs_delayed_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) * Block group or device which contains an active swapfile. Used for preventing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) * unsafe operations while a swapfile is active.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) * These are sorted on (ptr, inode) (note that a block group or device can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) * contain more than one swapfile). We compare the pointer values because we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) * don't actually care what the object is, we just need a quick check whether
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) * the object exists in the rbtree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) struct btrfs_swapfile_pin {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) struct rb_node node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) void *ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) struct inode *inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) * If true, ptr points to a struct btrfs_block_group. Otherwise, ptr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) * points to a struct btrfs_device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) bool is_block_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) * Only used when 'is_block_group' is true and it is the number of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) * extents used by a swapfile for this block group ('ptr' field).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) int bg_extent_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) bool btrfs_pinned_by_swapfile(struct btrfs_fs_info *fs_info, void *ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) BTRFS_FS_BARRIER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) BTRFS_FS_CLOSING_START,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) BTRFS_FS_CLOSING_DONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) BTRFS_FS_LOG_RECOVERING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) BTRFS_FS_OPEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) BTRFS_FS_QUOTA_ENABLED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) BTRFS_FS_UPDATE_UUID_TREE_GEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) BTRFS_FS_CREATING_FREE_SPACE_TREE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) BTRFS_FS_BTREE_ERR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) BTRFS_FS_LOG1_ERR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) BTRFS_FS_LOG2_ERR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) BTRFS_FS_QUOTA_OVERRIDE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) /* Used to record internally whether fs has been frozen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) BTRFS_FS_FROZEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) * Indicate that balance has been set up from the ioctl and is in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) * main phase. The fs_info::balance_ctl is initialized.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) * Set and cleared while holding fs_info::balance_mutex.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) BTRFS_FS_BALANCE_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) /* Indicate that the cleaner thread is awake and doing something. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) BTRFS_FS_CLEANER_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) * The checksumming has an optimized version and is considered fast,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) * so we don't need to offload checksums to workqueues.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) BTRFS_FS_CSUM_IMPL_FAST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) /* Indicate that the discard workqueue can service discards. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) BTRFS_FS_DISCARD_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) /* Indicate that we can't trust the free space tree for caching yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) * Exclusive operations (device replace, resize, device add/remove, balance)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) enum btrfs_exclusive_operation {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) BTRFS_EXCLOP_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) BTRFS_EXCLOP_BALANCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) BTRFS_EXCLOP_DEV_ADD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) BTRFS_EXCLOP_DEV_REMOVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) BTRFS_EXCLOP_DEV_REPLACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) BTRFS_EXCLOP_RESIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) BTRFS_EXCLOP_SWAP_ACTIVATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) struct btrfs_fs_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) struct btrfs_root *extent_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) struct btrfs_root *tree_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) struct btrfs_root *chunk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) struct btrfs_root *dev_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) struct btrfs_root *fs_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) struct btrfs_root *csum_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) struct btrfs_root *quota_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) struct btrfs_root *uuid_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) struct btrfs_root *free_space_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) struct btrfs_root *data_reloc_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) /* the log root tree is a directory of all the other log roots */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) struct btrfs_root *log_root_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) spinlock_t fs_roots_radix_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) struct radix_tree_root fs_roots_radix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) /* block group cache stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) spinlock_t block_group_cache_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) u64 first_logical_byte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) struct rb_root block_group_cache_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) /* keep track of unallocated space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) atomic64_t free_chunk_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) /* Track ranges which are used by log trees blocks/logged data extents */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) struct extent_io_tree excluded_extents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) /* logical->physical extent mapping */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) struct extent_map_tree mapping_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) * block reservation for extent, checksum, root tree and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) * delayed dir index item
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) struct btrfs_block_rsv global_block_rsv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) /* block reservation for metadata operations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) struct btrfs_block_rsv trans_block_rsv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) /* block reservation for chunk tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) struct btrfs_block_rsv chunk_block_rsv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) /* block reservation for delayed operations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) struct btrfs_block_rsv delayed_block_rsv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) /* block reservation for delayed refs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) struct btrfs_block_rsv delayed_refs_rsv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) struct btrfs_block_rsv empty_block_rsv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) u64 generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) u64 last_trans_committed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) u64 avg_delayed_ref_runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) * this is updated to the current trans every time a full commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) * is required instead of the faster short fsync log commits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) u64 last_trans_log_full_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) unsigned long mount_opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) * Track requests for actions that need to be done during transaction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) * commit (like for some mount options).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) unsigned long pending_changes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) unsigned long compress_type:4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) unsigned int compress_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) u32 commit_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) * It is a suggestive number, the read side is safe even it gets a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) * wrong number because we will write out the data into a regular
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) * extent. The write side(mount/remount) is under ->s_umount lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) * so it is also safe.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) u64 max_inline;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) struct btrfs_transaction *running_transaction;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) wait_queue_head_t transaction_throttle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) wait_queue_head_t transaction_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) wait_queue_head_t transaction_blocked_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) wait_queue_head_t async_submit_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) * Used to protect the incompat_flags, compat_flags, compat_ro_flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) * when they are updated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) * Because we do not clear the flags for ever, so we needn't use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) * the lock on the read side.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) * We also needn't use the lock when we mount the fs, because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) * there is no other task which will update the flag.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) spinlock_t super_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) struct btrfs_super_block *super_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) struct btrfs_super_block *super_for_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) struct super_block *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct inode *btree_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) struct mutex tree_log_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) struct mutex transaction_kthread_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) struct mutex cleaner_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) struct mutex chunk_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) * this is taken to make sure we don't set block groups ro after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) * the free space cache has been allocated on them
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) struct mutex ro_block_group_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) /* this is used during read/modify/write to make sure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) * no two ios are trying to mod the same stripe at the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) * time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) struct btrfs_stripe_hash_table *stripe_hash_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) * this protects the ordered operations list only while we are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) * processing all of the entries on it. This way we make
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) * sure the commit code doesn't find the list temporarily empty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) * because another function happens to be doing non-waiting preflush
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) * before jumping into the main commit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) struct mutex ordered_operations_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) struct rw_semaphore commit_root_sem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) struct rw_semaphore cleanup_work_sem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) struct rw_semaphore subvol_sem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) spinlock_t trans_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) * the reloc mutex goes with the trans lock, it is taken
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) * during commit to protect us from the relocation code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) struct mutex reloc_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) struct list_head trans_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) struct list_head dead_roots;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) struct list_head caching_block_groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) spinlock_t delayed_iput_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) struct list_head delayed_iputs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) atomic_t nr_delayed_iputs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) wait_queue_head_t delayed_iputs_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) atomic64_t tree_mod_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) /* this protects tree_mod_log and tree_mod_seq_list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) rwlock_t tree_mod_log_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) struct rb_root tree_mod_log;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) struct list_head tree_mod_seq_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) atomic_t async_delalloc_pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) * this is used to protect the following list -- ordered_roots.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) spinlock_t ordered_root_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) * all fs/file tree roots in which there are data=ordered extents
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) * pending writeback are added into this list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) * these can span multiple transactions and basically include
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) * every dirty data page that isn't from nodatacow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) struct list_head ordered_roots;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) struct mutex delalloc_root_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) spinlock_t delalloc_root_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) /* all fs/file tree roots that have delalloc inodes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) struct list_head delalloc_roots;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) * there is a pool of worker threads for checksumming during writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) * and a pool for checksumming after reads. This is because readers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) * can run with FS locks held, and the writers may be waiting for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) * those locks. We don't want ordering in the pending list to cause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) * deadlocks, and so the two are serviced separately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) * A third pool does submit_bio to avoid deadlocking with the other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) * two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) struct btrfs_workqueue *workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) struct btrfs_workqueue *delalloc_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) struct btrfs_workqueue *flush_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) struct btrfs_workqueue *endio_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) struct btrfs_workqueue *endio_meta_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) struct btrfs_workqueue *endio_raid56_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) struct btrfs_workqueue *rmw_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) struct btrfs_workqueue *endio_meta_write_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) struct btrfs_workqueue *endio_write_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) struct btrfs_workqueue *endio_freespace_worker;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) struct btrfs_workqueue *caching_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) struct btrfs_workqueue *readahead_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) * fixup workers take dirty pages that didn't properly go through
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) * the cow mechanism and make them safe to write. It happens
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) * for the sys_munmap function call path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) struct btrfs_workqueue *fixup_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) struct btrfs_workqueue *delayed_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) struct task_struct *transaction_kthread;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) struct task_struct *cleaner_kthread;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) u32 thread_pool_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) struct kobject *space_info_kobj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) struct kobject *qgroups_kobj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) u64 total_pinned;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) /* used to keep from writing metadata until there is a nice batch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) struct percpu_counter dirty_metadata_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) struct percpu_counter delalloc_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) struct percpu_counter dio_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) s32 dirty_metadata_batch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) s32 delalloc_batch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) struct list_head dirty_cowonly_roots;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) struct btrfs_fs_devices *fs_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) * The space_info list is effectively read only after initial
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) * setup. It is populated at mount time and cleaned up after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) * all block groups are removed. RCU is used to protect it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) struct list_head space_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) struct btrfs_space_info *data_sinfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) struct reloc_control *reloc_ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) /* data_alloc_cluster is only used in ssd_spread mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) struct btrfs_free_cluster data_alloc_cluster;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) /* all metadata allocations go through this cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) struct btrfs_free_cluster meta_alloc_cluster;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) /* auto defrag inodes go here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) spinlock_t defrag_inodes_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) struct rb_root defrag_inodes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) atomic_t defrag_running;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) /* Used to protect avail_{data, metadata, system}_alloc_bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) seqlock_t profiles_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) * these three are in extended format (availability of single
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) * chunks is denoted by BTRFS_AVAIL_ALLOC_BIT_SINGLE bit, other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) * types are denoted by corresponding BTRFS_BLOCK_GROUP_* bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) u64 avail_data_alloc_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) u64 avail_metadata_alloc_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) u64 avail_system_alloc_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) /* restriper state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) spinlock_t balance_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) struct mutex balance_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) atomic_t balance_pause_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) atomic_t balance_cancel_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) struct btrfs_balance_control *balance_ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) wait_queue_head_t balance_wait_q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) u32 data_chunk_allocations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) u32 metadata_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) void *bdev_holder;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) /* private scrub information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) struct mutex scrub_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) atomic_t scrubs_running;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) atomic_t scrub_pause_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) atomic_t scrubs_paused;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) atomic_t scrub_cancel_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) wait_queue_head_t scrub_pause_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) * The worker pointers are NULL iff the refcount is 0, ie. scrub is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) * running.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) refcount_t scrub_workers_refcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) struct btrfs_workqueue *scrub_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) struct btrfs_workqueue *scrub_wr_completion_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) struct btrfs_workqueue *scrub_parity_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) struct btrfs_discard_ctl discard_ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) u32 check_integrity_print_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) /* is qgroup tracking in a consistent state? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) u64 qgroup_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) /* holds configuration and tracking. Protected by qgroup_lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) struct rb_root qgroup_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) spinlock_t qgroup_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) * used to avoid frequently calling ulist_alloc()/ulist_free()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) * when doing qgroup accounting, it must be protected by qgroup_lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) struct ulist *qgroup_ulist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) * Protect user change for quota operations. If a transaction is needed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) * it must be started before locking this lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) struct mutex qgroup_ioctl_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) /* list of dirty qgroups to be written at next commit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) struct list_head dirty_qgroups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) /* used by qgroup for an efficient tree traversal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) u64 qgroup_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) /* qgroup rescan items */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) struct mutex qgroup_rescan_lock; /* protects the progress item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) struct btrfs_key qgroup_rescan_progress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) struct btrfs_workqueue *qgroup_rescan_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) struct completion qgroup_rescan_completion;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) struct btrfs_work qgroup_rescan_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) bool qgroup_rescan_running; /* protected by qgroup_rescan_lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) /* filesystem state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) unsigned long fs_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) struct btrfs_delayed_root *delayed_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) /* readahead tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) spinlock_t reada_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) struct radix_tree_root reada_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) /* readahead works cnt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) atomic_t reada_works_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) /* Extent buffer radix tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) spinlock_t buffer_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) struct radix_tree_root buffer_radix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) /* next backup root to be overwritten */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) int backup_root_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) /* device replace state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) struct btrfs_dev_replace dev_replace;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) struct semaphore uuid_tree_rescan_sem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) /* Used to reclaim the metadata space in the background. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) struct work_struct async_reclaim_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) struct work_struct async_data_reclaim_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) spinlock_t unused_bgs_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) struct list_head unused_bgs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) struct mutex unused_bg_unpin_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) struct mutex delete_unused_bgs_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) /* Cached block sizes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) u32 nodesize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) u32 sectorsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) u32 stripesize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) /* Block groups and devices containing active swapfiles. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) spinlock_t swapfile_pins_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) struct rb_root swapfile_pins;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) struct crypto_shash *csum_shash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) * Number of send operations in progress.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) * Updated while holding fs_info::balance_mutex.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) int send_in_progress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) /* Type of exclusive operation running */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) unsigned long exclusive_operation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) #ifdef CONFIG_BTRFS_FS_REF_VERIFY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) spinlock_t ref_verify_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) struct rb_root block_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) #ifdef CONFIG_BTRFS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) struct kobject *debug_kobj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) struct kobject *discard_debug_kobj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) struct list_head allocated_roots;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) spinlock_t eb_leak_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) struct list_head allocated_ebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) static inline struct btrfs_fs_info *btrfs_sb(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) return sb->s_fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) * The state of btrfs root
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) * btrfs_record_root_in_trans is a multi-step process, and it can race
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) * with the balancing code. But the race is very small, and only the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) * first time the root is added to each transaction. So IN_TRANS_SETUP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) * is used to tell us when more checks are required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) BTRFS_ROOT_IN_TRANS_SETUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) * Set if tree blocks of this root can be shared by other roots.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) * Only subvolume trees and their reloc trees have this bit set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) * Conflicts with TRACK_DIRTY bit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) * This affects two things:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) * - How balance works
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) * For shareable roots, we need to use reloc tree and do path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) * replacement for balance, and need various pre/post hooks for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) * snapshot creation to handle them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) * While for non-shareable trees, we just simply do a tree search
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) * with COW.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) * - How dirty roots are tracked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) * For shareable roots, btrfs_record_root_in_trans() is needed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) * track them, while non-subvolume roots have TRACK_DIRTY bit, they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) * don't need to set this manually.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) BTRFS_ROOT_SHAREABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) BTRFS_ROOT_TRACK_DIRTY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) BTRFS_ROOT_IN_RADIX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) BTRFS_ROOT_ORPHAN_ITEM_INSERTED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) BTRFS_ROOT_DEFRAG_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) BTRFS_ROOT_FORCE_COW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) BTRFS_ROOT_MULTI_LOG_TASKS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) BTRFS_ROOT_DIRTY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) BTRFS_ROOT_DELETING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) * Reloc tree is orphan, only kept here for qgroup delayed subtree scan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) * Set for the subvolume tree owning the reloc tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) BTRFS_ROOT_DEAD_RELOC_TREE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) /* Mark dead root stored on device whose cleanup needs to be resumed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) BTRFS_ROOT_DEAD_TREE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) /* The root has a log tree. Used only for subvolume roots. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) BTRFS_ROOT_HAS_LOG_TREE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) /* Qgroup flushing is in progress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) BTRFS_ROOT_QGROUP_FLUSHING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) * Record swapped tree blocks of a subvolume tree for delayed subtree trace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) * code. For detail check comment in fs/btrfs/qgroup.c.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) struct btrfs_qgroup_swapped_blocks {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) /* RM_EMPTY_ROOT() of above blocks[] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) bool swapped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) struct rb_root blocks[BTRFS_MAX_LEVEL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) * in ram representation of the tree. extent_root is used for all allocations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) * and for the extent tree extent_root root.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) struct btrfs_root {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) struct extent_buffer *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) struct extent_buffer *commit_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) struct btrfs_root *log_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) struct btrfs_root *reloc_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) unsigned long state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) struct btrfs_root_item root_item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) struct btrfs_key root_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) struct btrfs_fs_info *fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) struct extent_io_tree dirty_log_pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) struct mutex objectid_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) spinlock_t accounting_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) struct btrfs_block_rsv *block_rsv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) /* free ino cache stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) struct btrfs_free_space_ctl *free_ino_ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) enum btrfs_caching_type ino_cache_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) spinlock_t ino_cache_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) wait_queue_head_t ino_cache_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) struct btrfs_free_space_ctl *free_ino_pinned;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) u64 ino_cache_progress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) struct inode *ino_cache_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) struct mutex log_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) wait_queue_head_t log_writer_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) wait_queue_head_t log_commit_wait[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) struct list_head log_ctxs[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) /* Used only for log trees of subvolumes, not for the log root tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) atomic_t log_writers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) atomic_t log_commit[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) /* Used only for log trees of subvolumes, not for the log root tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) atomic_t log_batch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) int log_transid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) /* No matter the commit succeeds or not*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) int log_transid_committed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) /* Just be updated when the commit succeeds. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) int last_log_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) pid_t log_start_pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) u64 last_trans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) u32 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) u64 highest_objectid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) struct btrfs_key defrag_progress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) struct btrfs_key defrag_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) /* The dirty list is only used by non-shareable roots */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) struct list_head dirty_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) struct list_head root_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) spinlock_t log_extents_lock[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) struct list_head logged_list[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) int orphan_cleanup_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) spinlock_t inode_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) /* red-black tree that keeps track of in-memory inodes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) struct rb_root inode_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) * radix tree that keeps track of delayed nodes of every inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) * protected by inode_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) struct radix_tree_root delayed_nodes_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) * right now this just gets used so that a root has its own devid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) * for stat. It may be used for more later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) dev_t anon_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) spinlock_t root_item_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) refcount_t refs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) struct mutex delalloc_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) spinlock_t delalloc_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) * all of the inodes that have delalloc bytes. It is possible for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) * this list to be empty even when there is still dirty data=ordered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) * extents waiting to finish IO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) struct list_head delalloc_inodes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) struct list_head delalloc_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) u64 nr_delalloc_inodes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) struct mutex ordered_extent_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) * this is used by the balancing code to wait for all the pending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) * ordered extents
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) spinlock_t ordered_extent_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) * all of the data=ordered extents pending writeback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) * these can span multiple transactions and basically include
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) * every dirty data page that isn't from nodatacow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) struct list_head ordered_extents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) struct list_head ordered_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) u64 nr_ordered_extents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) * Not empty if this subvolume root has gone through tree block swap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) * (relocation)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) * Will be used by reloc_control::dirty_subvol_roots.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) struct list_head reloc_dirty_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) * Number of currently running SEND ioctls to prevent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) * manipulation with the read-only status via SUBVOL_SETFLAGS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) int send_in_progress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) * Number of currently running deduplication operations that have a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) * destination inode belonging to this root. Protected by the lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) * root_item_lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) int dedupe_in_progress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) /* For exclusion of snapshot creation and nocow writes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) struct btrfs_drew_lock snapshot_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) atomic_t snapshot_force_cow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) /* For qgroup metadata reserved space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) spinlock_t qgroup_meta_rsv_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) u64 qgroup_meta_rsv_pertrans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) u64 qgroup_meta_rsv_prealloc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) wait_queue_head_t qgroup_flush_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) /* Number of active swapfiles */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) atomic_t nr_swapfiles;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) /* Record pairs of swapped blocks for qgroup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) struct btrfs_qgroup_swapped_blocks swapped_blocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) /* Used only by log trees, when logging csum items */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) struct extent_io_tree log_csum_range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) u64 alloc_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) #ifdef CONFIG_BTRFS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) struct list_head leak_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) * Structure that conveys information about an extent that is going to replace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) * all the extents in a file range.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) struct btrfs_replace_extent_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) u64 disk_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) u64 disk_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) u64 data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) u64 data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) u64 file_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) /* Pointer to a file extent item of type regular or prealloc. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) char *extent_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) * Set to true when attempting to replace a file range with a new extent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) * described by this structure, set to false when attempting to clone an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) * existing extent into a file range.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) bool is_new_extent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) /* Meaningful only if is_new_extent is true. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) int qgroup_reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) * Meaningful only if is_new_extent is true.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) * Used to track how many extent items we have already inserted in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) * subvolume tree that refer to the extent described by this structure,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) * so that we know when to create a new delayed ref or update an existing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) * one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) int insertions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) struct btrfs_file_private {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) void *filldir_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) static inline u32 BTRFS_LEAF_DATA_SIZE(const struct btrfs_fs_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) return info->nodesize - sizeof(struct btrfs_header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) #define BTRFS_LEAF_DATA_OFFSET offsetof(struct btrfs_leaf, items)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) static inline u32 BTRFS_MAX_ITEM_SIZE(const struct btrfs_fs_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) return BTRFS_LEAF_DATA_SIZE(info) - sizeof(struct btrfs_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) static inline u32 BTRFS_NODEPTRS_PER_BLOCK(const struct btrfs_fs_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) return BTRFS_LEAF_DATA_SIZE(info) / sizeof(struct btrfs_key_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) #define BTRFS_FILE_EXTENT_INLINE_DATA_START \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) (offsetof(struct btrfs_file_extent_item, disk_bytenr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) static inline u32 BTRFS_MAX_INLINE_DATA_SIZE(const struct btrfs_fs_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) return BTRFS_MAX_ITEM_SIZE(info) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) BTRFS_FILE_EXTENT_INLINE_DATA_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) static inline u32 BTRFS_MAX_XATTR_SIZE(const struct btrfs_fs_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) return BTRFS_MAX_ITEM_SIZE(info) - sizeof(struct btrfs_dir_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) * Flags for mount options.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) * Note: don't forget to add new options to btrfs_show_options()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) #define BTRFS_MOUNT_NODATASUM (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) #define BTRFS_MOUNT_NODATACOW (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) #define BTRFS_MOUNT_NOBARRIER (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) #define BTRFS_MOUNT_SSD (1 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) #define BTRFS_MOUNT_DEGRADED (1 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) #define BTRFS_MOUNT_COMPRESS (1 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) #define BTRFS_MOUNT_NOTREELOG (1 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) #define BTRFS_MOUNT_FLUSHONCOMMIT (1 << 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) #define BTRFS_MOUNT_SSD_SPREAD (1 << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) #define BTRFS_MOUNT_NOSSD (1 << 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) #define BTRFS_MOUNT_DISCARD_SYNC (1 << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) #define BTRFS_MOUNT_FORCE_COMPRESS (1 << 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) #define BTRFS_MOUNT_SPACE_CACHE (1 << 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) #define BTRFS_MOUNT_CLEAR_CACHE (1 << 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) #define BTRFS_MOUNT_USER_SUBVOL_RM_ALLOWED (1 << 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) #define BTRFS_MOUNT_ENOSPC_DEBUG (1 << 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) #define BTRFS_MOUNT_AUTO_DEFRAG (1 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) #define BTRFS_MOUNT_INODE_MAP_CACHE (1 << 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) #define BTRFS_MOUNT_USEBACKUPROOT (1 << 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) #define BTRFS_MOUNT_SKIP_BALANCE (1 << 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) #define BTRFS_MOUNT_CHECK_INTEGRITY (1 << 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) #define BTRFS_MOUNT_CHECK_INTEGRITY_INCLUDING_EXTENT_DATA (1 << 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) #define BTRFS_MOUNT_PANIC_ON_FATAL_ERROR (1 << 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) #define BTRFS_MOUNT_RESCAN_UUID_TREE (1 << 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) #define BTRFS_MOUNT_FRAGMENT_DATA (1 << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) #define BTRFS_MOUNT_FRAGMENT_METADATA (1 << 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) #define BTRFS_MOUNT_FREE_SPACE_TREE (1 << 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) #define BTRFS_MOUNT_NOLOGREPLAY (1 << 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) #define BTRFS_MOUNT_REF_VERIFY (1 << 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) #define BTRFS_MOUNT_DISCARD_ASYNC (1 << 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) #define BTRFS_DEFAULT_COMMIT_INTERVAL (30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) #define BTRFS_DEFAULT_MAX_INLINE (2048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) #define btrfs_raw_test_opt(o, opt) ((o) & BTRFS_MOUNT_##opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) #define btrfs_test_opt(fs_info, opt) ((fs_info)->mount_opt & \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) BTRFS_MOUNT_##opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) #define btrfs_set_and_info(fs_info, opt, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) if (!btrfs_test_opt(fs_info, opt)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) btrfs_info(fs_info, fmt, ##args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) btrfs_set_opt(fs_info->mount_opt, opt); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) #define btrfs_clear_and_info(fs_info, opt, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) if (btrfs_test_opt(fs_info, opt)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) btrfs_info(fs_info, fmt, ##args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) btrfs_clear_opt(fs_info->mount_opt, opt); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) * Requests for changes that need to be done during transaction commit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) * Internal mount options that are used for special handling of the real
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) * mount options (eg. cannot be set during remount and have to be set during
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) * transaction commit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) #define BTRFS_PENDING_SET_INODE_MAP_CACHE (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) #define BTRFS_PENDING_CLEAR_INODE_MAP_CACHE (1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) #define BTRFS_PENDING_COMMIT (2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) #define btrfs_test_pending(info, opt) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) test_bit(BTRFS_PENDING_##opt, &(info)->pending_changes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) #define btrfs_set_pending(info, opt) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) set_bit(BTRFS_PENDING_##opt, &(info)->pending_changes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) #define btrfs_clear_pending(info, opt) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) clear_bit(BTRFS_PENDING_##opt, &(info)->pending_changes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) * Helpers for setting pending mount option changes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) * Expects corresponding macros
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) * BTRFS_PENDING_SET_ and CLEAR_ + short mount option name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) #define btrfs_set_pending_and_info(info, opt, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) if (!btrfs_raw_test_opt((info)->mount_opt, opt)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) btrfs_info((info), fmt, ##args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) btrfs_set_pending((info), SET_##opt); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) btrfs_clear_pending((info), CLEAR_##opt); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) #define btrfs_clear_pending_and_info(info, opt, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) if (btrfs_raw_test_opt((info)->mount_opt, opt)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) btrfs_info((info), fmt, ##args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) btrfs_set_pending((info), CLEAR_##opt); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) btrfs_clear_pending((info), SET_##opt); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) * Inode flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) #define BTRFS_INODE_NODATASUM (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) #define BTRFS_INODE_NODATACOW (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) #define BTRFS_INODE_READONLY (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) #define BTRFS_INODE_NOCOMPRESS (1 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) #define BTRFS_INODE_PREALLOC (1 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) #define BTRFS_INODE_SYNC (1 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) #define BTRFS_INODE_IMMUTABLE (1 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) #define BTRFS_INODE_APPEND (1 << 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) #define BTRFS_INODE_NODUMP (1 << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) #define BTRFS_INODE_NOATIME (1 << 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) #define BTRFS_INODE_DIRSYNC (1 << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) #define BTRFS_INODE_COMPRESS (1 << 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) #define BTRFS_INODE_ROOT_ITEM_INIT (1 << 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) #define BTRFS_INODE_FLAG_MASK \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) (BTRFS_INODE_NODATASUM | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) BTRFS_INODE_NODATACOW | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) BTRFS_INODE_READONLY | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) BTRFS_INODE_NOCOMPRESS | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) BTRFS_INODE_PREALLOC | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) BTRFS_INODE_SYNC | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) BTRFS_INODE_IMMUTABLE | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) BTRFS_INODE_APPEND | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) BTRFS_INODE_NODUMP | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) BTRFS_INODE_NOATIME | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) BTRFS_INODE_DIRSYNC | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) BTRFS_INODE_COMPRESS | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) BTRFS_INODE_ROOT_ITEM_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) struct btrfs_map_token {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) struct extent_buffer *eb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) char *kaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) unsigned long offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) #define BTRFS_BYTES_TO_BLKS(fs_info, bytes) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) ((bytes) >> (fs_info)->sb->s_blocksize_bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) static inline void btrfs_init_map_token(struct btrfs_map_token *token,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) struct extent_buffer *eb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) token->eb = eb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) token->kaddr = page_address(eb->pages[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) token->offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) /* some macros to generate set/get functions for the struct fields. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) * assumes there is a lefoo_to_cpu for every type, so lets make a simple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) * one for u8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) #define le8_to_cpu(v) (v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) #define cpu_to_le8(v) (v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) #define __le8 u8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) static inline u8 get_unaligned_le8(const void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) return *(u8 *)p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) static inline void put_unaligned_le8(u8 val, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) *(u8 *)p = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) #define read_eb_member(eb, ptr, type, member, result) (\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) read_extent_buffer(eb, (char *)(result), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) ((unsigned long)(ptr)) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) offsetof(type, member), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) sizeof(((type *)0)->member)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) #define write_eb_member(eb, ptr, type, member, result) (\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) write_extent_buffer(eb, (char *)(result), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) ((unsigned long)(ptr)) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) offsetof(type, member), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) sizeof(((type *)0)->member)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) #define DECLARE_BTRFS_SETGET_BITS(bits) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) u##bits btrfs_get_token_##bits(struct btrfs_map_token *token, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) const void *ptr, unsigned long off); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) void btrfs_set_token_##bits(struct btrfs_map_token *token, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) const void *ptr, unsigned long off, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) u##bits val); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) u##bits btrfs_get_##bits(const struct extent_buffer *eb, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) const void *ptr, unsigned long off); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) unsigned long off, u##bits val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) DECLARE_BTRFS_SETGET_BITS(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) DECLARE_BTRFS_SETGET_BITS(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) DECLARE_BTRFS_SETGET_BITS(32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) DECLARE_BTRFS_SETGET_BITS(64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) #define BTRFS_SETGET_FUNCS(name, type, member, bits) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) static inline u##bits btrfs_##name(const struct extent_buffer *eb, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) const type *s) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) BUILD_BUG_ON(sizeof(u##bits) != sizeof(((type *)0))->member); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) return btrfs_get_##bits(eb, s, offsetof(type, member)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) static inline void btrfs_set_##name(const struct extent_buffer *eb, type *s, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) u##bits val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) BUILD_BUG_ON(sizeof(u##bits) != sizeof(((type *)0))->member); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) btrfs_set_##bits(eb, s, offsetof(type, member), val); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) static inline u##bits btrfs_token_##name(struct btrfs_map_token *token, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) const type *s) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) BUILD_BUG_ON(sizeof(u##bits) != sizeof(((type *)0))->member); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) return btrfs_get_token_##bits(token, s, offsetof(type, member));\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) static inline void btrfs_set_token_##name(struct btrfs_map_token *token,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) type *s, u##bits val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) BUILD_BUG_ON(sizeof(u##bits) != sizeof(((type *)0))->member); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) btrfs_set_token_##bits(token, s, offsetof(type, member), val); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) #define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) static inline u##bits btrfs_##name(const struct extent_buffer *eb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) const type *p = page_address(eb->pages[0]); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) return get_unaligned_le##bits(&p->member); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) static inline void btrfs_set_##name(const struct extent_buffer *eb, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) u##bits val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) type *p = page_address(eb->pages[0]); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) put_unaligned_le##bits(val, &p->member); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) #define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) static inline u##bits btrfs_##name(const type *s) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) return get_unaligned_le##bits(&s->member); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) static inline void btrfs_set_##name(type *s, u##bits val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) put_unaligned_le##bits(val, &s->member); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) static inline u64 btrfs_device_total_bytes(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) struct btrfs_dev_item *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) BUILD_BUG_ON(sizeof(u64) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) sizeof(((struct btrfs_dev_item *)0))->total_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) return btrfs_get_64(eb, s, offsetof(struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) total_bytes));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) static inline void btrfs_set_device_total_bytes(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) struct btrfs_dev_item *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) BUILD_BUG_ON(sizeof(u64) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) sizeof(((struct btrfs_dev_item *)0))->total_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) WARN_ON(!IS_ALIGNED(val, eb->fs_info->sectorsize));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) btrfs_set_64(eb, s, offsetof(struct btrfs_dev_item, total_bytes), val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) BTRFS_SETGET_FUNCS(device_type, struct btrfs_dev_item, type, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) BTRFS_SETGET_FUNCS(device_bytes_used, struct btrfs_dev_item, bytes_used, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) BTRFS_SETGET_FUNCS(device_io_align, struct btrfs_dev_item, io_align, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) BTRFS_SETGET_FUNCS(device_io_width, struct btrfs_dev_item, io_width, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) BTRFS_SETGET_FUNCS(device_start_offset, struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) start_offset, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) BTRFS_SETGET_FUNCS(device_sector_size, struct btrfs_dev_item, sector_size, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) BTRFS_SETGET_FUNCS(device_id, struct btrfs_dev_item, devid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) BTRFS_SETGET_FUNCS(device_group, struct btrfs_dev_item, dev_group, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) BTRFS_SETGET_FUNCS(device_seek_speed, struct btrfs_dev_item, seek_speed, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) BTRFS_SETGET_FUNCS(device_bandwidth, struct btrfs_dev_item, bandwidth, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) BTRFS_SETGET_FUNCS(device_generation, struct btrfs_dev_item, generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) BTRFS_SETGET_STACK_FUNCS(stack_device_type, struct btrfs_dev_item, type, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) BTRFS_SETGET_STACK_FUNCS(stack_device_total_bytes, struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) total_bytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) BTRFS_SETGET_STACK_FUNCS(stack_device_bytes_used, struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) bytes_used, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) BTRFS_SETGET_STACK_FUNCS(stack_device_io_align, struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) io_align, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) BTRFS_SETGET_STACK_FUNCS(stack_device_io_width, struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) io_width, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) BTRFS_SETGET_STACK_FUNCS(stack_device_sector_size, struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) sector_size, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) BTRFS_SETGET_STACK_FUNCS(stack_device_id, struct btrfs_dev_item, devid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) BTRFS_SETGET_STACK_FUNCS(stack_device_group, struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) dev_group, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) BTRFS_SETGET_STACK_FUNCS(stack_device_seek_speed, struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) seek_speed, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) BTRFS_SETGET_STACK_FUNCS(stack_device_bandwidth, struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) bandwidth, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) BTRFS_SETGET_STACK_FUNCS(stack_device_generation, struct btrfs_dev_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) static inline unsigned long btrfs_device_uuid(struct btrfs_dev_item *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) return (unsigned long)d + offsetof(struct btrfs_dev_item, uuid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) static inline unsigned long btrfs_device_fsid(struct btrfs_dev_item *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) return (unsigned long)d + offsetof(struct btrfs_dev_item, fsid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) BTRFS_SETGET_FUNCS(chunk_length, struct btrfs_chunk, length, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) BTRFS_SETGET_FUNCS(chunk_owner, struct btrfs_chunk, owner, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) BTRFS_SETGET_FUNCS(chunk_stripe_len, struct btrfs_chunk, stripe_len, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) BTRFS_SETGET_FUNCS(chunk_io_align, struct btrfs_chunk, io_align, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) BTRFS_SETGET_FUNCS(chunk_io_width, struct btrfs_chunk, io_width, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) BTRFS_SETGET_FUNCS(chunk_sector_size, struct btrfs_chunk, sector_size, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) BTRFS_SETGET_FUNCS(chunk_type, struct btrfs_chunk, type, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) BTRFS_SETGET_FUNCS(chunk_num_stripes, struct btrfs_chunk, num_stripes, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) BTRFS_SETGET_FUNCS(chunk_sub_stripes, struct btrfs_chunk, sub_stripes, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) BTRFS_SETGET_FUNCS(stripe_devid, struct btrfs_stripe, devid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) BTRFS_SETGET_FUNCS(stripe_offset, struct btrfs_stripe, offset, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) static inline char *btrfs_stripe_dev_uuid(struct btrfs_stripe *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) return (char *)s + offsetof(struct btrfs_stripe, dev_uuid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) BTRFS_SETGET_STACK_FUNCS(stack_chunk_length, struct btrfs_chunk, length, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) BTRFS_SETGET_STACK_FUNCS(stack_chunk_owner, struct btrfs_chunk, owner, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) BTRFS_SETGET_STACK_FUNCS(stack_chunk_stripe_len, struct btrfs_chunk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) stripe_len, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_align, struct btrfs_chunk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) io_align, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_width, struct btrfs_chunk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) io_width, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) BTRFS_SETGET_STACK_FUNCS(stack_chunk_sector_size, struct btrfs_chunk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) sector_size, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) BTRFS_SETGET_STACK_FUNCS(stack_chunk_type, struct btrfs_chunk, type, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) BTRFS_SETGET_STACK_FUNCS(stack_chunk_num_stripes, struct btrfs_chunk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) num_stripes, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) BTRFS_SETGET_STACK_FUNCS(stack_chunk_sub_stripes, struct btrfs_chunk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) sub_stripes, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) BTRFS_SETGET_STACK_FUNCS(stack_stripe_devid, struct btrfs_stripe, devid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) BTRFS_SETGET_STACK_FUNCS(stack_stripe_offset, struct btrfs_stripe, offset, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) static inline struct btrfs_stripe *btrfs_stripe_nr(struct btrfs_chunk *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) unsigned long offset = (unsigned long)c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) offset += offsetof(struct btrfs_chunk, stripe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) offset += nr * sizeof(struct btrfs_stripe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) return (struct btrfs_stripe *)offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) static inline char *btrfs_stripe_dev_uuid_nr(struct btrfs_chunk *c, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) return btrfs_stripe_dev_uuid(btrfs_stripe_nr(c, nr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) static inline u64 btrfs_stripe_offset_nr(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) struct btrfs_chunk *c, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) return btrfs_stripe_offset(eb, btrfs_stripe_nr(c, nr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) static inline u64 btrfs_stripe_devid_nr(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) struct btrfs_chunk *c, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) return btrfs_stripe_devid(eb, btrfs_stripe_nr(c, nr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) /* struct btrfs_block_group_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) BTRFS_SETGET_STACK_FUNCS(stack_block_group_used, struct btrfs_block_group_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) used, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) BTRFS_SETGET_FUNCS(block_group_used, struct btrfs_block_group_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) used, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) BTRFS_SETGET_STACK_FUNCS(stack_block_group_chunk_objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) struct btrfs_block_group_item, chunk_objectid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) BTRFS_SETGET_FUNCS(block_group_chunk_objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) struct btrfs_block_group_item, chunk_objectid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) BTRFS_SETGET_FUNCS(block_group_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) struct btrfs_block_group_item, flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) BTRFS_SETGET_STACK_FUNCS(stack_block_group_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) struct btrfs_block_group_item, flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) /* struct btrfs_free_space_info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) BTRFS_SETGET_FUNCS(free_space_extent_count, struct btrfs_free_space_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) extent_count, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) BTRFS_SETGET_FUNCS(free_space_flags, struct btrfs_free_space_info, flags, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) /* struct btrfs_inode_ref */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) BTRFS_SETGET_FUNCS(inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) BTRFS_SETGET_FUNCS(inode_ref_index, struct btrfs_inode_ref, index, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) /* struct btrfs_inode_extref */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) BTRFS_SETGET_FUNCS(inode_extref_parent, struct btrfs_inode_extref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) parent_objectid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) BTRFS_SETGET_FUNCS(inode_extref_name_len, struct btrfs_inode_extref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) name_len, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) BTRFS_SETGET_FUNCS(inode_extref_index, struct btrfs_inode_extref, index, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) /* struct btrfs_inode_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) BTRFS_SETGET_FUNCS(inode_generation, struct btrfs_inode_item, generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) BTRFS_SETGET_FUNCS(inode_sequence, struct btrfs_inode_item, sequence, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) BTRFS_SETGET_FUNCS(inode_transid, struct btrfs_inode_item, transid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) BTRFS_SETGET_FUNCS(inode_size, struct btrfs_inode_item, size, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) BTRFS_SETGET_FUNCS(inode_nbytes, struct btrfs_inode_item, nbytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) BTRFS_SETGET_FUNCS(inode_block_group, struct btrfs_inode_item, block_group, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) BTRFS_SETGET_FUNCS(inode_nlink, struct btrfs_inode_item, nlink, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) BTRFS_SETGET_FUNCS(inode_uid, struct btrfs_inode_item, uid, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) BTRFS_SETGET_FUNCS(inode_gid, struct btrfs_inode_item, gid, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) BTRFS_SETGET_FUNCS(inode_mode, struct btrfs_inode_item, mode, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) BTRFS_SETGET_FUNCS(inode_rdev, struct btrfs_inode_item, rdev, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) BTRFS_SETGET_FUNCS(inode_flags, struct btrfs_inode_item, flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) BTRFS_SETGET_STACK_FUNCS(stack_inode_generation, struct btrfs_inode_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) BTRFS_SETGET_STACK_FUNCS(stack_inode_sequence, struct btrfs_inode_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) sequence, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) BTRFS_SETGET_STACK_FUNCS(stack_inode_transid, struct btrfs_inode_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) transid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) BTRFS_SETGET_STACK_FUNCS(stack_inode_size, struct btrfs_inode_item, size, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) BTRFS_SETGET_STACK_FUNCS(stack_inode_nbytes, struct btrfs_inode_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) nbytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) BTRFS_SETGET_STACK_FUNCS(stack_inode_block_group, struct btrfs_inode_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) block_group, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) BTRFS_SETGET_STACK_FUNCS(stack_inode_nlink, struct btrfs_inode_item, nlink, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) BTRFS_SETGET_STACK_FUNCS(stack_inode_uid, struct btrfs_inode_item, uid, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) BTRFS_SETGET_STACK_FUNCS(stack_inode_gid, struct btrfs_inode_item, gid, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) BTRFS_SETGET_STACK_FUNCS(stack_inode_mode, struct btrfs_inode_item, mode, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) BTRFS_SETGET_STACK_FUNCS(stack_inode_rdev, struct btrfs_inode_item, rdev, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) BTRFS_SETGET_STACK_FUNCS(stack_inode_flags, struct btrfs_inode_item, flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) BTRFS_SETGET_FUNCS(timespec_sec, struct btrfs_timespec, sec, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) BTRFS_SETGET_FUNCS(timespec_nsec, struct btrfs_timespec, nsec, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) BTRFS_SETGET_STACK_FUNCS(stack_timespec_sec, struct btrfs_timespec, sec, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) BTRFS_SETGET_STACK_FUNCS(stack_timespec_nsec, struct btrfs_timespec, nsec, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) /* struct btrfs_dev_extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) BTRFS_SETGET_FUNCS(dev_extent_chunk_tree, struct btrfs_dev_extent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) chunk_tree, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) BTRFS_SETGET_FUNCS(dev_extent_chunk_objectid, struct btrfs_dev_extent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) chunk_objectid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) BTRFS_SETGET_FUNCS(dev_extent_chunk_offset, struct btrfs_dev_extent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) chunk_offset, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) BTRFS_SETGET_FUNCS(dev_extent_length, struct btrfs_dev_extent, length, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) BTRFS_SETGET_FUNCS(extent_refs, struct btrfs_extent_item, refs, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) BTRFS_SETGET_FUNCS(extent_generation, struct btrfs_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) BTRFS_SETGET_FUNCS(extent_flags, struct btrfs_extent_item, flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) BTRFS_SETGET_FUNCS(tree_block_level, struct btrfs_tree_block_info, level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) static inline void btrfs_tree_block_key(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) struct btrfs_tree_block_info *item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) struct btrfs_disk_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) read_eb_member(eb, item, struct btrfs_tree_block_info, key, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) static inline void btrfs_set_tree_block_key(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) struct btrfs_tree_block_info *item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) struct btrfs_disk_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) write_eb_member(eb, item, struct btrfs_tree_block_info, key, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) BTRFS_SETGET_FUNCS(extent_data_ref_root, struct btrfs_extent_data_ref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) root, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) BTRFS_SETGET_FUNCS(extent_data_ref_objectid, struct btrfs_extent_data_ref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) objectid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) BTRFS_SETGET_FUNCS(extent_data_ref_offset, struct btrfs_extent_data_ref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) offset, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) BTRFS_SETGET_FUNCS(extent_data_ref_count, struct btrfs_extent_data_ref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) count, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) BTRFS_SETGET_FUNCS(shared_data_ref_count, struct btrfs_shared_data_ref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) count, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) BTRFS_SETGET_FUNCS(extent_inline_ref_type, struct btrfs_extent_inline_ref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) type, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) BTRFS_SETGET_FUNCS(extent_inline_ref_offset, struct btrfs_extent_inline_ref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) offset, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) static inline u32 btrfs_extent_inline_ref_size(int type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) if (type == BTRFS_TREE_BLOCK_REF_KEY ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) type == BTRFS_SHARED_BLOCK_REF_KEY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) return sizeof(struct btrfs_extent_inline_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) if (type == BTRFS_SHARED_DATA_REF_KEY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) return sizeof(struct btrfs_shared_data_ref) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) sizeof(struct btrfs_extent_inline_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) if (type == BTRFS_EXTENT_DATA_REF_KEY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) return sizeof(struct btrfs_extent_data_ref) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) offsetof(struct btrfs_extent_inline_ref, offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) /* struct btrfs_node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) BTRFS_SETGET_FUNCS(key_blockptr, struct btrfs_key_ptr, blockptr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) BTRFS_SETGET_FUNCS(key_generation, struct btrfs_key_ptr, generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) BTRFS_SETGET_STACK_FUNCS(stack_key_blockptr, struct btrfs_key_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) blockptr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) BTRFS_SETGET_STACK_FUNCS(stack_key_generation, struct btrfs_key_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) static inline u64 btrfs_node_blockptr(const struct extent_buffer *eb, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) unsigned long ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) ptr = offsetof(struct btrfs_node, ptrs) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) sizeof(struct btrfs_key_ptr) * nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) return btrfs_key_blockptr(eb, (struct btrfs_key_ptr *)ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) static inline void btrfs_set_node_blockptr(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) int nr, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) unsigned long ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) ptr = offsetof(struct btrfs_node, ptrs) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) sizeof(struct btrfs_key_ptr) * nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) btrfs_set_key_blockptr(eb, (struct btrfs_key_ptr *)ptr, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) static inline u64 btrfs_node_ptr_generation(const struct extent_buffer *eb, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) unsigned long ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) ptr = offsetof(struct btrfs_node, ptrs) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) sizeof(struct btrfs_key_ptr) * nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) return btrfs_key_generation(eb, (struct btrfs_key_ptr *)ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) static inline void btrfs_set_node_ptr_generation(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) int nr, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) unsigned long ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) ptr = offsetof(struct btrfs_node, ptrs) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) sizeof(struct btrfs_key_ptr) * nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) btrfs_set_key_generation(eb, (struct btrfs_key_ptr *)ptr, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) static inline unsigned long btrfs_node_key_ptr_offset(int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) return offsetof(struct btrfs_node, ptrs) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) sizeof(struct btrfs_key_ptr) * nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) void btrfs_node_key(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) struct btrfs_disk_key *disk_key, int nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) static inline void btrfs_set_node_key(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) struct btrfs_disk_key *disk_key, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) unsigned long ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) ptr = btrfs_node_key_ptr_offset(nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) write_eb_member(eb, (struct btrfs_key_ptr *)ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) struct btrfs_key_ptr, key, disk_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) /* struct btrfs_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) BTRFS_SETGET_FUNCS(item_offset, struct btrfs_item, offset, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) BTRFS_SETGET_FUNCS(item_size, struct btrfs_item, size, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) BTRFS_SETGET_STACK_FUNCS(stack_item_offset, struct btrfs_item, offset, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) BTRFS_SETGET_STACK_FUNCS(stack_item_size, struct btrfs_item, size, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) static inline unsigned long btrfs_item_nr_offset(int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) return offsetof(struct btrfs_leaf, items) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) sizeof(struct btrfs_item) * nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) static inline struct btrfs_item *btrfs_item_nr(int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) return (struct btrfs_item *)btrfs_item_nr_offset(nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) static inline u32 btrfs_item_end(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) struct btrfs_item *item)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) return btrfs_item_offset(eb, item) + btrfs_item_size(eb, item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) static inline u32 btrfs_item_end_nr(const struct extent_buffer *eb, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) return btrfs_item_end(eb, btrfs_item_nr(nr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) static inline u32 btrfs_item_offset_nr(const struct extent_buffer *eb, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) return btrfs_item_offset(eb, btrfs_item_nr(nr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) static inline u32 btrfs_item_size_nr(const struct extent_buffer *eb, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) return btrfs_item_size(eb, btrfs_item_nr(nr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) static inline void btrfs_item_key(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) struct btrfs_disk_key *disk_key, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) struct btrfs_item *item = btrfs_item_nr(nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) read_eb_member(eb, item, struct btrfs_item, key, disk_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) static inline void btrfs_set_item_key(struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) struct btrfs_disk_key *disk_key, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) struct btrfs_item *item = btrfs_item_nr(nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) write_eb_member(eb, item, struct btrfs_item, key, disk_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) BTRFS_SETGET_FUNCS(dir_log_end, struct btrfs_dir_log_item, end, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) * struct btrfs_root_ref
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) BTRFS_SETGET_FUNCS(root_ref_dirid, struct btrfs_root_ref, dirid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) BTRFS_SETGET_FUNCS(root_ref_sequence, struct btrfs_root_ref, sequence, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) BTRFS_SETGET_FUNCS(root_ref_name_len, struct btrfs_root_ref, name_len, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) /* struct btrfs_dir_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) BTRFS_SETGET_FUNCS(dir_data_len, struct btrfs_dir_item, data_len, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) BTRFS_SETGET_FUNCS(dir_type, struct btrfs_dir_item, type, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) BTRFS_SETGET_FUNCS(dir_name_len, struct btrfs_dir_item, name_len, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) BTRFS_SETGET_FUNCS(dir_transid, struct btrfs_dir_item, transid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) BTRFS_SETGET_STACK_FUNCS(stack_dir_type, struct btrfs_dir_item, type, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) BTRFS_SETGET_STACK_FUNCS(stack_dir_data_len, struct btrfs_dir_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) data_len, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) BTRFS_SETGET_STACK_FUNCS(stack_dir_name_len, struct btrfs_dir_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) name_len, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) BTRFS_SETGET_STACK_FUNCS(stack_dir_transid, struct btrfs_dir_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) transid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) static inline void btrfs_dir_item_key(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) const struct btrfs_dir_item *item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) struct btrfs_disk_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) read_eb_member(eb, item, struct btrfs_dir_item, location, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) static inline void btrfs_set_dir_item_key(struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) struct btrfs_dir_item *item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) const struct btrfs_disk_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) write_eb_member(eb, item, struct btrfs_dir_item, location, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) BTRFS_SETGET_FUNCS(free_space_entries, struct btrfs_free_space_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) num_entries, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) BTRFS_SETGET_FUNCS(free_space_bitmaps, struct btrfs_free_space_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) num_bitmaps, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) BTRFS_SETGET_FUNCS(free_space_generation, struct btrfs_free_space_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) static inline void btrfs_free_space_key(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) const struct btrfs_free_space_header *h,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) struct btrfs_disk_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) read_eb_member(eb, h, struct btrfs_free_space_header, location, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) static inline void btrfs_set_free_space_key(struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) struct btrfs_free_space_header *h,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) const struct btrfs_disk_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) write_eb_member(eb, h, struct btrfs_free_space_header, location, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) /* struct btrfs_disk_key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) BTRFS_SETGET_STACK_FUNCS(disk_key_objectid, struct btrfs_disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) objectid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) BTRFS_SETGET_STACK_FUNCS(disk_key_offset, struct btrfs_disk_key, offset, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) BTRFS_SETGET_STACK_FUNCS(disk_key_type, struct btrfs_disk_key, type, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) #ifdef __LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) * Optimized helpers for little-endian architectures where CPU and on-disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) * structures have the same endianness and we can skip conversions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) const struct btrfs_disk_key *disk_key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) memcpy(cpu_key, disk_key, sizeof(struct btrfs_key));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) const struct btrfs_key *cpu_key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) memcpy(disk_key, cpu_key, sizeof(struct btrfs_key));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) static inline void btrfs_node_key_to_cpu(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) struct btrfs_key *cpu_key, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) struct btrfs_disk_key *disk_key = (struct btrfs_disk_key *)cpu_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) btrfs_node_key(eb, disk_key, nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) static inline void btrfs_item_key_to_cpu(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) struct btrfs_key *cpu_key, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) struct btrfs_disk_key *disk_key = (struct btrfs_disk_key *)cpu_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) btrfs_item_key(eb, disk_key, nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) static inline void btrfs_dir_item_key_to_cpu(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) const struct btrfs_dir_item *item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) struct btrfs_key *cpu_key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) struct btrfs_disk_key *disk_key = (struct btrfs_disk_key *)cpu_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) btrfs_dir_item_key(eb, item, disk_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) const struct btrfs_disk_key *disk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) cpu->offset = le64_to_cpu(disk->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) cpu->type = disk->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) cpu->objectid = le64_to_cpu(disk->objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) const struct btrfs_key *cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) disk->offset = cpu_to_le64(cpu->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) disk->type = cpu->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) disk->objectid = cpu_to_le64(cpu->objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) static inline void btrfs_node_key_to_cpu(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) struct btrfs_key *key, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) struct btrfs_disk_key disk_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) btrfs_node_key(eb, &disk_key, nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) btrfs_disk_key_to_cpu(key, &disk_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) static inline void btrfs_item_key_to_cpu(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) struct btrfs_key *key, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) struct btrfs_disk_key disk_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) btrfs_item_key(eb, &disk_key, nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) btrfs_disk_key_to_cpu(key, &disk_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) static inline void btrfs_dir_item_key_to_cpu(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) const struct btrfs_dir_item *item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) struct btrfs_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) struct btrfs_disk_key disk_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) btrfs_dir_item_key(eb, item, &disk_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) btrfs_disk_key_to_cpu(key, &disk_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) /* struct btrfs_header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) BTRFS_SETGET_HEADER_FUNCS(header_bytenr, struct btrfs_header, bytenr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) BTRFS_SETGET_HEADER_FUNCS(header_generation, struct btrfs_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) BTRFS_SETGET_HEADER_FUNCS(header_owner, struct btrfs_header, owner, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) BTRFS_SETGET_HEADER_FUNCS(header_nritems, struct btrfs_header, nritems, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) BTRFS_SETGET_HEADER_FUNCS(header_flags, struct btrfs_header, flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) BTRFS_SETGET_HEADER_FUNCS(header_level, struct btrfs_header, level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) BTRFS_SETGET_STACK_FUNCS(stack_header_generation, struct btrfs_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) BTRFS_SETGET_STACK_FUNCS(stack_header_owner, struct btrfs_header, owner, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) BTRFS_SETGET_STACK_FUNCS(stack_header_nritems, struct btrfs_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) nritems, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) BTRFS_SETGET_STACK_FUNCS(stack_header_bytenr, struct btrfs_header, bytenr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) static inline int btrfs_header_flag(const struct extent_buffer *eb, u64 flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) return (btrfs_header_flags(eb) & flag) == flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) static inline void btrfs_set_header_flag(struct extent_buffer *eb, u64 flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) u64 flags = btrfs_header_flags(eb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) btrfs_set_header_flags(eb, flags | flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) static inline void btrfs_clear_header_flag(struct extent_buffer *eb, u64 flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) u64 flags = btrfs_header_flags(eb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) btrfs_set_header_flags(eb, flags & ~flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) static inline int btrfs_header_backref_rev(const struct extent_buffer *eb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) u64 flags = btrfs_header_flags(eb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) return flags >> BTRFS_BACKREF_REV_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) static inline void btrfs_set_header_backref_rev(struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) int rev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) u64 flags = btrfs_header_flags(eb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) flags &= ~BTRFS_BACKREF_REV_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) flags |= (u64)rev << BTRFS_BACKREF_REV_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) btrfs_set_header_flags(eb, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) static inline int btrfs_is_leaf(const struct extent_buffer *eb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) return btrfs_header_level(eb) == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) /* struct btrfs_root_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) BTRFS_SETGET_FUNCS(disk_root_generation, struct btrfs_root_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) BTRFS_SETGET_FUNCS(disk_root_refs, struct btrfs_root_item, refs, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) BTRFS_SETGET_FUNCS(disk_root_bytenr, struct btrfs_root_item, bytenr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) BTRFS_SETGET_FUNCS(disk_root_level, struct btrfs_root_item, level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) BTRFS_SETGET_STACK_FUNCS(root_generation, struct btrfs_root_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) BTRFS_SETGET_STACK_FUNCS(root_bytenr, struct btrfs_root_item, bytenr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) BTRFS_SETGET_STACK_FUNCS(root_level, struct btrfs_root_item, level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) BTRFS_SETGET_STACK_FUNCS(root_dirid, struct btrfs_root_item, root_dirid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) BTRFS_SETGET_STACK_FUNCS(root_refs, struct btrfs_root_item, refs, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) BTRFS_SETGET_STACK_FUNCS(root_flags, struct btrfs_root_item, flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) BTRFS_SETGET_STACK_FUNCS(root_used, struct btrfs_root_item, bytes_used, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) BTRFS_SETGET_STACK_FUNCS(root_limit, struct btrfs_root_item, byte_limit, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) BTRFS_SETGET_STACK_FUNCS(root_last_snapshot, struct btrfs_root_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) last_snapshot, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) BTRFS_SETGET_STACK_FUNCS(root_generation_v2, struct btrfs_root_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) generation_v2, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) BTRFS_SETGET_STACK_FUNCS(root_ctransid, struct btrfs_root_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) ctransid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) BTRFS_SETGET_STACK_FUNCS(root_otransid, struct btrfs_root_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) otransid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) BTRFS_SETGET_STACK_FUNCS(root_stransid, struct btrfs_root_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) stransid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) BTRFS_SETGET_STACK_FUNCS(root_rtransid, struct btrfs_root_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) rtransid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) static inline bool btrfs_root_readonly(const struct btrfs_root *root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) return (root->root_item.flags & cpu_to_le64(BTRFS_ROOT_SUBVOL_RDONLY)) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) static inline bool btrfs_root_dead(const struct btrfs_root *root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) return (root->root_item.flags & cpu_to_le64(BTRFS_ROOT_SUBVOL_DEAD)) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) /* struct btrfs_root_backup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) BTRFS_SETGET_STACK_FUNCS(backup_tree_root, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) tree_root, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) BTRFS_SETGET_STACK_FUNCS(backup_tree_root_gen, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) tree_root_gen, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) BTRFS_SETGET_STACK_FUNCS(backup_tree_root_level, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) tree_root_level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) BTRFS_SETGET_STACK_FUNCS(backup_chunk_root, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) chunk_root, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) BTRFS_SETGET_STACK_FUNCS(backup_chunk_root_gen, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) chunk_root_gen, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) BTRFS_SETGET_STACK_FUNCS(backup_chunk_root_level, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) chunk_root_level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) BTRFS_SETGET_STACK_FUNCS(backup_extent_root, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) extent_root, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) BTRFS_SETGET_STACK_FUNCS(backup_extent_root_gen, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) extent_root_gen, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) BTRFS_SETGET_STACK_FUNCS(backup_extent_root_level, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) extent_root_level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) BTRFS_SETGET_STACK_FUNCS(backup_fs_root, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) fs_root, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) BTRFS_SETGET_STACK_FUNCS(backup_fs_root_gen, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) fs_root_gen, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) BTRFS_SETGET_STACK_FUNCS(backup_fs_root_level, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) fs_root_level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) BTRFS_SETGET_STACK_FUNCS(backup_dev_root, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) dev_root, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) BTRFS_SETGET_STACK_FUNCS(backup_dev_root_gen, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) dev_root_gen, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) BTRFS_SETGET_STACK_FUNCS(backup_dev_root_level, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) dev_root_level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) BTRFS_SETGET_STACK_FUNCS(backup_csum_root, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) csum_root, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) BTRFS_SETGET_STACK_FUNCS(backup_csum_root_gen, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) csum_root_gen, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) BTRFS_SETGET_STACK_FUNCS(backup_csum_root_level, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) csum_root_level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) BTRFS_SETGET_STACK_FUNCS(backup_total_bytes, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) total_bytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) BTRFS_SETGET_STACK_FUNCS(backup_bytes_used, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) bytes_used, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) BTRFS_SETGET_STACK_FUNCS(backup_num_devices, struct btrfs_root_backup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) num_devices, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) /* struct btrfs_balance_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) BTRFS_SETGET_FUNCS(balance_flags, struct btrfs_balance_item, flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) static inline void btrfs_balance_data(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) const struct btrfs_balance_item *bi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) struct btrfs_disk_balance_args *ba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) read_eb_member(eb, bi, struct btrfs_balance_item, data, ba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) static inline void btrfs_set_balance_data(struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) struct btrfs_balance_item *bi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) const struct btrfs_disk_balance_args *ba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) write_eb_member(eb, bi, struct btrfs_balance_item, data, ba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) static inline void btrfs_balance_meta(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) const struct btrfs_balance_item *bi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) struct btrfs_disk_balance_args *ba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) read_eb_member(eb, bi, struct btrfs_balance_item, meta, ba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) static inline void btrfs_set_balance_meta(struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) struct btrfs_balance_item *bi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) const struct btrfs_disk_balance_args *ba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) write_eb_member(eb, bi, struct btrfs_balance_item, meta, ba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) static inline void btrfs_balance_sys(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) const struct btrfs_balance_item *bi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) struct btrfs_disk_balance_args *ba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) read_eb_member(eb, bi, struct btrfs_balance_item, sys, ba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) static inline void btrfs_set_balance_sys(struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) struct btrfs_balance_item *bi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) const struct btrfs_disk_balance_args *ba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) write_eb_member(eb, bi, struct btrfs_balance_item, sys, ba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) btrfs_disk_balance_args_to_cpu(struct btrfs_balance_args *cpu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) const struct btrfs_disk_balance_args *disk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) memset(cpu, 0, sizeof(*cpu));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) cpu->profiles = le64_to_cpu(disk->profiles);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) cpu->usage = le64_to_cpu(disk->usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) cpu->devid = le64_to_cpu(disk->devid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) cpu->pstart = le64_to_cpu(disk->pstart);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) cpu->pend = le64_to_cpu(disk->pend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) cpu->vstart = le64_to_cpu(disk->vstart);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) cpu->vend = le64_to_cpu(disk->vend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) cpu->target = le64_to_cpu(disk->target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) cpu->flags = le64_to_cpu(disk->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) cpu->limit = le64_to_cpu(disk->limit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) cpu->stripes_min = le32_to_cpu(disk->stripes_min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) cpu->stripes_max = le32_to_cpu(disk->stripes_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) btrfs_cpu_balance_args_to_disk(struct btrfs_disk_balance_args *disk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) const struct btrfs_balance_args *cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) memset(disk, 0, sizeof(*disk));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) disk->profiles = cpu_to_le64(cpu->profiles);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) disk->usage = cpu_to_le64(cpu->usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) disk->devid = cpu_to_le64(cpu->devid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) disk->pstart = cpu_to_le64(cpu->pstart);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) disk->pend = cpu_to_le64(cpu->pend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) disk->vstart = cpu_to_le64(cpu->vstart);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) disk->vend = cpu_to_le64(cpu->vend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) disk->target = cpu_to_le64(cpu->target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) disk->flags = cpu_to_le64(cpu->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) disk->limit = cpu_to_le64(cpu->limit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) disk->stripes_min = cpu_to_le32(cpu->stripes_min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) disk->stripes_max = cpu_to_le32(cpu->stripes_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) /* struct btrfs_super_block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) BTRFS_SETGET_STACK_FUNCS(super_bytenr, struct btrfs_super_block, bytenr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) BTRFS_SETGET_STACK_FUNCS(super_flags, struct btrfs_super_block, flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) BTRFS_SETGET_STACK_FUNCS(super_generation, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) BTRFS_SETGET_STACK_FUNCS(super_root, struct btrfs_super_block, root, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) BTRFS_SETGET_STACK_FUNCS(super_sys_array_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) struct btrfs_super_block, sys_chunk_array_size, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) BTRFS_SETGET_STACK_FUNCS(super_chunk_root_generation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) struct btrfs_super_block, chunk_root_generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) BTRFS_SETGET_STACK_FUNCS(super_root_level, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) root_level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) BTRFS_SETGET_STACK_FUNCS(super_chunk_root, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) chunk_root, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) BTRFS_SETGET_STACK_FUNCS(super_chunk_root_level, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) chunk_root_level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) BTRFS_SETGET_STACK_FUNCS(super_log_root, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) log_root, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) BTRFS_SETGET_STACK_FUNCS(super_log_root_transid, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) log_root_transid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) BTRFS_SETGET_STACK_FUNCS(super_log_root_level, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) log_root_level, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) BTRFS_SETGET_STACK_FUNCS(super_total_bytes, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) total_bytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) BTRFS_SETGET_STACK_FUNCS(super_bytes_used, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) bytes_used, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) BTRFS_SETGET_STACK_FUNCS(super_sectorsize, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) sectorsize, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) BTRFS_SETGET_STACK_FUNCS(super_nodesize, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) nodesize, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) BTRFS_SETGET_STACK_FUNCS(super_stripesize, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) stripesize, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) BTRFS_SETGET_STACK_FUNCS(super_root_dir, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) root_dir_objectid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) BTRFS_SETGET_STACK_FUNCS(super_num_devices, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) num_devices, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) BTRFS_SETGET_STACK_FUNCS(super_compat_flags, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) compat_flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) BTRFS_SETGET_STACK_FUNCS(super_compat_ro_flags, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) compat_ro_flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) BTRFS_SETGET_STACK_FUNCS(super_incompat_flags, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) incompat_flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) BTRFS_SETGET_STACK_FUNCS(super_csum_type, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) csum_type, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) BTRFS_SETGET_STACK_FUNCS(super_cache_generation, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) cache_generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) BTRFS_SETGET_STACK_FUNCS(super_magic, struct btrfs_super_block, magic, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) BTRFS_SETGET_STACK_FUNCS(super_uuid_tree_generation, struct btrfs_super_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) uuid_tree_generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) int btrfs_super_csum_size(const struct btrfs_super_block *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) const char *btrfs_super_csum_name(u16 csum_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) const char *btrfs_super_csum_driver(u16 csum_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) size_t __attribute_const__ btrfs_get_num_csums(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) * The leaf data grows from end-to-front in the node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) * this returns the address of the start of the last item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) * which is the stop of the leaf data stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) static inline unsigned int leaf_data_end(const struct extent_buffer *leaf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) u32 nr = btrfs_header_nritems(leaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) if (nr == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) return BTRFS_LEAF_DATA_SIZE(leaf->fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) return btrfs_item_offset_nr(leaf, nr - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) /* struct btrfs_file_extent_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) BTRFS_SETGET_STACK_FUNCS(stack_file_extent_type, struct btrfs_file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) type, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) BTRFS_SETGET_STACK_FUNCS(stack_file_extent_disk_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) struct btrfs_file_extent_item, disk_bytenr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) BTRFS_SETGET_STACK_FUNCS(stack_file_extent_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) struct btrfs_file_extent_item, offset, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) BTRFS_SETGET_STACK_FUNCS(stack_file_extent_generation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) struct btrfs_file_extent_item, generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) BTRFS_SETGET_STACK_FUNCS(stack_file_extent_num_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) struct btrfs_file_extent_item, num_bytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) BTRFS_SETGET_STACK_FUNCS(stack_file_extent_ram_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) struct btrfs_file_extent_item, ram_bytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) BTRFS_SETGET_STACK_FUNCS(stack_file_extent_disk_num_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) struct btrfs_file_extent_item, disk_num_bytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) BTRFS_SETGET_STACK_FUNCS(stack_file_extent_compression,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) struct btrfs_file_extent_item, compression, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) static inline unsigned long
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) btrfs_file_extent_inline_start(const struct btrfs_file_extent_item *e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) return (unsigned long)e + BTRFS_FILE_EXTENT_INLINE_DATA_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) static inline u32 btrfs_file_extent_calc_inline_size(u32 datasize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) return BTRFS_FILE_EXTENT_INLINE_DATA_START + datasize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) BTRFS_SETGET_FUNCS(file_extent_type, struct btrfs_file_extent_item, type, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) BTRFS_SETGET_FUNCS(file_extent_disk_bytenr, struct btrfs_file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) disk_bytenr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) BTRFS_SETGET_FUNCS(file_extent_generation, struct btrfs_file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) BTRFS_SETGET_FUNCS(file_extent_disk_num_bytes, struct btrfs_file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) disk_num_bytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) BTRFS_SETGET_FUNCS(file_extent_offset, struct btrfs_file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) offset, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) BTRFS_SETGET_FUNCS(file_extent_num_bytes, struct btrfs_file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) num_bytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) BTRFS_SETGET_FUNCS(file_extent_ram_bytes, struct btrfs_file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) ram_bytes, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) BTRFS_SETGET_FUNCS(file_extent_compression, struct btrfs_file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) compression, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) BTRFS_SETGET_FUNCS(file_extent_encryption, struct btrfs_file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) encryption, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) BTRFS_SETGET_FUNCS(file_extent_other_encoding, struct btrfs_file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) other_encoding, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) * this returns the number of bytes used by the item on disk, minus the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) * size of any extent headers. If a file is compressed on disk, this is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) * the compressed size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) static inline u32 btrfs_file_extent_inline_item_len(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) struct btrfs_item *e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) return btrfs_item_size(eb, e) - BTRFS_FILE_EXTENT_INLINE_DATA_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) /* btrfs_qgroup_status_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) BTRFS_SETGET_FUNCS(qgroup_status_generation, struct btrfs_qgroup_status_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) BTRFS_SETGET_FUNCS(qgroup_status_version, struct btrfs_qgroup_status_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) version, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) BTRFS_SETGET_FUNCS(qgroup_status_flags, struct btrfs_qgroup_status_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) BTRFS_SETGET_FUNCS(qgroup_status_rescan, struct btrfs_qgroup_status_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) rescan, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) /* btrfs_qgroup_info_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) BTRFS_SETGET_FUNCS(qgroup_info_generation, struct btrfs_qgroup_info_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) BTRFS_SETGET_FUNCS(qgroup_info_rfer, struct btrfs_qgroup_info_item, rfer, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) BTRFS_SETGET_FUNCS(qgroup_info_rfer_cmpr, struct btrfs_qgroup_info_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) rfer_cmpr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) BTRFS_SETGET_FUNCS(qgroup_info_excl, struct btrfs_qgroup_info_item, excl, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) BTRFS_SETGET_FUNCS(qgroup_info_excl_cmpr, struct btrfs_qgroup_info_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) excl_cmpr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_generation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) struct btrfs_qgroup_info_item, generation, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_rfer, struct btrfs_qgroup_info_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) rfer, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_rfer_cmpr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) struct btrfs_qgroup_info_item, rfer_cmpr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_excl, struct btrfs_qgroup_info_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) excl, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_excl_cmpr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) struct btrfs_qgroup_info_item, excl_cmpr, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) /* btrfs_qgroup_limit_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) BTRFS_SETGET_FUNCS(qgroup_limit_flags, struct btrfs_qgroup_limit_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) flags, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) BTRFS_SETGET_FUNCS(qgroup_limit_max_rfer, struct btrfs_qgroup_limit_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) max_rfer, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) BTRFS_SETGET_FUNCS(qgroup_limit_max_excl, struct btrfs_qgroup_limit_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) max_excl, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) BTRFS_SETGET_FUNCS(qgroup_limit_rsv_rfer, struct btrfs_qgroup_limit_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) rsv_rfer, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) BTRFS_SETGET_FUNCS(qgroup_limit_rsv_excl, struct btrfs_qgroup_limit_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) rsv_excl, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) /* btrfs_dev_replace_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) BTRFS_SETGET_FUNCS(dev_replace_src_devid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) struct btrfs_dev_replace_item, src_devid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) BTRFS_SETGET_FUNCS(dev_replace_cont_reading_from_srcdev_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) struct btrfs_dev_replace_item, cont_reading_from_srcdev_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) BTRFS_SETGET_FUNCS(dev_replace_replace_state, struct btrfs_dev_replace_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) replace_state, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) BTRFS_SETGET_FUNCS(dev_replace_time_started, struct btrfs_dev_replace_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) time_started, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) BTRFS_SETGET_FUNCS(dev_replace_time_stopped, struct btrfs_dev_replace_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) time_stopped, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) BTRFS_SETGET_FUNCS(dev_replace_num_write_errors, struct btrfs_dev_replace_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) num_write_errors, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) BTRFS_SETGET_FUNCS(dev_replace_num_uncorrectable_read_errors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) struct btrfs_dev_replace_item, num_uncorrectable_read_errors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) BTRFS_SETGET_FUNCS(dev_replace_cursor_left, struct btrfs_dev_replace_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) cursor_left, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) BTRFS_SETGET_FUNCS(dev_replace_cursor_right, struct btrfs_dev_replace_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) cursor_right, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_src_devid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) struct btrfs_dev_replace_item, src_devid, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_cont_reading_from_srcdev_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) struct btrfs_dev_replace_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) cont_reading_from_srcdev_mode, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_replace_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) struct btrfs_dev_replace_item, replace_state, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_time_started,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) struct btrfs_dev_replace_item, time_started, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_time_stopped,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) struct btrfs_dev_replace_item, time_stopped, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_num_write_errors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) struct btrfs_dev_replace_item, num_write_errors, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_num_uncorrectable_read_errors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) struct btrfs_dev_replace_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) num_uncorrectable_read_errors, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_cursor_left,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) struct btrfs_dev_replace_item, cursor_left, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_cursor_right,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) struct btrfs_dev_replace_item, cursor_right, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) /* helper function to cast into the data area of the leaf. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) #define btrfs_item_ptr(leaf, slot, type) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) ((type *)(BTRFS_LEAF_DATA_OFFSET + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) btrfs_item_offset_nr(leaf, slot)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) #define btrfs_item_ptr_offset(leaf, slot) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) ((unsigned long)(BTRFS_LEAF_DATA_OFFSET + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) btrfs_item_offset_nr(leaf, slot)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) static inline u32 btrfs_crc32c(u32 crc, const void *address, unsigned length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) return crc32c(crc, address, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) static inline void btrfs_crc32c_final(u32 crc, u8 *result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) put_unaligned_le32(~crc, result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) static inline u64 btrfs_name_hash(const char *name, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) return crc32c((u32)~1, name, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) * Figure the key offset of an extended inode ref
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) static inline u64 btrfs_extref_hash(u64 parent_objectid, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) return (u64) crc32c(parent_objectid, name, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) static inline gfp_t btrfs_alloc_write_mask(struct address_space *mapping)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) return mapping_gfp_constraint(mapping, ~__GFP_FS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) /* extent-tree.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) enum btrfs_inline_ref_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) BTRFS_REF_TYPE_INVALID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) BTRFS_REF_TYPE_BLOCK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) BTRFS_REF_TYPE_DATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) BTRFS_REF_TYPE_ANY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) int btrfs_get_extent_inline_ref_type(const struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) struct btrfs_extent_inline_ref *iref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) enum btrfs_inline_ref_type is_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) u64 hash_extent_data_ref(u64 root_objectid, u64 owner, u64 offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) u64 btrfs_csum_bytes_to_leaves(struct btrfs_fs_info *fs_info, u64 csum_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) * Use this if we would be adding new items, as we could split nodes as we cow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) * down the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) static inline u64 btrfs_calc_insert_metadata_size(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) unsigned num_items)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) return (u64)fs_info->nodesize * BTRFS_MAX_LEVEL * 2 * num_items;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) * Doing a truncate or a modification won't result in new nodes or leaves, just
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) * what we need for COW.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) static inline u64 btrfs_calc_metadata_size(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) unsigned num_items)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) return (u64)fs_info->nodesize * BTRFS_MAX_LEVEL * num_items;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) int btrfs_add_excluded_extent(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) u64 start, u64 num_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) void btrfs_free_excluded_extents(struct btrfs_block_group *cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) unsigned long count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) void btrfs_cleanup_ref_head_accounting(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) struct btrfs_delayed_ref_root *delayed_refs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) struct btrfs_delayed_ref_head *head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) int btrfs_lookup_data_extent(struct btrfs_fs_info *fs_info, u64 start, u64 len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) struct btrfs_fs_info *fs_info, u64 bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) u64 offset, int metadata, u64 *refs, u64 *flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) int btrfs_pin_extent(struct btrfs_trans_handle *trans, u64 bytenr, u64 num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) int reserved);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) int btrfs_pin_extent_for_log_replay(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) u64 bytenr, u64 num_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) int btrfs_exclude_logged_extents(struct extent_buffer *eb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) int btrfs_cross_ref_exist(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) u64 objectid, u64 offset, u64 bytenr, bool strict);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) u64 parent, u64 root_objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) const struct btrfs_disk_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) int level, u64 hint,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) u64 empty_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) enum btrfs_lock_nesting nest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) struct extent_buffer *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) u64 parent, int last_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) int btrfs_alloc_reserved_file_extent(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) struct btrfs_root *root, u64 owner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) u64 offset, u64 ram_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) struct btrfs_key *ins);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) u64 root_objectid, u64 owner, u64 offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) struct btrfs_key *ins);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) int btrfs_reserve_extent(struct btrfs_root *root, u64 ram_bytes, u64 num_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) u64 min_alloc_size, u64 empty_size, u64 hint_byte,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) struct btrfs_key *ins, int is_data, int delalloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) struct extent_buffer *buf, int full_backref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) int btrfs_dec_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) struct extent_buffer *buf, int full_backref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) struct extent_buffer *eb, u64 flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) int level, int is_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_ref *ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) int btrfs_free_reserved_extent(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) u64 start, u64 len, int delalloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) int btrfs_pin_reserved_extent(struct btrfs_trans_handle *trans, u64 start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) u64 len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) struct btrfs_ref *generic_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) int btrfs_extent_readonly(struct btrfs_fs_info *fs_info, u64 bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) void btrfs_clear_space_info_full(struct btrfs_fs_info *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) * Different levels for to flush space when doing space reservations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) * The higher the level, the more methods we try to reclaim space.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) enum btrfs_reserve_flush_enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) /* If we are in the transaction, we can't flush anything.*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) BTRFS_RESERVE_NO_FLUSH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) * Flush space by:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) * - Running delayed inode items
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) * - Allocating a new chunk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) BTRFS_RESERVE_FLUSH_LIMIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) * Flush space by:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) * - Running delayed inode items
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) * - Running delayed refs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) * - Running delalloc and waiting for ordered extents
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) * - Allocating a new chunk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) BTRFS_RESERVE_FLUSH_EVICT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) * Flush space by above mentioned methods and by:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) * - Running delayed iputs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) * - Commiting transaction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) * Can be interruped by fatal signal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) BTRFS_RESERVE_FLUSH_DATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) BTRFS_RESERVE_FLUSH_FREE_SPACE_INODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) BTRFS_RESERVE_FLUSH_ALL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) * Pretty much the same as FLUSH_ALL, but can also steal space from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) * global rsv.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) * Can be interruped by fatal signal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) BTRFS_RESERVE_FLUSH_ALL_STEAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) enum btrfs_flush_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) FLUSH_DELAYED_ITEMS_NR = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) FLUSH_DELAYED_ITEMS = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) FLUSH_DELAYED_REFS_NR = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) FLUSH_DELAYED_REFS = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) FLUSH_DELALLOC = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) FLUSH_DELALLOC_WAIT = 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) ALLOC_CHUNK = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) ALLOC_CHUNK_FORCE = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) RUN_DELAYED_IPUTS = 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) COMMIT_TRANS = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) int btrfs_subvolume_reserve_metadata(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) struct btrfs_block_rsv *rsv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) int nitems, bool use_global_rsv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) void btrfs_subvolume_release_metadata(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) struct btrfs_block_rsv *rsv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) void btrfs_delalloc_release_extents(struct btrfs_inode *inode, u64 num_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) int btrfs_delalloc_reserve_metadata(struct btrfs_inode *inode, u64 num_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) u64 btrfs_account_ro_block_groups_free_space(struct btrfs_space_info *sinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) int btrfs_error_unpin_extent_range(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) u64 start, u64 end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) u64 num_bytes, u64 *actual_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) int btrfs_init_space_info(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) int btrfs_delayed_refs_qgroup_accounting(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) int btrfs_start_write_no_snapshotting(struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) void btrfs_end_write_no_snapshotting(struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) void btrfs_wait_for_snapshot_creation(struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) /* ctree.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) int btrfs_bin_search(struct extent_buffer *eb, const struct btrfs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) int *slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) int __pure btrfs_comp_cpu_keys(const struct btrfs_key *k1, const struct btrfs_key *k2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) int btrfs_previous_item(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) struct btrfs_path *path, u64 min_objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) int btrfs_previous_extent_item(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) struct btrfs_path *path, u64 min_objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) void btrfs_set_item_key_safe(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) const struct btrfs_key *new_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) struct extent_buffer *btrfs_root_node(struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) struct btrfs_key *key, int lowest_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) u64 min_trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) u64 min_trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) struct extent_buffer *btrfs_read_node_slot(struct extent_buffer *parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) int slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) int btrfs_cow_block(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) struct btrfs_root *root, struct extent_buffer *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) struct extent_buffer *parent, int parent_slot,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) struct extent_buffer **cow_ret,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) enum btrfs_lock_nesting nest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) int btrfs_copy_root(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) struct extent_buffer *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) struct extent_buffer **cow_ret, u64 new_root_objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) int btrfs_block_can_be_shared(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) struct extent_buffer *buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) void btrfs_extend_item(struct btrfs_path *path, u32 data_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) void btrfs_truncate_item(struct btrfs_path *path, u32 new_size, int from_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) int btrfs_split_item(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) const struct btrfs_key *new_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) unsigned long split_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) int btrfs_duplicate_item(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) const struct btrfs_key *new_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) u64 inum, u64 ioff, u8 key_type, struct btrfs_key *found_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) const struct btrfs_key *key, struct btrfs_path *p,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) int ins_len, int cow);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) int btrfs_search_old_slot(struct btrfs_root *root, const struct btrfs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) struct btrfs_path *p, u64 time_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) int btrfs_search_slot_for_read(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) const struct btrfs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) struct btrfs_path *p, int find_higher,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) int return_any);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) int btrfs_realloc_node(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) struct btrfs_root *root, struct extent_buffer *parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) int start_slot, u64 *last_ret,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) struct btrfs_key *progress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) void btrfs_release_path(struct btrfs_path *p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) struct btrfs_path *btrfs_alloc_path(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) void btrfs_free_path(struct btrfs_path *p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) struct btrfs_path *path, int slot, int nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) static inline int btrfs_del_item(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) struct btrfs_path *path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) return btrfs_del_items(trans, root, path, path->slots[0], 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) const struct btrfs_key *cpu_key, u32 *data_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) int nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) const struct btrfs_key *key, void *data, u32 data_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) const struct btrfs_key *cpu_key, u32 *data_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) int nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) static inline int btrfs_insert_empty_item(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) const struct btrfs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) u32 data_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) return btrfs_insert_empty_items(trans, root, path, key, &data_size, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) u64 time_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) static inline int btrfs_next_old_item(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) struct btrfs_path *p, u64 time_seq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) ++p->slots[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) if (p->slots[0] >= btrfs_header_nritems(p->nodes[0]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) return btrfs_next_old_leaf(root, p, time_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) static inline int btrfs_next_item(struct btrfs_root *root, struct btrfs_path *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) return btrfs_next_old_item(root, p, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) int btrfs_leaf_free_space(struct extent_buffer *leaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) int __must_check btrfs_drop_snapshot(struct btrfs_root *root, int update_ref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) int for_reloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) int btrfs_drop_subtree(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) struct extent_buffer *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) struct extent_buffer *parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) static inline int btrfs_fs_closing(struct btrfs_fs_info *fs_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) * Do it this way so we only ever do one test_bit in the normal case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) if (test_bit(BTRFS_FS_CLOSING_START, &fs_info->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) if (test_bit(BTRFS_FS_CLOSING_DONE, &fs_info->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) * If we remount the fs to be R/O or umount the fs, the cleaner needn't do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) * anything except sleeping. This function is used to check the status of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) * the fs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) static inline int btrfs_need_cleaner_sleep(struct btrfs_fs_info *fs_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) return fs_info->sb->s_flags & SB_RDONLY || btrfs_fs_closing(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) /* tree mod log functions from ctree.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) u64 btrfs_get_tree_mod_seq(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) struct seq_list *elem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) struct seq_list *elem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) int btrfs_old_root_level(struct btrfs_root *root, u64 time_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) /* root-item.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) int btrfs_add_root_ref(struct btrfs_trans_handle *trans, u64 root_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) u64 ref_id, u64 dirid, u64 sequence, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) int name_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) int btrfs_del_root_ref(struct btrfs_trans_handle *trans, u64 root_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) u64 ref_id, u64 dirid, u64 *sequence, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) int name_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) int btrfs_del_root(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) const struct btrfs_key *key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) int btrfs_insert_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) const struct btrfs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) struct btrfs_root_item *item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) int __must_check btrfs_update_root(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) struct btrfs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) struct btrfs_root_item *item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) int btrfs_find_root(struct btrfs_root *root, const struct btrfs_key *search_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) struct btrfs_path *path, struct btrfs_root_item *root_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) struct btrfs_key *root_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) int btrfs_find_orphan_roots(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) void btrfs_set_root_node(struct btrfs_root_item *item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) struct extent_buffer *node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) void btrfs_check_and_init_root_item(struct btrfs_root_item *item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) void btrfs_update_root_times(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) /* uuid-tree.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) int btrfs_uuid_tree_add(struct btrfs_trans_handle *trans, u8 *uuid, u8 type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) u64 subid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) int btrfs_uuid_tree_remove(struct btrfs_trans_handle *trans, u8 *uuid, u8 type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) u64 subid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) int btrfs_uuid_tree_iterate(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) /* dir-item.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) int btrfs_check_dir_item_collision(struct btrfs_root *root, u64 dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) const char *name, int name_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) int name_len, struct btrfs_inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) struct btrfs_key *location, u8 type, u64 index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) struct btrfs_dir_item *btrfs_lookup_dir_item(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) struct btrfs_path *path, u64 dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) const char *name, int name_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) int mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) struct btrfs_dir_item *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) btrfs_lookup_dir_index_item(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) struct btrfs_path *path, u64 dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) u64 objectid, const char *name, int name_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) int mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) struct btrfs_dir_item *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) btrfs_search_dir_index_item(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) struct btrfs_path *path, u64 dirid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) const char *name, int name_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) int btrfs_delete_one_dir_name(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) struct btrfs_dir_item *di);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) struct btrfs_path *path, u64 objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) const char *name, u16 name_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) const void *data, u16 data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) struct btrfs_dir_item *btrfs_lookup_xattr(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) struct btrfs_path *path, u64 dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) const char *name, u16 name_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) int mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) int name_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) /* orphan.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) int btrfs_insert_orphan_item(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) struct btrfs_root *root, u64 offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) int btrfs_del_orphan_item(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) struct btrfs_root *root, u64 offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) int btrfs_find_orphan_item(struct btrfs_root *root, u64 offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) /* inode-item.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) const char *name, int name_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) u64 inode_objectid, u64 ref_objectid, u64 index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) int btrfs_del_inode_ref(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) const char *name, int name_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) u64 inode_objectid, u64 ref_objectid, u64 *index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) int btrfs_insert_empty_inode(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) struct btrfs_path *path, u64 objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) int btrfs_lookup_inode(struct btrfs_trans_handle *trans, struct btrfs_root
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) *root, struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) struct btrfs_key *location, int mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) struct btrfs_inode_extref *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) btrfs_lookup_inode_extref(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) const char *name, int name_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) u64 inode_objectid, u64 ref_objectid, int ins_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) int cow);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) struct btrfs_inode_ref *btrfs_find_name_in_backref(struct extent_buffer *leaf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) int slot, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) int name_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) struct btrfs_inode_extref *btrfs_find_name_in_ext_backref(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) struct extent_buffer *leaf, int slot, u64 ref_objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) const char *name, int name_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) /* file-item.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) struct btrfs_dio_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) int btrfs_del_csums(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) struct btrfs_root *root, u64 bytenr, u64 len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) u64 offset, u8 *dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) u64 objectid, u64 pos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) u64 disk_offset, u64 disk_num_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) u64 num_bytes, u64 offset, u64 ram_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) u8 compression, u8 encryption, u16 other_encoding);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) struct btrfs_path *path, u64 objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) u64 bytenr, int mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) struct btrfs_ordered_sum *sums);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) blk_status_t btrfs_csum_one_bio(struct btrfs_inode *inode, struct bio *bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) u64 file_start, int contig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) struct list_head *list, int search_commit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) void btrfs_extent_item_to_extent_map(struct btrfs_inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) const struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) struct btrfs_file_extent_item *fi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) const bool new_inline,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) struct extent_map *em);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) int btrfs_inode_clear_file_extent_range(struct btrfs_inode *inode, u64 start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) u64 len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) int btrfs_inode_set_file_extent_range(struct btrfs_inode *inode, u64 start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) u64 len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) void btrfs_inode_safe_disk_i_size_write(struct inode *inode, u64 new_i_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) u64 btrfs_file_extent_end(const struct btrfs_path *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) /* inode.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) blk_status_t btrfs_submit_data_bio(struct inode *inode, struct bio *bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) int mirror_num, unsigned long bio_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u64 phy_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) struct page *page, u64 start, u64 end, int mirror);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) struct extent_map *btrfs_get_extent_fiemap(struct btrfs_inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) u64 start, u64 len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) u64 *orig_start, u64 *orig_block_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) u64 *ram_bytes, bool strict);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) void __btrfs_del_delalloc_inode(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) struct btrfs_inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) int btrfs_set_inode_index(struct btrfs_inode *dir, u64 *index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) int btrfs_unlink_inode(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) struct btrfs_inode *dir, struct btrfs_inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) const char *name, int name_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) int btrfs_add_link(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) struct btrfs_inode *parent_inode, struct btrfs_inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) const char *name, int name_len, int add_backref, u64 index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) int btrfs_delete_subvolume(struct inode *dir, struct dentry *dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) int btrfs_truncate_block(struct inode *inode, loff_t from, loff_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) int front);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) struct inode *inode, u64 new_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) u32 min_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) int btrfs_start_delalloc_snapshot(struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, u64 nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) bool in_reclaim_context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) int btrfs_set_extent_delalloc(struct btrfs_inode *inode, u64 start, u64 end,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) unsigned int extra_bits,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) struct extent_state **cached_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) int btrfs_create_subvol_root(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) struct btrfs_root *new_root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) struct btrfs_root *parent_root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) u64 new_dirid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) void btrfs_set_delalloc_extent(struct inode *inode, struct extent_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) unsigned *bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) void btrfs_clear_delalloc_extent(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) struct extent_state *state, unsigned *bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) void btrfs_merge_delalloc_extent(struct inode *inode, struct extent_state *new,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) struct extent_state *other);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) void btrfs_split_delalloc_extent(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) struct extent_state *orig, u64 split);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) int btrfs_bio_fits_in_stripe(struct page *page, size_t size, struct bio *bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) unsigned long bio_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) void btrfs_set_range_writeback(struct extent_io_tree *tree, u64 start, u64 end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) int btrfs_readpage(struct file *file, struct page *page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) void btrfs_evict_inode(struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) struct inode *btrfs_alloc_inode(struct super_block *sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) void btrfs_destroy_inode(struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) void btrfs_free_inode(struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) int btrfs_drop_inode(struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) int __init btrfs_init_cachep(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) void __cold btrfs_destroy_cachep(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) struct inode *btrfs_iget_path(struct super_block *s, u64 ino,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) struct btrfs_root *root, struct btrfs_path *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) struct inode *btrfs_iget(struct super_block *s, u64 ino, struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) struct page *page, size_t pg_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) u64 start, u64 end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) int btrfs_update_inode(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) int btrfs_update_inode_fallback(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) struct btrfs_root *root, struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) int btrfs_orphan_add(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) struct btrfs_inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) int btrfs_orphan_cleanup(struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) void btrfs_add_delayed_iput(struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) void btrfs_run_delayed_iputs(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) int btrfs_wait_on_delayed_iputs(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) int btrfs_prealloc_file_range(struct inode *inode, int mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) u64 start, u64 num_bytes, u64 min_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) loff_t actual_len, u64 *alloc_hint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) int btrfs_prealloc_file_range_trans(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) struct btrfs_trans_handle *trans, int mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) u64 start, u64 num_bytes, u64 min_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) loff_t actual_len, u64 *alloc_hint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) int btrfs_run_delalloc_range(struct btrfs_inode *inode, struct page *locked_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) u64 start, u64 end, int *page_started, unsigned long *nr_written,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) struct writeback_control *wbc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) int btrfs_writepage_cow_fixup(struct page *page, u64 start, u64 end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) void btrfs_writepage_endio_finish_ordered(struct page *page, u64 start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) u64 end, int uptodate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) extern const struct dentry_operations btrfs_dentry_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) /* ioctl.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) long btrfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) long btrfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) int btrfs_ioctl_get_supported_features(void __user *arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) void btrfs_sync_inode_flags_to_i_flags(struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) int __pure btrfs_is_empty_uuid(u8 *uuid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) int btrfs_defrag_file(struct inode *inode, struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) struct btrfs_ioctl_defrag_range_args *range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) u64 newer_than, unsigned long max_pages);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) void btrfs_get_block_group_info(struct list_head *groups_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) struct btrfs_ioctl_space_info *space);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) void btrfs_update_ioctl_balance_args(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) struct btrfs_ioctl_balance_args *bargs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) bool btrfs_exclop_start(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) enum btrfs_exclusive_operation type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) void btrfs_exclop_finish(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) /* file.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) int __init btrfs_auto_defrag_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) void __cold btrfs_auto_defrag_exit(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) int btrfs_add_inode_defrag(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) struct btrfs_inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) void btrfs_cleanup_defrag_inodes(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) void btrfs_drop_extent_cache(struct btrfs_inode *inode, u64 start, u64 end,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) int skip_pinned);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) extern const struct file_operations btrfs_file_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) int __btrfs_drop_extents(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) struct btrfs_root *root, struct btrfs_inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) struct btrfs_path *path, u64 start, u64 end,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) u64 *drop_end, int drop_cache,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) int replace_extent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) u32 extent_item_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) int *key_inserted);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) int btrfs_drop_extents(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) struct btrfs_root *root, struct inode *inode, u64 start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) u64 end, int drop_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) int btrfs_replace_file_extents(struct inode *inode, struct btrfs_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) const u64 start, const u64 end,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) struct btrfs_replace_extent_info *extent_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) struct btrfs_trans_handle **trans_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) struct btrfs_inode *inode, u64 start, u64 end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) int btrfs_release_file(struct inode *inode, struct file *file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) int btrfs_dirty_pages(struct btrfs_inode *inode, struct page **pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) size_t num_pages, loff_t pos, size_t write_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) struct extent_state **cached);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) int btrfs_fdatawrite_range(struct inode *inode, loff_t start, loff_t end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) int btrfs_check_nocow_lock(struct btrfs_inode *inode, loff_t pos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) size_t *write_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) void btrfs_check_nocow_unlock(struct btrfs_inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) /* tree-defrag.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) int btrfs_defrag_leaves(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) /* super.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) unsigned long new_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) int btrfs_sync_fs(struct super_block *sb, int wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) char *btrfs_get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) u64 subvol_objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) static inline __printf(2, 3) __cold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) void btrfs_no_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) #ifdef CONFIG_PRINTK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) __printf(2, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) __cold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) #define btrfs_printk(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) btrfs_no_printk(fs_info, fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) #define btrfs_emerg(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) btrfs_printk(fs_info, KERN_EMERG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) #define btrfs_alert(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) btrfs_printk(fs_info, KERN_ALERT fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) #define btrfs_crit(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) btrfs_printk(fs_info, KERN_CRIT fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) #define btrfs_err(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) btrfs_printk(fs_info, KERN_ERR fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) #define btrfs_warn(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) btrfs_printk(fs_info, KERN_WARNING fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) #define btrfs_notice(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) btrfs_printk(fs_info, KERN_NOTICE fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) #define btrfs_info(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) btrfs_printk(fs_info, KERN_INFO fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) * Wrappers that use printk_in_rcu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) #define btrfs_emerg_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) btrfs_printk_in_rcu(fs_info, KERN_EMERG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) #define btrfs_alert_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) btrfs_printk_in_rcu(fs_info, KERN_ALERT fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) #define btrfs_crit_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) btrfs_printk_in_rcu(fs_info, KERN_CRIT fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) #define btrfs_err_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) btrfs_printk_in_rcu(fs_info, KERN_ERR fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) #define btrfs_warn_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) btrfs_printk_in_rcu(fs_info, KERN_WARNING fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) #define btrfs_notice_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) btrfs_printk_in_rcu(fs_info, KERN_NOTICE fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) #define btrfs_info_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) btrfs_printk_in_rcu(fs_info, KERN_INFO fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) * Wrappers that use a ratelimited printk_in_rcu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) #define btrfs_emerg_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) btrfs_printk_rl_in_rcu(fs_info, KERN_EMERG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) #define btrfs_alert_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) btrfs_printk_rl_in_rcu(fs_info, KERN_ALERT fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) #define btrfs_crit_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) btrfs_printk_rl_in_rcu(fs_info, KERN_CRIT fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) #define btrfs_err_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) btrfs_printk_rl_in_rcu(fs_info, KERN_ERR fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) #define btrfs_warn_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) btrfs_printk_rl_in_rcu(fs_info, KERN_WARNING fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) #define btrfs_notice_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) btrfs_printk_rl_in_rcu(fs_info, KERN_NOTICE fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) #define btrfs_info_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) btrfs_printk_rl_in_rcu(fs_info, KERN_INFO fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) * Wrappers that use a ratelimited printk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) #define btrfs_emerg_rl(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) btrfs_printk_ratelimited(fs_info, KERN_EMERG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) #define btrfs_alert_rl(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) btrfs_printk_ratelimited(fs_info, KERN_ALERT fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) #define btrfs_crit_rl(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) btrfs_printk_ratelimited(fs_info, KERN_CRIT fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) #define btrfs_err_rl(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) btrfs_printk_ratelimited(fs_info, KERN_ERR fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) #define btrfs_warn_rl(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) btrfs_printk_ratelimited(fs_info, KERN_WARNING fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) #define btrfs_notice_rl(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) btrfs_printk_ratelimited(fs_info, KERN_NOTICE fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) #define btrfs_info_rl(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) btrfs_printk_ratelimited(fs_info, KERN_INFO fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) #if defined(CONFIG_DYNAMIC_DEBUG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) #define btrfs_debug(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) _dynamic_func_call_no_desc(fmt, btrfs_printk, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) #define btrfs_debug_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) _dynamic_func_call_no_desc(fmt, btrfs_printk_in_rcu, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) #define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) _dynamic_func_call_no_desc(fmt, btrfs_printk_rl_in_rcu, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) #define btrfs_debug_rl(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) _dynamic_func_call_no_desc(fmt, btrfs_printk_ratelimited, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) #elif defined(DEBUG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) #define btrfs_debug(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) btrfs_printk(fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) #define btrfs_debug_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) btrfs_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) #define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) btrfs_printk_rl_in_rcu(fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) #define btrfs_debug_rl(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) btrfs_printk_ratelimited(fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) #define btrfs_debug(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) btrfs_no_printk(fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) #define btrfs_debug_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) btrfs_no_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) #define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) btrfs_no_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) #define btrfs_debug_rl(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) btrfs_no_printk(fs_info, KERN_DEBUG fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) #define btrfs_printk_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) rcu_read_lock(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) btrfs_printk(fs_info, fmt, ##args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) rcu_read_unlock(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) #define btrfs_no_printk_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) rcu_read_lock(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) btrfs_no_printk(fs_info, fmt, ##args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) rcu_read_unlock(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) #define btrfs_printk_ratelimited(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) static DEFINE_RATELIMIT_STATE(_rs, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) DEFAULT_RATELIMIT_INTERVAL, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) DEFAULT_RATELIMIT_BURST); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) if (__ratelimit(&_rs)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) btrfs_printk(fs_info, fmt, ##args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) #define btrfs_printk_rl_in_rcu(fs_info, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) rcu_read_lock(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) btrfs_printk_ratelimited(fs_info, fmt, ##args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) rcu_read_unlock(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) #ifdef CONFIG_BTRFS_ASSERT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) __cold __noreturn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) static inline void assertfail(const char *expr, const char *file, int line)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) pr_err("assertion failed: %s, in %s:%d\n", expr, file, line);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) #define ASSERT(expr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) (likely(expr) ? (void)0 : assertfail(#expr, __FILE__, __LINE__))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) static inline void assertfail(const char *expr, const char* file, int line) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) #define ASSERT(expr) (void)(expr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) * Use that for functions that are conditionally exported for sanity tests but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) * otherwise static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) #ifndef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) #define EXPORT_FOR_TESTS static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) #define EXPORT_FOR_TESTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) __cold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) static inline void btrfs_print_v0_err(struct btrfs_fs_info *fs_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) btrfs_err(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) "Unsupported V0 extent filesystem detected. Aborting. Please re-create your filesystem with a newer kernel");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) __printf(5, 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) __cold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) unsigned int line, int errno, const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) const char * __attribute_const__ btrfs_decode_error(int errno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) __cold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) void __btrfs_abort_transaction(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) const char *function,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) unsigned int line, int errno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) * Call btrfs_abort_transaction as early as possible when an error condition is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) * detected, that way the exact line number is reported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) #define btrfs_abort_transaction(trans, errno) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) /* Report first abort since mount */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) if (!test_and_set_bit(BTRFS_FS_STATE_TRANS_ABORTED, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) &((trans)->fs_info->fs_state))) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) if ((errno) != -EIO && (errno) != -EROFS) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) WARN(1, KERN_DEBUG \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) "BTRFS: Transaction aborted (error %d)\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) (errno)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) } else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) btrfs_debug((trans)->fs_info, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) "Transaction aborted (error %d)", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) (errno)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) __btrfs_abort_transaction((trans), __func__, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) __LINE__, (errno)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) #define btrfs_handle_fs_error(fs_info, errno, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) __btrfs_handle_fs_error((fs_info), __func__, __LINE__, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) (errno), fmt, ##args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) __printf(5, 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) __cold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) unsigned int line, int errno, const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) * If BTRFS_MOUNT_PANIC_ON_FATAL_ERROR is in mount_opt, __btrfs_panic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) * will panic(). Otherwise we BUG() here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) #define btrfs_panic(fs_info, errno, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) __btrfs_panic(fs_info, __func__, __LINE__, errno, fmt, ##args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) BUG(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) /* compatibility and incompatibility defines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) #define btrfs_set_fs_incompat(__fs_info, opt) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) __btrfs_set_fs_incompat((__fs_info), BTRFS_FEATURE_INCOMPAT_##opt, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) #opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) static inline void __btrfs_set_fs_incompat(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) u64 flag, const char* name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) struct btrfs_super_block *disk_super;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) u64 features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) disk_super = fs_info->super_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) features = btrfs_super_incompat_flags(disk_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) if (!(features & flag)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) spin_lock(&fs_info->super_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) features = btrfs_super_incompat_flags(disk_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) if (!(features & flag)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) features |= flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) btrfs_set_super_incompat_flags(disk_super, features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) btrfs_info(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) "setting incompat feature flag for %s (0x%llx)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) name, flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) spin_unlock(&fs_info->super_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) #define btrfs_clear_fs_incompat(__fs_info, opt) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) __btrfs_clear_fs_incompat((__fs_info), BTRFS_FEATURE_INCOMPAT_##opt, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) #opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) static inline void __btrfs_clear_fs_incompat(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) u64 flag, const char* name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) struct btrfs_super_block *disk_super;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) u64 features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) disk_super = fs_info->super_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) features = btrfs_super_incompat_flags(disk_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) if (features & flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) spin_lock(&fs_info->super_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) features = btrfs_super_incompat_flags(disk_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) if (features & flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) features &= ~flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) btrfs_set_super_incompat_flags(disk_super, features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) btrfs_info(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) "clearing incompat feature flag for %s (0x%llx)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) name, flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) spin_unlock(&fs_info->super_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) #define btrfs_fs_incompat(fs_info, opt) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) __btrfs_fs_incompat((fs_info), BTRFS_FEATURE_INCOMPAT_##opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) static inline bool __btrfs_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) struct btrfs_super_block *disk_super;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) disk_super = fs_info->super_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) return !!(btrfs_super_incompat_flags(disk_super) & flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) #define btrfs_set_fs_compat_ro(__fs_info, opt) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) __btrfs_set_fs_compat_ro((__fs_info), BTRFS_FEATURE_COMPAT_RO_##opt, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) #opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) static inline void __btrfs_set_fs_compat_ro(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) u64 flag, const char *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) struct btrfs_super_block *disk_super;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) u64 features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) disk_super = fs_info->super_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) features = btrfs_super_compat_ro_flags(disk_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) if (!(features & flag)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) spin_lock(&fs_info->super_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) features = btrfs_super_compat_ro_flags(disk_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) if (!(features & flag)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) features |= flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) btrfs_set_super_compat_ro_flags(disk_super, features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) btrfs_info(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) "setting compat-ro feature flag for %s (0x%llx)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) name, flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) spin_unlock(&fs_info->super_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) #define btrfs_clear_fs_compat_ro(__fs_info, opt) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) __btrfs_clear_fs_compat_ro((__fs_info), BTRFS_FEATURE_COMPAT_RO_##opt, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) #opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) static inline void __btrfs_clear_fs_compat_ro(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) u64 flag, const char *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) struct btrfs_super_block *disk_super;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) u64 features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) disk_super = fs_info->super_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) features = btrfs_super_compat_ro_flags(disk_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) if (features & flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) spin_lock(&fs_info->super_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) features = btrfs_super_compat_ro_flags(disk_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) if (features & flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) features &= ~flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) btrfs_set_super_compat_ro_flags(disk_super, features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) btrfs_info(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) "clearing compat-ro feature flag for %s (0x%llx)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) name, flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) spin_unlock(&fs_info->super_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) #define btrfs_fs_compat_ro(fs_info, opt) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) __btrfs_fs_compat_ro((fs_info), BTRFS_FEATURE_COMPAT_RO_##opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) static inline int __btrfs_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) struct btrfs_super_block *disk_super;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) disk_super = fs_info->super_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) return !!(btrfs_super_compat_ro_flags(disk_super) & flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) /* acl.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) #ifdef CONFIG_BTRFS_FS_POSIX_ACL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) struct posix_acl *btrfs_get_acl(struct inode *inode, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) int btrfs_init_acl(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) struct inode *inode, struct inode *dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) #define btrfs_get_acl NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) #define btrfs_set_acl NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510) static inline int btrfs_init_acl(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) struct inode *inode, struct inode *dir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) /* relocation.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) int btrfs_init_reloc_root(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) int btrfs_update_reloc_root(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) int btrfs_recover_relocation(struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) int btrfs_reloc_clone_csums(struct btrfs_inode *inode, u64 file_pos, u64 len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) int btrfs_reloc_cow_block(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) struct btrfs_root *root, struct extent_buffer *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) struct extent_buffer *cow);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) void btrfs_reloc_pre_snapshot(struct btrfs_pending_snapshot *pending,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) u64 *bytes_to_reserve);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) int btrfs_reloc_post_snapshot(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) struct btrfs_pending_snapshot *pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) int btrfs_should_cancel_balance(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) struct btrfs_root *find_reloc_root(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) u64 bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) int btrfs_should_ignore_reloc_root(struct btrfs_root *root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) /* scrub.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) u64 end, struct btrfs_scrub_progress *progress,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) int readonly, int is_dev_replace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) void btrfs_scrub_pause(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) void btrfs_scrub_continue(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) int btrfs_scrub_cancel(struct btrfs_fs_info *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) int btrfs_scrub_cancel_dev(struct btrfs_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) int btrfs_scrub_progress(struct btrfs_fs_info *fs_info, u64 devid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) struct btrfs_scrub_progress *progress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) static inline void btrfs_init_full_stripe_locks_tree(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) struct btrfs_full_stripe_locks_tree *locks_root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550) locks_root->root = RB_ROOT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) mutex_init(&locks_root->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) /* dev-replace.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) void btrfs_bio_counter_inc_blocked(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) void btrfs_bio_counter_inc_noblocked(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) void btrfs_bio_counter_sub(struct btrfs_fs_info *fs_info, s64 amount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) static inline void btrfs_bio_counter_dec(struct btrfs_fs_info *fs_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) btrfs_bio_counter_sub(fs_info, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) /* reada.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) struct reada_control {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) struct btrfs_fs_info *fs_info; /* tree to prefetch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567) struct btrfs_key key_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) struct btrfs_key key_end; /* exclusive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) atomic_t elems;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) struct kref refcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) wait_queue_head_t wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573) struct reada_control *btrfs_reada_add(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) struct btrfs_key *start, struct btrfs_key *end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575) int btrfs_reada_wait(void *handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) void btrfs_reada_detach(void *handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) int btree_readahead_hook(struct extent_buffer *eb, int err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) void btrfs_reada_remove_dev(struct btrfs_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) void btrfs_reada_undo_remove_dev(struct btrfs_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) static inline int is_fstree(u64 rootid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) if (rootid == BTRFS_FS_TREE_OBJECTID ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) ((s64)rootid >= (s64)BTRFS_FIRST_FREE_OBJECTID &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) !btrfs_qgroup_level(rootid)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) static inline int btrfs_defrag_cancelled(struct btrfs_fs_info *fs_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592) return signal_pending(current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) #define in_range(b, first, len) ((b) >= (first) && (b) < (first) + (len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) /* Sanity test specific functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) void btrfs_test_destroy_inode(struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) static inline int btrfs_is_testing(struct btrfs_fs_info *fs_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602) return test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605) static inline int btrfs_is_testing(struct btrfs_fs_info *fs_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) #endif