Commit 109b36a2 authored by Chris Mason's avatar Chris Mason

Btrfs: make uncache_state unconditional

The extent_io code can take cached pointers into the extent state trees,
and these can make lookups much faster in common operations.  The
caching only happens when specific bits are set that prevent merging
and splitting of the extent state.

A help function was added to uncache the state, and it was testing
the same set of conditionals.  This can leak in very strange corner
cases where the lock bit goes away unexpectedly.

The uncaching should be unconditional.  Once we have a ref on the
extent we should always give it up.
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 874d0d26
...@@ -694,11 +694,9 @@ static void uncache_state(struct extent_state **cached_ptr) ...@@ -694,11 +694,9 @@ static void uncache_state(struct extent_state **cached_ptr)
{ {
if (cached_ptr && (*cached_ptr)) { if (cached_ptr && (*cached_ptr)) {
struct extent_state *state = *cached_ptr; struct extent_state *state = *cached_ptr;
if (state->state & (EXTENT_IOBITS | EXTENT_BOUNDARY)) {
*cached_ptr = NULL; *cached_ptr = NULL;
free_extent_state(state); free_extent_state(state);
} }
}
} }
/* /*
...@@ -1764,7 +1762,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err) ...@@ -1764,7 +1762,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
spin_lock(&tree->lock); spin_lock(&tree->lock);
state = find_first_extent_bit_state(tree, start, 0); state = find_first_extent_bit_state(tree, start, 0);
if (state) { if (state && state->start == start) {
/* /*
* take a reference on the state, unlock will drop * take a reference on the state, unlock will drop
* the ref * the ref
......
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