Skip to content

Commit

Permalink
Btrfs: clean up code for merging extent maps
Browse files Browse the repository at this point in the history
unpin_extent_cache() and add_extent_mapping() shares the same code
that merges extent maps.

Signed-off-by: Li Zefan <[email protected]>
Signed-off-by: Chris Mason <[email protected]>
  • Loading branch information
Li Zefan authored and chrismason-xx committed Aug 1, 2011
1 parent ed64f06 commit 4d2c8f6
Showing 1 changed file with 21 additions and 38 deletions.
59 changes: 21 additions & 38 deletions fs/btrfs/extent_map.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,22 +183,10 @@ static int mergable_maps(struct extent_map *prev, struct extent_map *next)
return 0;
}

int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len)
static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em)
{
int ret = 0;
struct extent_map *merge = NULL;
struct rb_node *rb;
struct extent_map *em;

write_lock(&tree->lock);
em = lookup_extent_mapping(tree, start, len);

WARN_ON(!em || em->start != start);

if (!em)
goto out;

clear_bit(EXTENT_FLAG_PINNED, &em->flags);

if (em->start != 0) {
rb = rb_prev(&em->rb_node);
Expand All @@ -225,6 +213,24 @@ int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len)
merge->in_tree = 0;
free_extent_map(merge);
}
}

int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len)
{
int ret = 0;
struct extent_map *em;

write_lock(&tree->lock);
em = lookup_extent_mapping(tree, start, len);

WARN_ON(!em || em->start != start);

if (!em)
goto out;

clear_bit(EXTENT_FLAG_PINNED, &em->flags);

try_merge_map(tree, em);

free_extent_map(em);
out:
Expand All @@ -247,7 +253,6 @@ int add_extent_mapping(struct extent_map_tree *tree,
struct extent_map *em)
{
int ret = 0;
struct extent_map *merge = NULL;
struct rb_node *rb;
struct extent_map *exist;

Expand All @@ -263,30 +268,8 @@ int add_extent_mapping(struct extent_map_tree *tree,
goto out;
}
atomic_inc(&em->refs);
if (em->start != 0) {
rb = rb_prev(&em->rb_node);
if (rb)
merge = rb_entry(rb, struct extent_map, rb_node);
if (rb && mergable_maps(merge, em)) {
em->start = merge->start;
em->len += merge->len;
em->block_len += merge->block_len;
em->block_start = merge->block_start;
merge->in_tree = 0;
rb_erase(&merge->rb_node, &tree->map);
free_extent_map(merge);
}
}
rb = rb_next(&em->rb_node);
if (rb)
merge = rb_entry(rb, struct extent_map, rb_node);
if (rb && mergable_maps(em, merge)) {
em->len += merge->len;
em->block_len += merge->len;
rb_erase(&merge->rb_node, &tree->map);
merge->in_tree = 0;
free_extent_map(merge);
}

try_merge_map(tree, em);
out:
return ret;
}
Expand Down

0 comments on commit 4d2c8f6

Please sign in to comment.