Commit 071533da authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba

btrfs: tests: error out on unexpected extent map reference count

In the extent map self tests, when freeing all extent maps from a test
extent map tree we are not expecting to find any extent map with a
reference count different from 1 (the tree reference). If we find any,
we just log a message but we don't fail the test, which makes it very easy
to miss any bug/regression - no one reads the test messages unless a test
fails. So change the behaviour to make a test fail if we find an extent
map in the tree with a reference count different from 1. Make the failure
happen only after removing all extent maps, so that we don't leak memory.
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 0a308f80
...@@ -11,10 +11,11 @@ ...@@ -11,10 +11,11 @@
#include "../disk-io.h" #include "../disk-io.h"
#include "../block-group.h" #include "../block-group.h"
static void free_extent_map_tree(struct extent_map_tree *em_tree) static int free_extent_map_tree(struct extent_map_tree *em_tree)
{ {
struct extent_map *em; struct extent_map *em;
struct rb_node *node; struct rb_node *node;
int ret = 0;
write_lock(&em_tree->lock); write_lock(&em_tree->lock);
while (!RB_EMPTY_ROOT(&em_tree->map.rb_root)) { while (!RB_EMPTY_ROOT(&em_tree->map.rb_root)) {
...@@ -24,6 +25,7 @@ static void free_extent_map_tree(struct extent_map_tree *em_tree) ...@@ -24,6 +25,7 @@ static void free_extent_map_tree(struct extent_map_tree *em_tree)
#ifdef CONFIG_BTRFS_DEBUG #ifdef CONFIG_BTRFS_DEBUG
if (refcount_read(&em->refs) != 1) { if (refcount_read(&em->refs) != 1) {
ret = -EINVAL;
test_err( test_err(
"em leak: em (start %llu len %llu block_start %llu block_len %llu) refs %d", "em leak: em (start %llu len %llu block_start %llu block_len %llu) refs %d",
em->start, em->len, em->block_start, em->start, em->len, em->block_start,
...@@ -35,6 +37,8 @@ static void free_extent_map_tree(struct extent_map_tree *em_tree) ...@@ -35,6 +37,8 @@ static void free_extent_map_tree(struct extent_map_tree *em_tree)
free_extent_map(em); free_extent_map(em);
} }
write_unlock(&em_tree->lock); write_unlock(&em_tree->lock);
return ret;
} }
/* /*
...@@ -60,6 +64,7 @@ static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode) ...@@ -60,6 +64,7 @@ static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
u64 start = 0; u64 start = 0;
u64 len = SZ_8K; u64 len = SZ_8K;
int ret; int ret;
int ret2;
em = alloc_extent_map(); em = alloc_extent_map();
if (!em) { if (!em) {
...@@ -137,7 +142,9 @@ static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode) ...@@ -137,7 +142,9 @@ static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
} }
free_extent_map(em); free_extent_map(em);
out: out:
free_extent_map_tree(em_tree); ret2 = free_extent_map_tree(em_tree);
if (ret == 0)
ret = ret2;
return ret; return ret;
} }
...@@ -153,6 +160,7 @@ static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode) ...@@ -153,6 +160,7 @@ static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
struct extent_map_tree *em_tree = &inode->extent_tree; struct extent_map_tree *em_tree = &inode->extent_tree;
struct extent_map *em; struct extent_map *em;
int ret; int ret;
int ret2;
em = alloc_extent_map(); em = alloc_extent_map();
if (!em) { if (!em) {
...@@ -229,7 +237,9 @@ static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode) ...@@ -229,7 +237,9 @@ static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
} }
free_extent_map(em); free_extent_map(em);
out: out:
free_extent_map_tree(em_tree); ret2 = free_extent_map_tree(em_tree);
if (ret == 0)
ret = ret2;
return ret; return ret;
} }
...@@ -241,6 +251,7 @@ static int __test_case_3(struct btrfs_fs_info *fs_info, ...@@ -241,6 +251,7 @@ static int __test_case_3(struct btrfs_fs_info *fs_info,
struct extent_map *em; struct extent_map *em;
u64 len = SZ_4K; u64 len = SZ_4K;
int ret; int ret;
int ret2;
em = alloc_extent_map(); em = alloc_extent_map();
if (!em) { if (!em) {
...@@ -302,7 +313,9 @@ static int __test_case_3(struct btrfs_fs_info *fs_info, ...@@ -302,7 +313,9 @@ static int __test_case_3(struct btrfs_fs_info *fs_info,
} }
free_extent_map(em); free_extent_map(em);
out: out:
free_extent_map_tree(em_tree); ret2 = free_extent_map_tree(em_tree);
if (ret == 0)
ret = ret2;
return ret; return ret;
} }
...@@ -345,6 +358,7 @@ static int __test_case_4(struct btrfs_fs_info *fs_info, ...@@ -345,6 +358,7 @@ static int __test_case_4(struct btrfs_fs_info *fs_info,
struct extent_map *em; struct extent_map *em;
u64 len = SZ_4K; u64 len = SZ_4K;
int ret; int ret;
int ret2;
em = alloc_extent_map(); em = alloc_extent_map();
if (!em) { if (!em) {
...@@ -421,7 +435,9 @@ static int __test_case_4(struct btrfs_fs_info *fs_info, ...@@ -421,7 +435,9 @@ static int __test_case_4(struct btrfs_fs_info *fs_info,
} }
free_extent_map(em); free_extent_map(em);
out: out:
free_extent_map_tree(em_tree); ret2 = free_extent_map_tree(em_tree);
if (ret == 0)
ret = ret2;
return ret; return ret;
} }
...@@ -592,6 +608,7 @@ static int test_case_5(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode) ...@@ -592,6 +608,7 @@ static int test_case_5(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
{ {
u64 start, end; u64 start, end;
int ret; int ret;
int ret2;
test_msg("Running btrfs_drop_extent_map_range tests"); test_msg("Running btrfs_drop_extent_map_range tests");
...@@ -662,7 +679,10 @@ static int test_case_5(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode) ...@@ -662,7 +679,10 @@ static int test_case_5(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
if (ret) if (ret)
goto out; goto out;
out: out:
free_extent_map_tree(&inode->extent_tree); ret2 = free_extent_map_tree(&inode->extent_tree);
if (ret == 0)
ret = ret2;
return ret; return ret;
} }
...@@ -676,6 +696,7 @@ static int test_case_6(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode) ...@@ -676,6 +696,7 @@ static int test_case_6(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
struct extent_map_tree *em_tree = &inode->extent_tree; struct extent_map_tree *em_tree = &inode->extent_tree;
struct extent_map *em = NULL; struct extent_map *em = NULL;
int ret; int ret;
int ret2;
ret = add_compressed_extent(inode, 0, SZ_4K, 0); ret = add_compressed_extent(inode, 0, SZ_4K, 0);
if (ret) if (ret)
...@@ -717,7 +738,10 @@ static int test_case_6(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode) ...@@ -717,7 +738,10 @@ static int test_case_6(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
ret = 0; ret = 0;
out: out:
free_extent_map(em); free_extent_map(em);
free_extent_map_tree(em_tree); ret2 = free_extent_map_tree(em_tree);
if (ret == 0)
ret = ret2;
return ret; return ret;
} }
...@@ -852,7 +876,10 @@ static int test_case_7(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode) ...@@ -852,7 +876,10 @@ static int test_case_7(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
ret2 = unpin_extent_cache(inode, 0, SZ_16K, 0); ret2 = unpin_extent_cache(inode, 0, SZ_16K, 0);
if (ret == 0) if (ret == 0)
ret = ret2; ret = ret2;
free_extent_map_tree(em_tree); ret2 = free_extent_map_tree(em_tree);
if (ret == 0)
ret = ret2;
return ret; return ret;
} }
......
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