btrfs: WARN_ON_ONCE() in our leak detection code
authorJosef Bacik <josef@toxicpanda.com>
Tue, 2 Jan 2024 20:18:07 +0000 (15:18 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 4 Mar 2024 15:24:45 +0000 (16:24 +0100)
fstests looks for WARN_ON's in dmesg.  Add WARN_ON_ONCE() to our leak
detection code (enabled only in debug builds) so that fstests will fail
if these things trip at all.  This will allow us to easily catch
problems with our reference counting that may otherwise go unnoticed.

Reviewed-by: Neal Gompa <neal@gompa.dev>
Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c
fs/btrfs/extent-io-tree.c
fs/btrfs/extent_io.c

index f405cc27886124fb47d2678a7e2138de594dbd3a..bcd35be4b841b5a8d4d612007664dc83cebf84b2 100644 (file)
@@ -1244,6 +1244,7 @@ void btrfs_check_leaked_roots(struct btrfs_fs_info *fs_info)
                btrfs_err(fs_info, "leaked root %s refcount %d",
                          btrfs_root_name(&root->root_key, buf),
                          refcount_read(&root->refs));
+               WARN_ON_ONCE(1);
                while (refcount_read(&root->refs) > 1)
                        btrfs_put_root(root);
                btrfs_put_root(root);
index e3ee5449cc4af7b44385805d57baeb5d6998a483..1544e7b1eaed307b0428556c80bad255558d1c62 100644 (file)
@@ -48,6 +48,7 @@ static inline void btrfs_extent_state_leak_debug_check(void)
                       extent_state_in_tree(state),
                       refcount_read(&state->refs));
                list_del(&state->leak_list);
+               WARN_ON_ONCE(1);
                kmem_cache_free(extent_state_cache, state);
        }
 }
index a8c8b9d8c40091a07230a22881b27d0c6c7bbadb..b542bd1816df6f0e2edb295a81107354305f8dfe 100644 (file)
@@ -82,6 +82,7 @@ void btrfs_extent_buffer_leak_debug_check(struct btrfs_fs_info *fs_info)
                       eb->start, eb->len, atomic_read(&eb->refs), eb->bflags,
                       btrfs_header_owner(eb));
                list_del(&eb->leak_list);
+               WARN_ON_ONCE(1);
                kmem_cache_free(extent_buffer_cache, eb);
        }
        spin_unlock_irqrestore(&fs_info->eb_leak_lock, flags);