aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2011-04-12 13:57:39 -0400
committerChris Mason <chris.mason@oracle.com>2011-04-12 20:51:26 -0400
commit109b36a2bb3eebf5c9994980e724958a5b2b62b6 (patch)
tree2f9211a615e24452d88040741d93f04714cfef34 /fs/btrfs/extent_io.c
parent874d0d2633e0f3fe955607c6b04d5fc5325781c4 (diff)
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: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r--fs/btrfs/extent_io.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 8dcfb77678de..1c462f895c98 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -694,10 +694,8 @@ static void uncache_state(struct extent_state **cached_ptr)
694{ 694{
695 if (cached_ptr && (*cached_ptr)) { 695 if (cached_ptr && (*cached_ptr)) {
696 struct extent_state *state = *cached_ptr; 696 struct extent_state *state = *cached_ptr;
697 if (state->state & (EXTENT_IOBITS | EXTENT_BOUNDARY)) { 697 *cached_ptr = NULL;
698 *cached_ptr = NULL; 698 free_extent_state(state);
699 free_extent_state(state);
700 }
701 } 699 }
702} 700}
703 701
@@ -1764,7 +1762,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
1764 1762
1765 spin_lock(&tree->lock); 1763 spin_lock(&tree->lock);
1766 state = find_first_extent_bit_state(tree, start, 0); 1764 state = find_first_extent_bit_state(tree, start, 0);
1767 if (state) { 1765 if (state && state->start == start) {
1768 /* 1766 /*
1769 * take a reference on the state, unlock will drop 1767 * take a reference on the state, unlock will drop
1770 * the ref 1768 * the ref