From: Chris Mason Date: Thu, 8 Nov 2007 15:59:05 +0000 (-0500) Subject: Btrfs: Avoid extent_buffer lru corruption X-Git-Tag: v2.6.29-rc1~27^2~9^2~55^2~56^2~30^2~412 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=856bf3e592f917e7d663cb7fa93e83fe795e8f4e;p=karo-tx-linux.git Btrfs: Avoid extent_buffer lru corruption Signed-off-by: Chris Mason --- diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index c976615dcda3..754bc42c162a 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c @@ -2047,7 +2047,7 @@ static int add_lru(struct extent_map_tree *tree, struct extent_buffer *eb) rm = list_entry(tree->buffer_lru.prev, struct extent_buffer, lru); tree->lru_size--; - list_del(&rm->lru); + list_del_init(&rm->lru); free_extent_buffer(rm); } } else @@ -2187,6 +2187,9 @@ lru_add: return eb; fail: + spin_lock(&tree->lru_lock); + list_del_init(&eb->lru); + spin_unlock(&tree->lru_lock); if (!atomic_dec_and_test(&eb->refs)) return NULL; for (index = 0; index < i; index++) { @@ -2246,6 +2249,9 @@ lru_add: spin_unlock(&tree->lru_lock); return eb; fail: + spin_lock(&tree->lru_lock); + list_del_init(&eb->lru); + spin_unlock(&tree->lru_lock); if (!atomic_dec_and_test(&eb->refs)) return NULL; for (index = 0; index < i; index++) {