btrfs: fix delayed ref refcount leak in debug assertion
authorLeo Martins <loemra.dev@gmail.com>
Wed, 28 May 2025 00:04:21 +0000 (17:04 -0700)
committerDavid Sterba <dsterba@suse.com>
Thu, 19 Jun 2025 13:18:35 +0000 (15:18 +0200)
If the delayed_root is not empty we are increasing the number of
references to a delayed_node without decreasing it, causing a leak.  Fix
by decrementing the delayed_node reference count.

Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Leo Martins <loemra.dev@gmail.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
[ Remove the changelog from the commit message. ]
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/delayed-inode.c

index c7cc24a5dd5e84dab834f4e570a63966ea6fe475..8c597fa605233a3a56cf55ff2c56f6acd17831ba 100644 (file)
@@ -1377,7 +1377,10 @@ static int btrfs_wq_run_delayed_node(struct btrfs_delayed_root *delayed_root,
 
 void btrfs_assert_delayed_root_empty(struct btrfs_fs_info *fs_info)
 {
-       WARN_ON(btrfs_first_delayed_node(fs_info->delayed_root));
+       struct btrfs_delayed_node *node = btrfs_first_delayed_node(fs_info->delayed_root);
+
+       if (WARN_ON(node))
+               refcount_dec(&node->refs);
 }
 
 static bool could_end_wait(struct btrfs_delayed_root *delayed_root, int seq)