Skip to content

Commit 6c05813

Browse files
fdmananakdave
authored andcommitted
btrfs: remove unnecessary next extent map search
At __tree_search(), and its single caller __lookup_extent_mapping(), there is no point in finding the next extent map that starts after the search offset if we were able to find the previous extent map that ends before our search offset, because __lookup_extent_mapping() ignores the next acceptable extent map if we were able to find the previous one. So just return immediately if we were able to find the previous extent map, therefore avoiding wasting time iterating the tree looking for the next extent map which will not be used by __lookup_extent_mapping(). Signed-off-by: Filipe Manana <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 08f088d commit 6c05813

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

fs/btrfs/extent_map.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -141,17 +141,15 @@ static int tree_insert(struct rb_root_cached *root, struct extent_map *em)
141141
* it can't be found, try to find some neighboring extents
142142
*/
143143
static struct rb_node *__tree_search(struct rb_root *root, u64 offset,
144-
struct rb_node **prev_ret,
145-
struct rb_node **next_ret)
144+
struct rb_node **prev_or_next_ret)
146145
{
147146
struct rb_node *n = root->rb_node;
148147
struct rb_node *prev = NULL;
149148
struct rb_node *orig_prev = NULL;
150149
struct extent_map *entry;
151150
struct extent_map *prev_entry = NULL;
152151

153-
ASSERT(prev_ret);
154-
ASSERT(next_ret);
152+
ASSERT(prev_or_next_ret);
155153

156154
while (n) {
157155
entry = rb_entry(n, struct extent_map, rb_node);
@@ -171,15 +169,23 @@ static struct rb_node *__tree_search(struct rb_root *root, u64 offset,
171169
prev = rb_next(prev);
172170
prev_entry = rb_entry(prev, struct extent_map, rb_node);
173171
}
174-
*prev_ret = prev;
175-
prev = orig_prev;
176172

173+
/*
174+
* Previous extent map found, return as in this case the caller does not
175+
* care about the next one.
176+
*/
177+
if (prev) {
178+
*prev_or_next_ret = prev;
179+
return NULL;
180+
}
181+
182+
prev = orig_prev;
177183
prev_entry = rb_entry(prev, struct extent_map, rb_node);
178184
while (prev && offset < prev_entry->start) {
179185
prev = rb_prev(prev);
180186
prev_entry = rb_entry(prev, struct extent_map, rb_node);
181187
}
182-
*next_ret = prev;
188+
*prev_or_next_ret = prev;
183189

184190
return NULL;
185191
}
@@ -425,16 +431,13 @@ __lookup_extent_mapping(struct extent_map_tree *tree,
425431
{
426432
struct extent_map *em;
427433
struct rb_node *rb_node;
428-
struct rb_node *prev = NULL;
429-
struct rb_node *next = NULL;
434+
struct rb_node *prev_or_next = NULL;
430435
u64 end = range_end(start, len);
431436

432-
rb_node = __tree_search(&tree->map.rb_root, start, &prev, &next);
437+
rb_node = __tree_search(&tree->map.rb_root, start, &prev_or_next);
433438
if (!rb_node) {
434-
if (prev)
435-
rb_node = prev;
436-
else if (next)
437-
rb_node = next;
439+
if (prev_or_next)
440+
rb_node = prev_or_next;
438441
else
439442
return NULL;
440443
}

0 commit comments

Comments
 (0)