summaryrefslogtreecommitdiff
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2020-06-25 18:35:24 +0200
committerDavid Sterba <dsterba@suse.com>2022-07-25 17:45:35 +0200
commitbebb22c13dc147aa80cd5c9d397d286f133fabb1 (patch)
tree304ae04425d2f88bf882eccae9fe8022d2034892 /fs/btrfs/extent_io.c
parentc367602a78a24dae5444d2810e94aa8dc6338ac2 (diff)
downloadlwn-bebb22c13dc147aa80cd5c9d397d286f133fabb1.tar.gz
lwn-bebb22c13dc147aa80cd5c9d397d286f133fabb1.zip
btrfs: open code inexact rbtree search in tree_search
The call chain from tree_search tree_search_for_insert __etree_search can be open coded and allow further simplifications, here we need a tree search with fallback to the next node in case it's not found. This is represented as __etree_search parameters next_ret=valid, prev_ret=NULL. Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r--fs/btrfs/extent_io.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 29e6ec7dfc2c..ee84474fcf7e 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -453,10 +453,35 @@ tree_search_for_insert(struct extent_io_tree *tree,
return ret;
}
-static inline struct rb_node *tree_search(struct extent_io_tree *tree,
- u64 offset)
+/*
+ * Inexact rb-tree search, return the next entry if @offset is not found
+ */
+static inline struct rb_node *tree_search(struct extent_io_tree *tree, u64 offset)
{
- return tree_search_for_insert(tree, offset, NULL, NULL);
+ 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;
+ }
+
+ /* 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;
}
/*