]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: convert BUG_ON in btrfs_reloc_cow_block() to proper error handling
authorJosef Bacik <josef@toxicpanda.com>
Thu, 3 Oct 2024 15:43:03 +0000 (11:43 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Mar 2025 11:47:00 +0000 (12:47 +0100)
[ Upstream commit 6a4730b325aaa48f7a5d5ba97aff0a955e2d9cec ]

This BUG_ON is meant to catch backref cache problems, but these can
arise from either bugs in the backref cache or corruption in the extent
tree.  Fix it to be a proper error.

Reviewed-by: Boris Burkov <boris@bur.io>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/relocation.c

index 98e3b3749ec120c58f7f28aa08f5911713b7ac74..5b921e6ed94e2b2936e0db593ff86d77d5db0519 100644 (file)
@@ -3976,8 +3976,18 @@ int btrfs_reloc_cow_block(struct btrfs_trans_handle *trans,
                WARN_ON(!first_cow && level == 0);
 
                node = rc->backref_cache.path[level];
-               BUG_ON(node->bytenr != buf->start &&
-                      node->new_bytenr != buf->start);
+
+               /*
+                * If node->bytenr != buf->start and node->new_bytenr !=
+                * buf->start then we've got the wrong backref node for what we
+                * expected to see here and the cache is incorrect.
+                */
+               if (unlikely(node->bytenr != buf->start && node->new_bytenr != buf->start)) {
+                       btrfs_err(fs_info,
+"bytenr %llu was found but our backref cache was expecting %llu or %llu",
+                                 buf->start, node->bytenr, node->new_bytenr);
+                       return -EUCLEAN;
+               }
 
                btrfs_backref_drop_node_buffer(node);
                atomic_inc(&cow->refs);