btrfs: unify tree search helper returning prev and next nodes

Simplify helper to return only next and prev pointers, we don't need all
the node/parent/prev/next pointers of __etree_search as there are now
other specialized helpers. Rename parameters so they follow the naming.

Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba 2020-06-25 19:03:41 +02:00
parent ec60c76f53
commit 9db33891c7
1 changed files with 69 additions and 67 deletions

View File

@ -374,75 +374,21 @@ void free_extent_state(struct extent_state *state)
* *
* @tree: the tree to search * @tree: the tree to search
* @offset: offset that should fall within an entry in @tree * @offset: offset that should fall within an entry in @tree
* @next_ret: pointer to the first entry whose range ends after @offset * @node_ret: pointer where new node should be anchored (used when inserting an
* @prev_ret: pointer to the first entry whose range begins before @offset
* @p_ret: pointer where new node should be anchored (used when inserting an
* entry in the tree) * entry in the tree)
* @parent_ret: points to entry which would have been the parent of the entry, * @parent_ret: points to entry which would have been the parent of the entry,
* containing @offset * containing @offset
* *
* This function returns a pointer to the entry that contains @offset byte * Return a pointer to the entry that contains @offset byte address and don't change
* address. If no such entry exists, then NULL is returned and the other * @node_ret and @parent_ret.
* pointer arguments to the function are filled, otherwise the found entry is *
* returned and other pointers are left untouched. * 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 struct rb_node *__etree_search(struct extent_io_tree *tree, u64 offset, static inline struct rb_node *tree_search_for_insert(struct extent_io_tree *tree,
struct rb_node **next_ret, u64 offset,
struct rb_node **prev_ret, struct rb_node ***node_ret,
struct rb_node ***p_ret, struct rb_node **parent_ret)
struct rb_node **parent_ret)
{
struct rb_root *root = &tree->state;
struct rb_node **n = &root->rb_node;
struct rb_node *prev = NULL;
struct rb_node *orig_prev = NULL;
struct tree_entry *entry;
struct tree_entry *prev_entry = NULL;
while (*n) {
prev = *n;
entry = rb_entry(prev, struct tree_entry, rb_node);
prev_entry = entry;
if (offset < entry->start)
n = &(*n)->rb_left;
else if (offset > entry->end)
n = &(*n)->rb_right;
else
return *n;
}
if (p_ret)
*p_ret = n;
if (parent_ret)
*parent_ret = prev;
if (next_ret) {
orig_prev = prev;
while (prev && offset > prev_entry->end) {
prev = rb_next(prev);
prev_entry = rb_entry(prev, struct tree_entry, rb_node);
}
*next_ret = prev;
prev = orig_prev;
}
if (prev_ret) {
prev_entry = rb_entry(prev, struct tree_entry, rb_node);
while (prev && offset < prev_entry->start) {
prev = rb_prev(prev);
prev_entry = rb_entry(prev, struct tree_entry, rb_node);
}
*prev_ret = prev;
}
return NULL;
}
static inline struct rb_node *
tree_search_for_insert(struct extent_io_tree *tree,
u64 offset,
struct rb_node ***p_ret,
struct rb_node **parent_ret)
{ {
struct rb_root *root = &tree->state; struct rb_root *root = &tree->state;
struct rb_node **node = &root->rb_node; struct rb_node **node = &root->rb_node;
@ -461,8 +407,8 @@ tree_search_for_insert(struct extent_io_tree *tree,
return *node; return *node;
} }
if (p_ret) if (node_ret)
*p_ret = node; *node_ret = node;
if (parent_ret) if (parent_ret)
*parent_ret = prev; *parent_ret = prev;
@ -483,6 +429,62 @@ static inline struct rb_node *tree_search(struct extent_io_tree *tree, u64 offse
return tree_search_for_insert(tree, offset, NULL, NULL); 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. * utility function to look for merge candidates inside a given range.
* Any extents with matching state are merged together into a single * Any extents with matching state are merged together into a single
@ -1686,7 +1688,7 @@ void find_first_clear_extent_bit(struct extent_io_tree *tree, u64 start,
/* Find first extent with bits cleared */ /* Find first extent with bits cleared */
while (1) { while (1) {
node = __etree_search(tree, start, &next, &prev, NULL, NULL); node = tree_search_prev_next(tree, start, &prev, &next);
if (!node && !next && !prev) { if (!node && !next && !prev) {
/* /*
* Tree is completely empty, send full range and let * Tree is completely empty, send full range and let