]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: replace BUG_ON() with error handling at update_ref_for_cow()
authorFilipe Manana <fdmanana@suse.com>
Tue, 18 Jun 2024 14:55:16 +0000 (15:55 +0100)
committerDavid Sterba <dsterba@suse.com>
Thu, 11 Jul 2024 13:33:26 +0000 (15:33 +0200)
Instead of a BUG_ON() just return an error, log an error message and
abort the transaction in case we find an extent buffer belonging to the
relocation tree that doesn't have the full backref flag set. This is
unexpected and should never happen (save for bugs or a potential bad
memory).

Reviewed-by: Qu Wenruo <wqu@suse.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/ctree.c

index 7b2f1de845e78845e11442c74dd56ba00f0b116f..e33f9f5a228d6caee33e2794297b82ac4ce52840 100644 (file)
@@ -461,8 +461,16 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,
        }
 
        owner = btrfs_header_owner(buf);
-       BUG_ON(owner == BTRFS_TREE_RELOC_OBJECTID &&
-              !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF));
+       if (unlikely(owner == BTRFS_TREE_RELOC_OBJECTID &&
+                    !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF))) {
+               btrfs_crit(fs_info,
+"found tree block at bytenr %llu level %d root %llu refs %llu flags %llx without full backref flag set",
+                          buf->start, btrfs_header_level(buf),
+                          btrfs_root_id(root), refs, flags);
+               ret = -EUCLEAN;
+               btrfs_abort_transaction(trans, ret);
+               return ret;
+       }
 
        if (refs > 1) {
                if ((owner == btrfs_root_id(root) ||