]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
btrfs: tests: error out on unexpected extent map reference count
authorFilipe Manana <fdmanana@suse.com>
Thu, 11 Jan 2024 16:04:26 +0000 (16:04 +0000)
committerDavid Sterba <dsterba@suse.com>
Tue, 7 May 2024 19:31:03 +0000 (21:31 +0200)
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: Qu Wenruo <wqu@suse.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tests/extent-map-tests.c

index de2e8483220e4ac2371e21dc0fbf6821aa239c29..0f5c9c9304d9be1bc775eeeba5f79677a9c9ddd4 100644 (file)
 #include "../disk-io.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 rb_node *node;
+       int ret = 0;
 
        write_lock(&em_tree->lock);
        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)
 
 #ifdef CONFIG_BTRFS_DEBUG
                if (refcount_read(&em->refs) != 1) {
+                       ret = -EINVAL;
                        test_err(
 "em leak: em (start %llu len %llu block_start %llu block_len %llu) refs %d",
                                 em->start, em->len, em->block_start,
@@ -35,6 +37,8 @@ static void free_extent_map_tree(struct extent_map_tree *em_tree)
                free_extent_map(em);
        }
        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)
        u64 start = 0;
        u64 len = SZ_8K;
        int ret;
+       int ret2;
 
        em = alloc_extent_map();
        if (!em) {
@@ -137,7 +142,9 @@ static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
        }
        free_extent_map(em);
 out:
-       free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(em_tree);
+       if (ret == 0)
+               ret = ret2;
 
        return ret;
 }
@@ -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 *em;
        int ret;
+       int ret2;
 
        em = alloc_extent_map();
        if (!em) {
@@ -229,7 +237,9 @@ static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
        }
        free_extent_map(em);
 out:
-       free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(em_tree);
+       if (ret == 0)
+               ret = ret2;
 
        return ret;
 }
@@ -241,6 +251,7 @@ static int __test_case_3(struct btrfs_fs_info *fs_info,
        struct extent_map *em;
        u64 len = SZ_4K;
        int ret;
+       int ret2;
 
        em = alloc_extent_map();
        if (!em) {
@@ -302,7 +313,9 @@ static int __test_case_3(struct btrfs_fs_info *fs_info,
        }
        free_extent_map(em);
 out:
-       free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(em_tree);
+       if (ret == 0)
+               ret = ret2;
 
        return ret;
 }
@@ -345,6 +358,7 @@ static int __test_case_4(struct btrfs_fs_info *fs_info,
        struct extent_map *em;
        u64 len = SZ_4K;
        int ret;
+       int ret2;
 
        em = alloc_extent_map();
        if (!em) {
@@ -421,7 +435,9 @@ static int __test_case_4(struct btrfs_fs_info *fs_info,
        }
        free_extent_map(em);
 out:
-       free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(em_tree);
+       if (ret == 0)
+               ret = ret2;
 
        return ret;
 }
@@ -592,6 +608,7 @@ static int test_case_5(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 {
        u64 start, end;
        int ret;
+       int ret2;
 
        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)
        if (ret)
                goto out;
 out:
-       free_extent_map_tree(&inode->extent_tree);
+       ret2 = free_extent_map_tree(&inode->extent_tree);
+       if (ret == 0)
+               ret = ret2;
+
        return ret;
 }
 
@@ -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 *em = NULL;
        int ret;
+       int ret2;
 
        ret = add_compressed_extent(inode, 0, SZ_4K, 0);
        if (ret)
@@ -717,7 +738,10 @@ static int test_case_6(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
        ret = 0;
 out:
        free_extent_map(em);
-       free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(em_tree);
+       if (ret == 0)
+               ret = ret2;
+
        return ret;
 }
 
@@ -852,7 +876,10 @@ out:
        ret2 = unpin_extent_cache(inode, 0, SZ_16K, 0);
        if (ret == 0)
                ret = ret2;
-       free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(em_tree);
+       if (ret == 0)
+               ret = ret2;
+
        return ret;
 }