]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: temporarily export and move core extent_io_tree tree functions
authorJosef Bacik <josef@toxicpanda.com>
Fri, 9 Sep 2022 21:53:26 +0000 (17:53 -0400)
committerDavid Sterba <dsterba@suse.com>
Mon, 26 Sep 2022 10:28:03 +0000 (12:28 +0200)
A lot of the various internals of extent_io_tree call these two
functions for insert or searching the rb tree for entries, so
temporarily export them and then move them to extent-io-tree.c.  We
can't move tree_search() without renaming it, and I don't want to
introduce a bunch of churn just to do that, so move these functions
first and then we can move a few big functions and then the remaining
users of tree_search().

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent-io-tree.c
fs/btrfs/extent-io-tree.h
fs/btrfs/extent_io.c

index b487a9e4aaa78b500f0ceeec8d41f277ad1838be..8dd03ac86d26a7f088d1b8fbb25c964f061f97dd 100644 (file)
@@ -161,6 +161,113 @@ void free_extent_state(struct extent_state *state)
        }
 }
 
+/*
+ * Search @tree for an entry that contains @offset. Such entry would have
+ * entry->start <= offset && entry->end >= offset.
+ *
+ * @tree:       the tree to search
+ * @offset:     offset that should fall within an entry in @tree
+ * @node_ret:   pointer where new node should be anchored (used when inserting an
+ *             entry in the tree)
+ * @parent_ret: points to entry which would have been the parent of the entry,
+ *               containing @offset
+ *
+ * Return a pointer to the entry that contains @offset byte address and don't change
+ * @node_ret and @parent_ret.
+ *
+ * If no such entry exists, return pointer to entry that ends before @offset
+ * and fill parameters @node_ret and @parent_ret, ie. does not return NULL.
+ */
+struct rb_node *tree_search_for_insert(struct extent_io_tree *tree, u64 offset,
+                                      struct rb_node ***node_ret,
+                                      struct rb_node **parent_ret)
+{
+       struct rb_root *root = &tree->state;
+       struct rb_node **node = &root->rb_node;
+       struct rb_node *prev = NULL;
+       struct tree_entry *entry;
+
+       while (*node) {
+               prev = *node;
+               entry = rb_entry(prev, struct tree_entry, rb_node);
+
+               if (offset < entry->start)
+                       node = &(*node)->rb_left;
+               else if (offset > entry->end)
+                       node = &(*node)->rb_right;
+               else
+                       return *node;
+       }
+
+       if (node_ret)
+               *node_ret = node;
+       if (parent_ret)
+               *parent_ret = prev;
+
+       /* Search neighbors until we find the first one past the end */
+       while (prev && offset > entry->end) {
+               prev = rb_next(prev);
+               entry = rb_entry(prev, struct tree_entry, rb_node);
+       }
+
+       return prev;
+}
+
+/*
+ * Search offset in the tree or fill neighbor rbtree node pointers.
+ *
+ * @tree:      the tree to search
+ * @offset:    offset that should fall within an entry in @tree
+ * @next_ret:  pointer to the first entry whose range ends after @offset
+ * @prev_ret:  pointer to the first entry whose range begins before @offset
+ *
+ * Return a pointer to the entry that contains @offset byte address. If no
+ * such entry exists, then return NULL and fill @prev_ret and @next_ret.
+ * Otherwise return the found entry and other pointers are left untouched.
+ */
+struct rb_node *tree_search_prev_next(struct extent_io_tree *tree, u64 offset,
+                                     struct rb_node **prev_ret,
+                                     struct rb_node **next_ret)
+{
+       struct rb_root *root = &tree->state;
+       struct rb_node **node = &root->rb_node;
+       struct rb_node *prev = NULL;
+       struct rb_node *orig_prev = NULL;
+       struct tree_entry *entry;
+
+       ASSERT(prev_ret);
+       ASSERT(next_ret);
+
+       while (*node) {
+               prev = *node;
+               entry = rb_entry(prev, struct tree_entry, rb_node);
+
+               if (offset < entry->start)
+                       node = &(*node)->rb_left;
+               else if (offset > entry->end)
+                       node = &(*node)->rb_right;
+               else
+                       return *node;
+       }
+
+       orig_prev = prev;
+       while (prev && offset > entry->end) {
+               prev = rb_next(prev);
+               entry = rb_entry(prev, struct tree_entry, rb_node);
+       }
+       *next_ret = prev;
+       prev = orig_prev;
+
+       entry = rb_entry(prev, struct tree_entry, rb_node);
+       while (prev && offset < entry->start) {
+               prev = rb_prev(prev);
+               entry = rb_entry(prev, struct tree_entry, rb_node);
+       }
+       *prev_ret = prev;
+
+       return NULL;
+}
+
 /* Wrappers around set/clear extent bit */
 int set_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
                           u32 bits, struct extent_changeset *changeset)
index d9c1bb70d76b2f21d78ff3b0c4104b290043b276..ce07432954b4e6b25d3e641d1b862d1e08a24b89 100644 (file)
@@ -279,4 +279,17 @@ void __btrfs_debug_check_extent_io_range(const char *caller,
 #define btrfs_debug_check_extent_io_range(c, s, e)     do {} while (0)
 #endif
 
+struct tree_entry {
+       u64 start;
+       u64 end;
+       struct rb_node rb_node;
+};
+
+struct rb_node *tree_search_for_insert(struct extent_io_tree *tree, u64 offset,
+                                      struct rb_node ***node_ret,
+                                      struct rb_node **parent_ret);
+struct rb_node *tree_search_prev_next(struct extent_io_tree *tree, u64 offset,
+                                     struct rb_node **prev_ret,
+                                     struct rb_node **next_ret);
+
 #endif /* BTRFS_EXTENT_IO_TREE_H */
index 70f565ea7ec4402b9e2e24689071554847c9da0a..e3fb387524696478b15ccfcbc9190a245d98c886 100644 (file)
@@ -85,12 +85,6 @@ void btrfs_extent_buffer_leak_debug_check(struct btrfs_fs_info *fs_info)
 #define btrfs_leak_debug_del_eb(eb)                    do {} while (0)
 #endif
 
-struct tree_entry {
-       u64 start;
-       u64 end;
-       struct rb_node rb_node;
-};
-
 /*
  * Structure to record info about the bio being assembled, and other info like
  * how many bytes are there before stripe/ordered extent boundary.
@@ -205,59 +199,6 @@ void __cold extent_buffer_free_cachep(void)
        kmem_cache_destroy(extent_buffer_cache);
 }
 
-/**
- * Search @tree for an entry that contains @offset. Such entry would have
- * entry->start <= offset && entry->end >= offset.
- *
- * @tree:       the tree to search
- * @offset:     offset that should fall within an entry in @tree
- * @node_ret:   pointer where new node should be anchored (used when inserting an
- *             entry in the tree)
- * @parent_ret: points to entry which would have been the parent of the entry,
- *               containing @offset
- *
- * Return a pointer to the entry that contains @offset byte address and don't change
- * @node_ret and @parent_ret.
- *
- * If no such entry exists, return pointer to entry that ends before @offset
- * and fill parameters @node_ret and @parent_ret, ie. does not return NULL.
- */
-static inline struct rb_node *tree_search_for_insert(struct extent_io_tree *tree,
-                                                    u64 offset,
-                                                    struct rb_node ***node_ret,
-                                                    struct rb_node **parent_ret)
-{
-       struct rb_root *root = &tree->state;
-       struct rb_node **node = &root->rb_node;
-       struct rb_node *prev = NULL;
-       struct tree_entry *entry;
-
-       while (*node) {
-               prev = *node;
-               entry = rb_entry(prev, struct tree_entry, rb_node);
-
-               if (offset < entry->start)
-                       node = &(*node)->rb_left;
-               else if (offset > entry->end)
-                       node = &(*node)->rb_right;
-               else
-                       return *node;
-       }
-
-       if (node_ret)
-               *node_ret = node;
-       if (parent_ret)
-               *parent_ret = prev;
-
-       /* Search neighbors until we find the first one past the end */
-       while (prev && offset > entry->end) {
-               prev = rb_next(prev);
-               entry = rb_entry(prev, struct tree_entry, rb_node);
-       }
-
-       return prev;
-}
-
 /*
  * Inexact rb-tree search, return the next entry if @offset is not found
  */
@@ -266,62 +207,6 @@ static inline struct rb_node *tree_search(struct extent_io_tree *tree, u64 offse
        return tree_search_for_insert(tree, offset, NULL, NULL);
 }
 
-/**
- * Search offset in the tree or fill neighbor rbtree node pointers.
- *
- * @tree:      the tree to search
- * @offset:    offset that should fall within an entry in @tree
- * @next_ret:  pointer to the first entry whose range ends after @offset
- * @prev_ret:  pointer to the first entry whose range begins before @offset
- *
- * Return a pointer to the entry that contains @offset byte address. If no
- * such entry exists, then return NULL and fill @prev_ret and @next_ret.
- * Otherwise return the found entry and other pointers are left untouched.
- */
-static struct rb_node *tree_search_prev_next(struct extent_io_tree *tree,
-                                            u64 offset,
-                                            struct rb_node **prev_ret,
-                                            struct rb_node **next_ret)
-{
-       struct rb_root *root = &tree->state;
-       struct rb_node **node = &root->rb_node;
-       struct rb_node *prev = NULL;
-       struct rb_node *orig_prev = NULL;
-       struct tree_entry *entry;
-
-       ASSERT(prev_ret);
-       ASSERT(next_ret);
-
-       while (*node) {
-               prev = *node;
-               entry = rb_entry(prev, struct tree_entry, rb_node);
-
-               if (offset < entry->start)
-                       node = &(*node)->rb_left;
-               else if (offset > entry->end)
-                       node = &(*node)->rb_right;
-               else
-                       return *node;
-       }
-
-       orig_prev = prev;
-       while (prev && offset > entry->end) {
-               prev = rb_next(prev);
-               entry = rb_entry(prev, struct tree_entry, rb_node);
-       }
-       *next_ret = prev;
-       prev = orig_prev;
-
-       entry = rb_entry(prev, struct tree_entry, rb_node);
-       while (prev && offset < entry->start) {
-               prev = rb_prev(prev);
-               entry = rb_entry(prev, struct tree_entry, rb_node);
-       }
-       *prev_ret = prev;
-
-       return NULL;
-}
-
 /*
  * utility function to look for merge candidates inside a given range.
  * Any extents with matching state are merged together into a single