root/fs/btrfs/extent_map.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. extent_map_in_tree
  2. extent_map_end
  3. extent_map_block_end

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 
   3 #ifndef BTRFS_EXTENT_MAP_H
   4 #define BTRFS_EXTENT_MAP_H
   5 
   6 #include <linux/rbtree.h>
   7 #include <linux/refcount.h>
   8 
   9 #define EXTENT_MAP_LAST_BYTE ((u64)-4)
  10 #define EXTENT_MAP_HOLE ((u64)-3)
  11 #define EXTENT_MAP_INLINE ((u64)-2)
  12 /* used only during fiemap calls */
  13 #define EXTENT_MAP_DELALLOC ((u64)-1)
  14 
  15 /* bits for the extent_map::flags field */
  16 enum {
  17         /* this entry not yet on disk, don't free it */
  18         EXTENT_FLAG_PINNED,
  19         EXTENT_FLAG_COMPRESSED,
  20         /* pre-allocated extent */
  21         EXTENT_FLAG_PREALLOC,
  22         /* Logging this extent */
  23         EXTENT_FLAG_LOGGING,
  24         /* Filling in a preallocated extent */
  25         EXTENT_FLAG_FILLING,
  26         /* filesystem extent mapping type */
  27         EXTENT_FLAG_FS_MAPPING,
  28 };
  29 
  30 struct extent_map {
  31         struct rb_node rb_node;
  32 
  33         /* all of these are in bytes */
  34         u64 start;
  35         u64 len;
  36         u64 mod_start;
  37         u64 mod_len;
  38         u64 orig_start;
  39         u64 orig_block_len;
  40         u64 ram_bytes;
  41         u64 block_start;
  42         u64 block_len;
  43         u64 generation;
  44         unsigned long flags;
  45         union {
  46                 struct block_device *bdev;
  47 
  48                 /*
  49                  * used for chunk mappings
  50                  * flags & EXTENT_FLAG_FS_MAPPING must be set
  51                  */
  52                 struct map_lookup *map_lookup;
  53         };
  54         refcount_t refs;
  55         unsigned int compress_type;
  56         struct list_head list;
  57 };
  58 
  59 struct extent_map_tree {
  60         struct rb_root_cached map;
  61         struct list_head modified_extents;
  62         rwlock_t lock;
  63 };
  64 
  65 static inline int extent_map_in_tree(const struct extent_map *em)
  66 {
  67         return !RB_EMPTY_NODE(&em->rb_node);
  68 }
  69 
  70 static inline u64 extent_map_end(struct extent_map *em)
  71 {
  72         if (em->start + em->len < em->start)
  73                 return (u64)-1;
  74         return em->start + em->len;
  75 }
  76 
  77 static inline u64 extent_map_block_end(struct extent_map *em)
  78 {
  79         if (em->block_start + em->block_len < em->block_start)
  80                 return (u64)-1;
  81         return em->block_start + em->block_len;
  82 }
  83 
  84 void extent_map_tree_init(struct extent_map_tree *tree);
  85 struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
  86                                          u64 start, u64 len);
  87 int add_extent_mapping(struct extent_map_tree *tree,
  88                        struct extent_map *em, int modified);
  89 void remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em);
  90 void replace_extent_mapping(struct extent_map_tree *tree,
  91                             struct extent_map *cur,
  92                             struct extent_map *new,
  93                             int modified);
  94 
  95 struct extent_map *alloc_extent_map(void);
  96 void free_extent_map(struct extent_map *em);
  97 int __init extent_map_init(void);
  98 void __cold extent_map_exit(void);
  99 int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len, u64 gen);
 100 void clear_em_logging(struct extent_map_tree *tree, struct extent_map *em);
 101 struct extent_map *search_extent_mapping(struct extent_map_tree *tree,
 102                                          u64 start, u64 len);
 103 int btrfs_add_extent_mapping(struct btrfs_fs_info *fs_info,
 104                              struct extent_map_tree *em_tree,
 105                              struct extent_map **em_in, u64 start, u64 len);
 106 
 107 #endif

/* [<][>][^][v][top][bottom][index][help] */