Commit d1ac6e41 authored by Liu Bo's avatar Liu Bo Committed by Josef Bacik

Btrfs: use fastpath in extent state ops as much as possible

Fully utilize our extent state's new helper functions to use
fastpath as much as possible.
Signed-off-by: default avatarLiu Bo <liubo2009@cn.fujitsu.com>
Reviewed-by: default avatarJosef Bacik <josef@redhat.com>
parent f8c5d0b4
...@@ -569,10 +569,8 @@ int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, ...@@ -569,10 +569,8 @@ int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
if (err) if (err)
goto out; goto out;
if (state->end <= end) { if (state->end <= end) {
clear_state_bit(tree, state, &bits, wake); state = clear_state_bit(tree, state, &bits, wake);
if (last_end == (u64)-1) goto next;
goto out;
start = last_end + 1;
} }
goto search_again; goto search_again;
} }
...@@ -780,7 +778,6 @@ __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, ...@@ -780,7 +778,6 @@ __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
* Just lock what we found and keep going * Just lock what we found and keep going
*/ */
if (state->start == start && state->end <= end) { if (state->start == start && state->end <= end) {
struct rb_node *next_node;
if (state->state & exclusive_bits) { if (state->state & exclusive_bits) {
*failed_start = state->start; *failed_start = state->start;
err = -EEXIST; err = -EEXIST;
...@@ -788,20 +785,15 @@ __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, ...@@ -788,20 +785,15 @@ __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
} }
set_state_bits(tree, state, &bits); set_state_bits(tree, state, &bits);
cache_state(state, cached_state); cache_state(state, cached_state);
merge_state(tree, state); merge_state(tree, state);
if (last_end == (u64)-1) if (last_end == (u64)-1)
goto out; goto out;
start = last_end + 1; start = last_end + 1;
next_node = rb_next(&state->rb_node); state = next_state(state);
if (next_node && start < end && prealloc && !need_resched()) { if (start < end && state && state->start == start &&
state = rb_entry(next_node, struct extent_state, !need_resched())
rb_node); goto hit_next;
if (state->start == start)
goto hit_next;
}
goto search_again; goto search_again;
} }
...@@ -844,6 +836,10 @@ __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, ...@@ -844,6 +836,10 @@ __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
if (last_end == (u64)-1) if (last_end == (u64)-1)
goto out; goto out;
start = last_end + 1; start = last_end + 1;
state = next_state(state);
if (start < end && state && state->start == start &&
!need_resched())
goto hit_next;
} }
goto search_again; goto search_again;
} }
...@@ -993,21 +989,14 @@ int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, ...@@ -993,21 +989,14 @@ int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
* Just lock what we found and keep going * Just lock what we found and keep going
*/ */
if (state->start == start && state->end <= end) { if (state->start == start && state->end <= end) {
struct rb_node *next_node;
set_state_bits(tree, state, &bits); set_state_bits(tree, state, &bits);
clear_state_bit(tree, state, &clear_bits, 0); state = clear_state_bit(tree, state, &clear_bits, 0);
if (last_end == (u64)-1) if (last_end == (u64)-1)
goto out; goto out;
start = last_end + 1; start = last_end + 1;
next_node = rb_next(&state->rb_node); if (start < end && state && state->start == start &&
if (next_node && start < end && prealloc && !need_resched()) { !need_resched())
state = rb_entry(next_node, struct extent_state, goto hit_next;
rb_node);
if (state->start == start)
goto hit_next;
}
goto search_again; goto search_again;
} }
...@@ -1041,10 +1030,13 @@ int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, ...@@ -1041,10 +1030,13 @@ int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
goto out; goto out;
if (state->end <= end) { if (state->end <= end) {
set_state_bits(tree, state, &bits); set_state_bits(tree, state, &bits);
clear_state_bit(tree, state, &clear_bits, 0); state = clear_state_bit(tree, state, &clear_bits, 0);
if (last_end == (u64)-1) if (last_end == (u64)-1)
goto out; goto out;
start = last_end + 1; start = last_end + 1;
if (start < end && state && state->start == start &&
!need_resched())
goto hit_next;
} }
goto search_again; goto search_again;
} }
......
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