From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E0A3939900A for ; Fri, 27 Feb 2026 18:31:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772217097; cv=none; b=kIdni33NSDcBGJ62jmTcR2A3lVg66mi5K9G270eoEzk0xTYUrdHEX/Iuc6yS9PaJbzqMALJyQM72xvGEVsmeH+axaZkEuZOm2Mo9bZsJN8o288CxqFKbN0ojLf3pj+cYG0LfshfQTycKdSUmJHuLBrJoPi1sd+vTF8cPfL+c6sI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772217097; c=relaxed/simple; bh=wbw4doQYKaFLDbXuUD0eAgYHGmQXU9EWxpL+DBRBZ68=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=U/loO8LNibPNizDA8d/s9H8SwKAhdcvQsYJ9Dzb6m1/CaneUrMaupULEEpJJNWrhbq8d1C+UXKc8ZSQO+YIoln79W371vYY0tkM7rCUTTlBqclomJPLd9sXWKk1SXZwtCiMy6vMSKZTUlm4zm2cciqKljn4YE31tZ+2cREA3Ukw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=R9G+Rgvr; arc=none smtp.client-ip=209.85.214.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="R9G+Rgvr" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-2ad9f2ee29aso14718365ad.1 for ; Fri, 27 Feb 2026 10:31:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772217095; x=1772821895; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2WUSzdwnkAcRjrhv+jrxIK4jmmkvYOasrlp3X44R4ms=; b=R9G+Rgvr2srSwqSJuWH4CS4Rqm5UVdwqR+MgpkUHlsuvNy9zOGrcvU2e7f9SV8UcS+ PeUZzJ31rrcwA1g/2b82v7EwZmjMybOl20QnroFsMgDeTn4NbFGxV/V5w/njczZwB6SZ qpWizkeO2fPfch1e1M6IQdznakKbnbwCXt0DlRM/0i9ddKl+SpKvWSl4y8RHqM3q4ZQF Thmb0T7O9m9btKw7DKoMC9Ior5RUrUYoU+RVXBvwtRg0vhurjthCCqSyWxG1IMze2Aik AYUCycKp8AnMup163MIOWIprvD0ZhEykJL0ht8Le9coHkrshsqQDHOg5wWALdFOnvbn6 Jq2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772217095; x=1772821895; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2WUSzdwnkAcRjrhv+jrxIK4jmmkvYOasrlp3X44R4ms=; b=HrKHBuPt7Ra/Wbg/P6c7FRfFz1JkoNgbi5gpUyMf+q5Y/XatN4nw+l7/WEVd3oNvaA 09KRPoWbpXmdM7ZZhI6TjcxeCbjVXqKVzT+6KK533ehGamOLc/3MQtGRCTd05i5bNFw4 suLejysUeFQlsnAkmbEp38NcvxrW8DIo2/8Sb3ijsm4TqeSA6ESwkth3QfydBt7vuWbC y7PtbjK1SplI/HTFg72J2KEUP6oGyAnisL5pmGhaSekkjHqY0BSQCU+KF5U4r9IT+b3Z evZ7+89L++Q7igxfnIYeVTMCOm5fjOn0NjBdzeBPBM4McAtPUdy6b5SH9MGnv5+WBXJw It8w== X-Forwarded-Encrypted: i=1; AJvYcCVS+HgjFT4hhgn6/A5iBmO42H5tW1aEfSUdOgfo6ghCQKnwHNnkTQ06d0MXeIXCaM3duCa0XwelzNeOrwQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+cDLIBrrkTp5mb3///rH8Agu3TSIrDGExJs7e6uZn2lsT/ZvX w0mwYsGxc1/Mc9YiNo9zIAdZHY/+tYLI6Bk9cjADCL8JWl6sujm99byT9EYTgh8A6Fc= X-Gm-Gg: ATEYQzy2xo/PDluOEaSF1PP2L+RJRw1oJo1KaPJB4Sxr2GhrYq5gJCxuPkbY0duRmpc fF2Z5tUzgB4f0WSdtXI1R5UU4T95vNeAd0iS/Vrg9uTEjtL3fhqTr1fKTpbMEiFYfQjgZoo3s3l JddcsnMGb/IiuHVbfY2kELd7ISc0I0C+7T13gxGc6n+wMeLQj681gO4DGbLzWXUh8IoE2rX6+P2 kF9VeCms2vP/kgUoj3pAQ3FPhQk83fAKA0SzSCeh+VizWDhYr1e1cLYQzoH0KOzLscA5o2vnYlF IDHEF0yb+u1H+hfoj6IV7ik0UB5e5ipRu5ZBbO8lyEZarMJzg5xqVGkcbzmzJKBVfbQFncQNJpB hJXEsV8Df2MMSYk0R9YQLloDkB+0cPfp8Hl5qOXMQSNp05M4cZp3ltsgOwhhWNI3Bi1Ix3Gy/W+ hPI89ReloWdow5ZXa55Tgo30J3 X-Received: by 2002:a17:902:ce09:b0:2a0:b7d3:eec5 with SMTP id d9443c01a7336-2ae2e4b0d26mr40184335ad.33.1772217095207; Fri, 27 Feb 2026 10:31:35 -0800 (PST) Received: from archlinux ([103.208.68.105]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2adfb5dbad2sm61932485ad.34.2026.02.27.10.31.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Feb 2026 10:31:34 -0800 (PST) From: Adarsh Das To: clm@fb.com, dsterba@suse.com Cc: terrelln@fb.com, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Adarsh Das Subject: [PATCH 3/4] btrfs: replace BUG() and BUG_ON() with error handling in extent-tree.c Date: Sat, 28 Feb 2026 00:01:10 +0530 Message-ID: <20260227183111.9311-4-adarshdas950@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260227183111.9311-1-adarshdas950@gmail.com> References: <20260227183111.9311-1-adarshdas950@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Replace BUG() and BUG_ON() calls with proper error handling instead of crashing the kernel. Use btrfs_err() and return -EUCLEAN where fs_info is available, and WARN_ON() with an error return where it is not or where the condition is a programming bug rather than on-disk corruption. Signed-off-by: Adarsh Das --- fs/btrfs/extent-tree.c | 82 ++++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 19 deletions(-) diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 03cf9f242c70..9748a4c5bc2d 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -604,7 +604,13 @@ static noinline int remove_extent_data_ref(struct btrfs_trans_handle *trans, return -EUCLEAN; } - BUG_ON(num_refs < refs_to_drop); + if (unlikely(num_refs < refs_to_drop)) { + btrfs_err(trans->fs_info, + "dropping more refs than available, have %u want %u", + num_refs, refs_to_drop); + btrfs_abort_transaction(trans, -EUCLEAN); + return -EUCLEAN; + } num_refs -= refs_to_drop; if (num_refs == 0) { @@ -863,7 +869,13 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans, if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK && !skinny_metadata) { ptr += sizeof(struct btrfs_tree_block_info); - BUG_ON(ptr > end); + if (unlikely(ptr > end)) { + btrfs_err( + fs_info, + "extent item overflow at slot %d, ptr %lu end %lu", + path->slots[0], ptr, end); + return -EUCLEAN; + } } if (owner >= BTRFS_FIRST_FREE_OBJECTID) @@ -1237,7 +1249,12 @@ static int remove_extent_backref(struct btrfs_trans_handle *trans, { int ret = 0; - BUG_ON(!is_data && refs_to_drop != 1); + if (unlikely(!is_data && refs_to_drop != 1)) { + btrfs_err(trans->fs_info, + "invalid refs_to_drop %d for tree block, must be 1", + refs_to_drop); + return -EUCLEAN; + } if (iref) ret = update_inline_extent_backref(trans, path, iref, -refs_to_drop, NULL); @@ -1453,8 +1470,9 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, ASSERT(generic_ref->type != BTRFS_REF_NOT_SET && generic_ref->action); - BUG_ON(generic_ref->type == BTRFS_REF_METADATA && - generic_ref->ref_root == BTRFS_TREE_LOG_OBJECTID); + if (WARN_ON(generic_ref->type == BTRFS_REF_METADATA && + generic_ref->ref_root == BTRFS_TREE_LOG_OBJECTID)) + return -EINVAL; if (generic_ref->type == BTRFS_REF_METADATA) ret = btrfs_add_delayed_tree_ref(trans, generic_ref, NULL); @@ -1622,7 +1640,9 @@ static int run_delayed_data_ref(struct btrfs_trans_handle *trans, } else if (node->action == BTRFS_DROP_DELAYED_REF) { ret = __btrfs_free_extent(trans, href, node, extent_op); } else { - BUG(); + btrfs_err(trans->fs_info, "unexpected delayed ref action %d", + node->action); + return -EUCLEAN; } return ret; } @@ -1639,7 +1659,8 @@ static void __run_delayed_extent_op(struct btrfs_delayed_extent_op *extent_op, if (extent_op->update_key) { struct btrfs_tree_block_info *bi; - BUG_ON(!(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)); + if (WARN_ON(!(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK))) + return; bi = (struct btrfs_tree_block_info *)(ei + 1); btrfs_set_tree_block_key(leaf, bi, &extent_op->key); } @@ -1775,7 +1796,9 @@ static int run_delayed_tree_ref(struct btrfs_trans_handle *trans, else ret = __btrfs_free_extent(trans, href, node, extent_op); } else { - BUG(); + btrfs_err(trans->fs_info, "unexpected delayed ref action %d", + node->action); + return -EUCLEAN; } return ret; } @@ -2645,7 +2668,11 @@ int btrfs_pin_extent(struct btrfs_trans_handle *trans, u64 bytenr, u64 num_bytes struct btrfs_block_group *cache; cache = btrfs_lookup_block_group(trans->fs_info, bytenr); - BUG_ON(!cache); /* Logic error */ + if (unlikely(!cache)) { + btrfs_err(trans->fs_info, + "unable to find block group for bytenr %llu", bytenr); + return -EUCLEAN; + } pin_down_extent(trans, cache, bytenr, num_bytes, true); @@ -4125,7 +4152,9 @@ static int do_allocation(struct btrfs_block_group *block_group, case BTRFS_EXTENT_ALLOC_ZONED: return do_allocation_zoned(block_group, ffe_ctl, bg_ret); default: - BUG(); + btrfs_err(block_group->fs_info, "invalid allocation policy %d", + ffe_ctl->policy); + return -EUCLEAN; } } @@ -4141,11 +4170,20 @@ static void release_block_group(struct btrfs_block_group *block_group, /* Nothing to do */ break; default: - BUG(); + btrfs_err(block_group->fs_info, "invalid allocation policy %d", + ffe_ctl->policy); + goto release; + } + + if (unlikely(btrfs_bg_flags_to_raid_index(block_group->flags) != + ffe_ctl->index)) { + btrfs_err(block_group->fs_info, + "mismatched raid index, block group flags %llu index %d", + block_group->flags, ffe_ctl->index); + goto release; } - BUG_ON(btrfs_bg_flags_to_raid_index(block_group->flags) != - ffe_ctl->index); +release: btrfs_release_block_group(block_group, delalloc); } @@ -4172,7 +4210,8 @@ static void found_extent(struct find_free_extent_ctl *ffe_ctl, /* Nothing to do */ break; default: - BUG(); + WARN_ONCE(1, "invalid allocation policy %d", ffe_ctl->policy); + return; } } @@ -4238,7 +4277,9 @@ static int can_allocate_chunk(struct btrfs_fs_info *fs_info, case BTRFS_EXTENT_ALLOC_ZONED: return can_allocate_chunk_zoned(fs_info, ffe_ctl); default: - BUG(); + btrfs_err(fs_info, "invalid allocation policy %d", + ffe_ctl->policy); + return -EUCLEAN; } } @@ -4448,7 +4489,9 @@ static int prepare_allocation(struct btrfs_fs_info *fs_info, case BTRFS_EXTENT_ALLOC_ZONED: return prepare_allocation_zoned(fs_info, ffe_ctl, space_info); default: - BUG(); + btrfs_err(fs_info, "invalid allocation policy %d", + ffe_ctl->policy); + return -EUCLEAN; } } @@ -5292,8 +5335,8 @@ struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans, parent = ins.objectid; flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; owning_root = reloc_src_root; - } else - BUG_ON(parent > 0); + } else if (WARN_ON(parent > 0)) + return ERR_PTR(-EINVAL); if (root_objectid != BTRFS_TREE_LOG_OBJECTID) { struct btrfs_delayed_extent_op *extent_op; @@ -6437,7 +6480,8 @@ int btrfs_drop_subtree(struct btrfs_trans_handle *trans, int parent_level; int ret = 0; - BUG_ON(btrfs_root_id(root) != BTRFS_TREE_RELOC_OBJECTID); + if (WARN_ON(btrfs_root_id(root) != BTRFS_TREE_RELOC_OBJECTID)) + return -EINVAL; path = btrfs_alloc_path(); if (!path) -- 2.53.0