Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+18 −26
Original line number Diff line number Diff line
@@ -569,10 +569,8 @@ hit_next:
		if (err)
			goto out;
		if (state->end <= end) {
			clear_state_bit(tree, state, &bits, wake);
			if (last_end == (u64)-1)
				goto out;
			start = last_end + 1;
			state = clear_state_bit(tree, state, &bits, wake);
			goto next;
		}
		goto search_again;
	}
@@ -780,7 +778,6 @@ hit_next:
	 * Just lock what we found and keep going
	 */
	if (state->start == start && state->end <= end) {
		struct rb_node *next_node;
		if (state->state & exclusive_bits) {
			*failed_start = state->start;
			err = -EEXIST;
@@ -788,20 +785,15 @@ hit_next:
		}

		set_state_bits(tree, state, &bits);

		cache_state(state, cached_state);
		merge_state(tree, state);
		if (last_end == (u64)-1)
			goto out;

		start = last_end + 1;
		next_node = rb_next(&state->rb_node);
		if (next_node && start < end && prealloc && !need_resched()) {
			state = rb_entry(next_node, struct extent_state,
					 rb_node);
			if (state->start == start)
		state = next_state(state);
		if (start < end && state && state->start == start &&
		    !need_resched())
			goto hit_next;
		}
		goto search_again;
	}

@@ -844,6 +836,10 @@ hit_next:
			if (last_end == (u64)-1)
				goto out;
			start = last_end + 1;
			state = next_state(state);
			if (start < end && state && state->start == start &&
			    !need_resched())
				goto hit_next;
		}
		goto search_again;
	}
@@ -993,21 +989,14 @@ hit_next:
	 * Just lock what we found and keep going
	 */
	if (state->start == start && state->end <= end) {
		struct rb_node *next_node;

		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)
			goto out;

		start = last_end + 1;
		next_node = rb_next(&state->rb_node);
		if (next_node && start < end && prealloc && !need_resched()) {
			state = rb_entry(next_node, struct extent_state,
					 rb_node);
			if (state->start == start)
		if (start < end && state && state->start == start &&
		    !need_resched())
			goto hit_next;
		}
		goto search_again;
	}

@@ -1041,10 +1030,13 @@ hit_next:
			goto out;
		if (state->end <= end) {
			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)
				goto out;
			start = last_end + 1;
			if (start < end && state && state->start == start &&
			    !need_resched())
				goto hit_next;
		}
		goto search_again;
	}