Commit e63b81ae authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba

btrfs: use next_state/prev_state in merge_state

We use rb_next/rb_prev and then get the entry for the adjacent items in
an extent io tree.  We have helpers for this, so convert merge_state to
use next_state/prev_state and simplify the code.
Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 43b068ca
...@@ -340,40 +340,31 @@ static void extent_io_tree_panic(struct extent_io_tree *tree, int err) ...@@ -340,40 +340,31 @@ static void extent_io_tree_panic(struct extent_io_tree *tree, int err)
static void merge_state(struct extent_io_tree *tree, struct extent_state *state) static void merge_state(struct extent_io_tree *tree, struct extent_state *state)
{ {
struct extent_state *other; struct extent_state *other;
struct rb_node *other_node;
if (state->state & (EXTENT_LOCKED | EXTENT_BOUNDARY)) if (state->state & (EXTENT_LOCKED | EXTENT_BOUNDARY))
return; return;
other_node = rb_prev(&state->rb_node); other = prev_state(state);
if (other_node) { if (other && other->end == state->start - 1 &&
other = rb_entry(other_node, struct extent_state, rb_node); other->state == state->state) {
if (other->end == state->start - 1 && if (tree->private_data && is_data_inode(tree->private_data))
other->state == state->state) { btrfs_merge_delalloc_extent(tree->private_data,
if (tree->private_data && state, other);
is_data_inode(tree->private_data)) state->start = other->start;
btrfs_merge_delalloc_extent(tree->private_data, rb_erase(&other->rb_node, &tree->state);
state, other); RB_CLEAR_NODE(&other->rb_node);
state->start = other->start; free_extent_state(other);
rb_erase(&other->rb_node, &tree->state);
RB_CLEAR_NODE(&other->rb_node);
free_extent_state(other);
}
} }
other_node = rb_next(&state->rb_node); other = next_state(state);
if (other_node) { if (other && other->start == state->end + 1 &&
other = rb_entry(other_node, struct extent_state, rb_node); other->state == state->state) {
if (other->start == state->end + 1 && if (tree->private_data && is_data_inode(tree->private_data))
other->state == state->state) { btrfs_merge_delalloc_extent(tree->private_data, state,
if (tree->private_data && other);
is_data_inode(tree->private_data)) state->end = other->end;
btrfs_merge_delalloc_extent(tree->private_data, rb_erase(&other->rb_node, &tree->state);
state, other); RB_CLEAR_NODE(&other->rb_node);
state->end = other->end; free_extent_state(other);
rb_erase(&other->rb_node, &tree->state);
RB_CLEAR_NODE(&other->rb_node);
free_extent_state(other);
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment