1*9c7d3a54SJosef Bacik /* SPDX-License-Identifier: GPL-2.0 */ 2*9c7d3a54SJosef Bacik 3*9c7d3a54SJosef Bacik #ifndef BTRFS_EXTENT_IO_TREE_H 4*9c7d3a54SJosef Bacik #define BTRFS_EXTENT_IO_TREE_H 5*9c7d3a54SJosef Bacik 6*9c7d3a54SJosef Bacik struct extent_changeset; 7*9c7d3a54SJosef Bacik 8*9c7d3a54SJosef Bacik /* Bits for the extent state */ 9*9c7d3a54SJosef Bacik #define EXTENT_DIRTY (1U << 0) 10*9c7d3a54SJosef Bacik #define EXTENT_UPTODATE (1U << 1) 11*9c7d3a54SJosef Bacik #define EXTENT_LOCKED (1U << 2) 12*9c7d3a54SJosef Bacik #define EXTENT_NEW (1U << 3) 13*9c7d3a54SJosef Bacik #define EXTENT_DELALLOC (1U << 4) 14*9c7d3a54SJosef Bacik #define EXTENT_DEFRAG (1U << 5) 15*9c7d3a54SJosef Bacik #define EXTENT_BOUNDARY (1U << 6) 16*9c7d3a54SJosef Bacik #define EXTENT_NODATASUM (1U << 7) 17*9c7d3a54SJosef Bacik #define EXTENT_CLEAR_META_RESV (1U << 8) 18*9c7d3a54SJosef Bacik #define EXTENT_NEED_WAIT (1U << 9) 19*9c7d3a54SJosef Bacik #define EXTENT_DAMAGED (1U << 10) 20*9c7d3a54SJosef Bacik #define EXTENT_NORESERVE (1U << 11) 21*9c7d3a54SJosef Bacik #define EXTENT_QGROUP_RESERVED (1U << 12) 22*9c7d3a54SJosef Bacik #define EXTENT_CLEAR_DATA_RESV (1U << 13) 23*9c7d3a54SJosef Bacik #define EXTENT_DELALLOC_NEW (1U << 14) 24*9c7d3a54SJosef Bacik #define EXTENT_DO_ACCOUNTING (EXTENT_CLEAR_META_RESV | \ 25*9c7d3a54SJosef Bacik EXTENT_CLEAR_DATA_RESV) 26*9c7d3a54SJosef Bacik #define EXTENT_CTLBITS (EXTENT_DO_ACCOUNTING) 27*9c7d3a54SJosef Bacik 28*9c7d3a54SJosef Bacik /* 29*9c7d3a54SJosef Bacik * Redefined bits above which are used only in the device allocation tree, 30*9c7d3a54SJosef Bacik * shouldn't be using EXTENT_LOCKED / EXTENT_BOUNDARY / EXTENT_CLEAR_META_RESV 31*9c7d3a54SJosef Bacik * / EXTENT_CLEAR_DATA_RESV because they have special meaning to the bit 32*9c7d3a54SJosef Bacik * manipulation functions 33*9c7d3a54SJosef Bacik */ 34*9c7d3a54SJosef Bacik #define CHUNK_ALLOCATED EXTENT_DIRTY 35*9c7d3a54SJosef Bacik #define CHUNK_TRIMMED EXTENT_DEFRAG 36*9c7d3a54SJosef Bacik 37*9c7d3a54SJosef Bacik enum { 38*9c7d3a54SJosef Bacik IO_TREE_FS_INFO_FREED_EXTENTS0, 39*9c7d3a54SJosef Bacik IO_TREE_FS_INFO_FREED_EXTENTS1, 40*9c7d3a54SJosef Bacik IO_TREE_INODE_IO, 41*9c7d3a54SJosef Bacik IO_TREE_INODE_IO_FAILURE, 42*9c7d3a54SJosef Bacik IO_TREE_RELOC_BLOCKS, 43*9c7d3a54SJosef Bacik IO_TREE_TRANS_DIRTY_PAGES, 44*9c7d3a54SJosef Bacik IO_TREE_ROOT_DIRTY_LOG_PAGES, 45*9c7d3a54SJosef Bacik IO_TREE_SELFTEST, 46*9c7d3a54SJosef Bacik }; 47*9c7d3a54SJosef Bacik 48*9c7d3a54SJosef Bacik struct extent_io_tree { 49*9c7d3a54SJosef Bacik struct rb_root state; 50*9c7d3a54SJosef Bacik struct btrfs_fs_info *fs_info; 51*9c7d3a54SJosef Bacik void *private_data; 52*9c7d3a54SJosef Bacik u64 dirty_bytes; 53*9c7d3a54SJosef Bacik bool track_uptodate; 54*9c7d3a54SJosef Bacik 55*9c7d3a54SJosef Bacik /* Who owns this io tree, should be one of IO_TREE_* */ 56*9c7d3a54SJosef Bacik u8 owner; 57*9c7d3a54SJosef Bacik 58*9c7d3a54SJosef Bacik spinlock_t lock; 59*9c7d3a54SJosef Bacik const struct extent_io_ops *ops; 60*9c7d3a54SJosef Bacik }; 61*9c7d3a54SJosef Bacik 62*9c7d3a54SJosef Bacik struct extent_state { 63*9c7d3a54SJosef Bacik u64 start; 64*9c7d3a54SJosef Bacik u64 end; /* inclusive */ 65*9c7d3a54SJosef Bacik struct rb_node rb_node; 66*9c7d3a54SJosef Bacik 67*9c7d3a54SJosef Bacik /* ADD NEW ELEMENTS AFTER THIS */ 68*9c7d3a54SJosef Bacik wait_queue_head_t wq; 69*9c7d3a54SJosef Bacik refcount_t refs; 70*9c7d3a54SJosef Bacik unsigned state; 71*9c7d3a54SJosef Bacik 72*9c7d3a54SJosef Bacik struct io_failure_record *failrec; 73*9c7d3a54SJosef Bacik 74*9c7d3a54SJosef Bacik #ifdef CONFIG_BTRFS_DEBUG 75*9c7d3a54SJosef Bacik struct list_head leak_list; 76*9c7d3a54SJosef Bacik #endif 77*9c7d3a54SJosef Bacik }; 78*9c7d3a54SJosef Bacik 79*9c7d3a54SJosef Bacik int __init extent_state_cache_init(void); 80*9c7d3a54SJosef Bacik void __cold extent_state_cache_exit(void); 81*9c7d3a54SJosef Bacik 82*9c7d3a54SJosef Bacik void extent_io_tree_init(struct btrfs_fs_info *fs_info, 83*9c7d3a54SJosef Bacik struct extent_io_tree *tree, unsigned int owner, 84*9c7d3a54SJosef Bacik void *private_data); 85*9c7d3a54SJosef Bacik void extent_io_tree_release(struct extent_io_tree *tree); 86*9c7d3a54SJosef Bacik 87*9c7d3a54SJosef Bacik int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, 88*9c7d3a54SJosef Bacik struct extent_state **cached); 89*9c7d3a54SJosef Bacik 90*9c7d3a54SJosef Bacik static inline int lock_extent(struct extent_io_tree *tree, u64 start, u64 end) 91*9c7d3a54SJosef Bacik { 92*9c7d3a54SJosef Bacik return lock_extent_bits(tree, start, end, NULL); 93*9c7d3a54SJosef Bacik } 94*9c7d3a54SJosef Bacik 95*9c7d3a54SJosef Bacik int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end); 96*9c7d3a54SJosef Bacik 97*9c7d3a54SJosef Bacik int __init extent_io_init(void); 98*9c7d3a54SJosef Bacik void __cold extent_io_exit(void); 99*9c7d3a54SJosef Bacik 100*9c7d3a54SJosef Bacik u64 count_range_bits(struct extent_io_tree *tree, 101*9c7d3a54SJosef Bacik u64 *start, u64 search_end, 102*9c7d3a54SJosef Bacik u64 max_bytes, unsigned bits, int contig); 103*9c7d3a54SJosef Bacik 104*9c7d3a54SJosef Bacik void free_extent_state(struct extent_state *state); 105*9c7d3a54SJosef Bacik int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end, 106*9c7d3a54SJosef Bacik unsigned bits, int filled, 107*9c7d3a54SJosef Bacik struct extent_state *cached_state); 108*9c7d3a54SJosef Bacik int clear_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, 109*9c7d3a54SJosef Bacik unsigned bits, struct extent_changeset *changeset); 110*9c7d3a54SJosef Bacik int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, 111*9c7d3a54SJosef Bacik unsigned bits, int wake, int delete, 112*9c7d3a54SJosef Bacik struct extent_state **cached); 113*9c7d3a54SJosef Bacik int __clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, 114*9c7d3a54SJosef Bacik unsigned bits, int wake, int delete, 115*9c7d3a54SJosef Bacik struct extent_state **cached, gfp_t mask, 116*9c7d3a54SJosef Bacik struct extent_changeset *changeset); 117*9c7d3a54SJosef Bacik 118*9c7d3a54SJosef Bacik static inline int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end) 119*9c7d3a54SJosef Bacik { 120*9c7d3a54SJosef Bacik return clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, NULL); 121*9c7d3a54SJosef Bacik } 122*9c7d3a54SJosef Bacik 123*9c7d3a54SJosef Bacik static inline int unlock_extent_cached(struct extent_io_tree *tree, u64 start, 124*9c7d3a54SJosef Bacik u64 end, struct extent_state **cached) 125*9c7d3a54SJosef Bacik { 126*9c7d3a54SJosef Bacik return __clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, cached, 127*9c7d3a54SJosef Bacik GFP_NOFS, NULL); 128*9c7d3a54SJosef Bacik } 129*9c7d3a54SJosef Bacik 130*9c7d3a54SJosef Bacik static inline int unlock_extent_cached_atomic(struct extent_io_tree *tree, 131*9c7d3a54SJosef Bacik u64 start, u64 end, struct extent_state **cached) 132*9c7d3a54SJosef Bacik { 133*9c7d3a54SJosef Bacik return __clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, cached, 134*9c7d3a54SJosef Bacik GFP_ATOMIC, NULL); 135*9c7d3a54SJosef Bacik } 136*9c7d3a54SJosef Bacik 137*9c7d3a54SJosef Bacik static inline int clear_extent_bits(struct extent_io_tree *tree, u64 start, 138*9c7d3a54SJosef Bacik u64 end, unsigned bits) 139*9c7d3a54SJosef Bacik { 140*9c7d3a54SJosef Bacik int wake = 0; 141*9c7d3a54SJosef Bacik 142*9c7d3a54SJosef Bacik if (bits & EXTENT_LOCKED) 143*9c7d3a54SJosef Bacik wake = 1; 144*9c7d3a54SJosef Bacik 145*9c7d3a54SJosef Bacik return clear_extent_bit(tree, start, end, bits, wake, 0, NULL); 146*9c7d3a54SJosef Bacik } 147*9c7d3a54SJosef Bacik 148*9c7d3a54SJosef Bacik int set_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, 149*9c7d3a54SJosef Bacik unsigned bits, struct extent_changeset *changeset); 150*9c7d3a54SJosef Bacik int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, 151*9c7d3a54SJosef Bacik unsigned bits, u64 *failed_start, 152*9c7d3a54SJosef Bacik struct extent_state **cached_state, gfp_t mask); 153*9c7d3a54SJosef Bacik int set_extent_bits_nowait(struct extent_io_tree *tree, u64 start, u64 end, 154*9c7d3a54SJosef Bacik unsigned bits); 155*9c7d3a54SJosef Bacik 156*9c7d3a54SJosef Bacik static inline int set_extent_bits(struct extent_io_tree *tree, u64 start, 157*9c7d3a54SJosef Bacik u64 end, unsigned bits) 158*9c7d3a54SJosef Bacik { 159*9c7d3a54SJosef Bacik return set_extent_bit(tree, start, end, bits, NULL, NULL, GFP_NOFS); 160*9c7d3a54SJosef Bacik } 161*9c7d3a54SJosef Bacik 162*9c7d3a54SJosef Bacik static inline int clear_extent_uptodate(struct extent_io_tree *tree, u64 start, 163*9c7d3a54SJosef Bacik u64 end, struct extent_state **cached_state) 164*9c7d3a54SJosef Bacik { 165*9c7d3a54SJosef Bacik return __clear_extent_bit(tree, start, end, EXTENT_UPTODATE, 0, 0, 166*9c7d3a54SJosef Bacik cached_state, GFP_NOFS, NULL); 167*9c7d3a54SJosef Bacik } 168*9c7d3a54SJosef Bacik 169*9c7d3a54SJosef Bacik static inline int set_extent_dirty(struct extent_io_tree *tree, u64 start, 170*9c7d3a54SJosef Bacik u64 end, gfp_t mask) 171*9c7d3a54SJosef Bacik { 172*9c7d3a54SJosef Bacik return set_extent_bit(tree, start, end, EXTENT_DIRTY, NULL, 173*9c7d3a54SJosef Bacik NULL, mask); 174*9c7d3a54SJosef Bacik } 175*9c7d3a54SJosef Bacik 176*9c7d3a54SJosef Bacik static inline int clear_extent_dirty(struct extent_io_tree *tree, u64 start, 177*9c7d3a54SJosef Bacik u64 end, struct extent_state **cached) 178*9c7d3a54SJosef Bacik { 179*9c7d3a54SJosef Bacik return clear_extent_bit(tree, start, end, 180*9c7d3a54SJosef Bacik EXTENT_DIRTY | EXTENT_DELALLOC | 181*9c7d3a54SJosef Bacik EXTENT_DO_ACCOUNTING, 0, 0, cached); 182*9c7d3a54SJosef Bacik } 183*9c7d3a54SJosef Bacik 184*9c7d3a54SJosef Bacik int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, 185*9c7d3a54SJosef Bacik unsigned bits, unsigned clear_bits, 186*9c7d3a54SJosef Bacik struct extent_state **cached_state); 187*9c7d3a54SJosef Bacik 188*9c7d3a54SJosef Bacik static inline int set_extent_delalloc(struct extent_io_tree *tree, u64 start, 189*9c7d3a54SJosef Bacik u64 end, unsigned int extra_bits, 190*9c7d3a54SJosef Bacik struct extent_state **cached_state) 191*9c7d3a54SJosef Bacik { 192*9c7d3a54SJosef Bacik return set_extent_bit(tree, start, end, 193*9c7d3a54SJosef Bacik EXTENT_DELALLOC | EXTENT_UPTODATE | extra_bits, 194*9c7d3a54SJosef Bacik NULL, cached_state, GFP_NOFS); 195*9c7d3a54SJosef Bacik } 196*9c7d3a54SJosef Bacik 197*9c7d3a54SJosef Bacik static inline int set_extent_defrag(struct extent_io_tree *tree, u64 start, 198*9c7d3a54SJosef Bacik u64 end, struct extent_state **cached_state) 199*9c7d3a54SJosef Bacik { 200*9c7d3a54SJosef Bacik return set_extent_bit(tree, start, end, 201*9c7d3a54SJosef Bacik EXTENT_DELALLOC | EXTENT_UPTODATE | EXTENT_DEFRAG, 202*9c7d3a54SJosef Bacik NULL, cached_state, GFP_NOFS); 203*9c7d3a54SJosef Bacik } 204*9c7d3a54SJosef Bacik 205*9c7d3a54SJosef Bacik static inline int set_extent_new(struct extent_io_tree *tree, u64 start, 206*9c7d3a54SJosef Bacik u64 end) 207*9c7d3a54SJosef Bacik { 208*9c7d3a54SJosef Bacik return set_extent_bit(tree, start, end, EXTENT_NEW, NULL, NULL, 209*9c7d3a54SJosef Bacik GFP_NOFS); 210*9c7d3a54SJosef Bacik } 211*9c7d3a54SJosef Bacik 212*9c7d3a54SJosef Bacik static inline int set_extent_uptodate(struct extent_io_tree *tree, u64 start, 213*9c7d3a54SJosef Bacik u64 end, struct extent_state **cached_state, gfp_t mask) 214*9c7d3a54SJosef Bacik { 215*9c7d3a54SJosef Bacik return set_extent_bit(tree, start, end, EXTENT_UPTODATE, NULL, 216*9c7d3a54SJosef Bacik cached_state, mask); 217*9c7d3a54SJosef Bacik } 218*9c7d3a54SJosef Bacik 219*9c7d3a54SJosef Bacik int find_first_extent_bit(struct extent_io_tree *tree, u64 start, 220*9c7d3a54SJosef Bacik u64 *start_ret, u64 *end_ret, unsigned bits, 221*9c7d3a54SJosef Bacik struct extent_state **cached_state); 222*9c7d3a54SJosef Bacik void find_first_clear_extent_bit(struct extent_io_tree *tree, u64 start, 223*9c7d3a54SJosef Bacik u64 *start_ret, u64 *end_ret, unsigned bits); 224*9c7d3a54SJosef Bacik int extent_invalidatepage(struct extent_io_tree *tree, 225*9c7d3a54SJosef Bacik struct page *page, unsigned long offset); 226*9c7d3a54SJosef Bacik 227*9c7d3a54SJosef Bacik #endif /* BTRFS_EXTENT_IO_TREE_H */ 228