]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: don't BUG() on unexpected delayed ref type in run_one_delayed_ref()
authorFilipe Manana <fdmanana@suse.com>
Tue, 13 Jan 2026 16:37:26 +0000 (16:37 +0000)
committerDavid Sterba <dsterba@suse.com>
Tue, 3 Feb 2026 06:51:43 +0000 (07:51 +0100)
There is no need to BUG(), we can just return an error and log an error
message.

Reviewed-by: Boris Burkov <boris@bur.io>
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/extent-tree.c

index 1dcd69fe97ed529d3b8d1dfc0384ce20ac736813..57ffe9b3b954d3f793d930230cd7bf1da5b82fbe 100644 (file)
@@ -1761,32 +1761,36 @@ static int run_one_delayed_ref(struct btrfs_trans_handle *trans,
                               struct btrfs_delayed_extent_op *extent_op,
                               bool insert_reserved)
 {
+       struct btrfs_fs_info *fs_info = trans->fs_info;
        int ret = 0;
 
        if (TRANS_ABORTED(trans)) {
                if (insert_reserved) {
                        btrfs_pin_extent(trans, node->bytenr, node->num_bytes);
-                       free_head_ref_squota_rsv(trans->fs_info, href);
+                       free_head_ref_squota_rsv(fs_info, href);
                }
                return 0;
        }
 
        if (node->type == BTRFS_TREE_BLOCK_REF_KEY ||
-           node->type == BTRFS_SHARED_BLOCK_REF_KEY)
+           node->type == BTRFS_SHARED_BLOCK_REF_KEY) {
                ret = run_delayed_tree_ref(trans, href, node, extent_op,
                                           insert_reserved);
-       else if (node->type == BTRFS_EXTENT_DATA_REF_KEY ||
-                node->type == BTRFS_SHARED_DATA_REF_KEY)
+       else if (node->type == BTRFS_EXTENT_DATA_REF_KEY ||
+                  node->type == BTRFS_SHARED_DATA_REF_KEY) {
                ret = run_delayed_data_ref(trans, href, node, extent_op,
                                           insert_reserved);
-       else if (node->type == BTRFS_EXTENT_OWNER_REF_KEY)
+       } else if (node->type == BTRFS_EXTENT_OWNER_REF_KEY) {
                ret = 0;
-       else
-               BUG();
+       } else {
+               ret = -EUCLEAN;
+               btrfs_err(fs_info, "unexpected delayed ref node type: %u", node->type);
+       }
+
        if (ret && insert_reserved)
                btrfs_pin_extent(trans, node->bytenr, node->num_bytes);
        if (ret < 0)
-               btrfs_err(trans->fs_info,
+               btrfs_err(fs_info,
 "failed to run delayed ref for logical %llu num_bytes %llu type %u action %u ref_mod %d: %d",
                          node->bytenr, node->num_bytes, node->type,
                          node->action, node->ref_mod, ret);