Btrfs: clean up code for extent_map lookup
lookup_extent_map() and search_extent_map() can share most of code. Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
7e016a038e
commit
ed64f06652
|
@ -299,6 +299,34 @@ static u64 range_end(u64 start, u64 len)
|
|||
return start + len;
|
||||
}
|
||||
|
||||
struct extent_map *__lookup_extent_mapping(struct extent_map_tree *tree,
|
||||
u64 start, u64 len, int strict)
|
||||
{
|
||||
struct extent_map *em;
|
||||
struct rb_node *rb_node;
|
||||
struct rb_node *prev = NULL;
|
||||
struct rb_node *next = NULL;
|
||||
u64 end = range_end(start, len);
|
||||
|
||||
rb_node = __tree_search(&tree->map, start, &prev, &next);
|
||||
if (!rb_node) {
|
||||
if (prev)
|
||||
rb_node = prev;
|
||||
else if (next)
|
||||
rb_node = next;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
em = rb_entry(rb_node, struct extent_map, rb_node);
|
||||
|
||||
if (strict && !(end > em->start && start < extent_map_end(em)))
|
||||
return NULL;
|
||||
|
||||
atomic_inc(&em->refs);
|
||||
return em;
|
||||
}
|
||||
|
||||
/**
|
||||
* lookup_extent_mapping - lookup extent_map
|
||||
* @tree: tree to lookup in
|
||||
|
@ -313,42 +341,7 @@ static u64 range_end(u64 start, u64 len)
|
|||
struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
|
||||
u64 start, u64 len)
|
||||
{
|
||||
struct extent_map *em;
|
||||
struct rb_node *rb_node;
|
||||
struct rb_node *prev = NULL;
|
||||
struct rb_node *next = NULL;
|
||||
u64 end = range_end(start, len);
|
||||
|
||||
rb_node = __tree_search(&tree->map, start, &prev, &next);
|
||||
if (!rb_node && prev) {
|
||||
em = rb_entry(prev, struct extent_map, rb_node);
|
||||
if (end > em->start && start < extent_map_end(em))
|
||||
goto found;
|
||||
}
|
||||
if (!rb_node && next) {
|
||||
em = rb_entry(next, struct extent_map, rb_node);
|
||||
if (end > em->start && start < extent_map_end(em))
|
||||
goto found;
|
||||
}
|
||||
if (!rb_node) {
|
||||
em = NULL;
|
||||
goto out;
|
||||
}
|
||||
if (IS_ERR(rb_node)) {
|
||||
em = ERR_CAST(rb_node);
|
||||
goto out;
|
||||
}
|
||||
em = rb_entry(rb_node, struct extent_map, rb_node);
|
||||
if (end > em->start && start < extent_map_end(em))
|
||||
goto found;
|
||||
|
||||
em = NULL;
|
||||
goto out;
|
||||
|
||||
found:
|
||||
atomic_inc(&em->refs);
|
||||
out:
|
||||
return em;
|
||||
return __lookup_extent_mapping(tree, start, len, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -365,27 +358,7 @@ out:
|
|||
struct extent_map *search_extent_mapping(struct extent_map_tree *tree,
|
||||
u64 start, u64 len)
|
||||
{
|
||||
struct extent_map *em;
|
||||
struct rb_node *rb_node;
|
||||
struct rb_node *prev = NULL;
|
||||
struct rb_node *next = NULL;
|
||||
|
||||
rb_node = __tree_search(&tree->map, start, &prev, &next);
|
||||
if (!rb_node && prev) {
|
||||
em = rb_entry(prev, struct extent_map, rb_node);
|
||||
goto found;
|
||||
}
|
||||
if (!rb_node && next) {
|
||||
em = rb_entry(next, struct extent_map, rb_node);
|
||||
goto found;
|
||||
}
|
||||
if (!rb_node)
|
||||
return NULL;
|
||||
|
||||
em = rb_entry(rb_node, struct extent_map, rb_node);
|
||||
found:
|
||||
atomic_inc(&em->refs);
|
||||
return em;
|
||||
return __lookup_extent_mapping(tree, start, len, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue