All of lore.kernel.org
 help / color / mirror / Atom feed
From: Josef Bacik <josef@toxicpanda.com>
To: linux-btrfs@vger.kernel.org, kernel-team@fb.com
Subject: [PATCH v6 14/52] btrfs: convert BUG_ON()'s in select_reloc_root() to proper errors
Date: Tue,  8 Dec 2020 11:23:21 -0500	[thread overview]
Message-ID: <a4d509cfdddb7bb255a9be3565df2a4ba65b1e42.1607444471.git.josef@toxicpanda.com> (raw)
In-Reply-To: <cover.1607444471.git.josef@toxicpanda.com>

We have several BUG_ON()'s in select_reloc_root() that can be tripped if
you have extent tree corruption.  Convert these to ASSERT()'s, because
if we hit it during testing it really is bad, or could indicate a
problem with the backref walking code.

However if users hit these problems it generally indicates corruption,
I've hit a few machines in the fleet that trip over these with clearly
corrupted extent trees, so be nice and spit out an error message and
return an error instead of bringing the whole box down.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
 fs/btrfs/relocation.c | 47 +++++++++++++++++++++++++++++++++++++++----
 1 file changed, 43 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index 9a5293efe695..0d4c4e250a89 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -1996,8 +1996,33 @@ struct btrfs_root *select_reloc_root(struct btrfs_trans_handle *trans,
 		cond_resched();
 		next = walk_up_backref(next, edges, &index);
 		root = next->root;
-		BUG_ON(!root);
-		BUG_ON(!test_bit(BTRFS_ROOT_SHAREABLE, &root->state));
+
+		/*
+		 * If there is no root, then our references for this block are
+		 * incomplete, as we should be able to walk all the way up to a
+		 * block that is owned by a root.
+		 *
+		 * This path is only for SHAREABLE roots, so if we come upon a
+		 * non-SHAREABLE root then we have backrefs that resolve
+		 * improperly.
+		 *
+		 * Both of these cases indicate file system corruption, or a bug
+		 * in the backref walking code.
+		 */
+		if (!root) {
+			ASSERT(0);
+			btrfs_err(trans->fs_info,
+		"bytenr %llu doesn't have a backref path ending in a root",
+				  node->bytenr);
+			return ERR_PTR(-EUCLEAN);
+		}
+		if (!test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) {
+			ASSERT(0);
+			btrfs_err(trans->fs_info,
+"bytenr %llu has multiple refs with one ending in a non shareable root",
+				  node->bytenr);
+			return ERR_PTR(-EUCLEAN);
+		}
 
 		if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
 			record_reloc_root_in_trans(trans, root);
@@ -2008,8 +2033,22 @@ struct btrfs_root *select_reloc_root(struct btrfs_trans_handle *trans,
 		root = root->reloc_root;
 
 		if (next->new_bytenr != root->node->start) {
-			BUG_ON(next->new_bytenr);
-			BUG_ON(!list_empty(&next->list));
+			/*
+			 * We just created the reloc root, so we shouldn't have
+			 * ->new_bytenr set and this shouldn't be in the changed
+			 *  list.  If it is then we have multiple roots pointing
+			 *  at the same bytenr which indicates corruption, or
+			 *  we've made a mistake in the backref walking code.
+			 */
+			ASSERT(next->new_bytenr == 0);
+			ASSERT(list_empty(&next->list));
+			if (next->new_bytenr || !list_empty(&next->list)) {
+				btrfs_err(trans->fs_info,
+"bytenr %llu possibly has multiple roots pointing at the same bytenr %llu",
+					  node->bytenr, next->bytenr);
+				return ERR_PTR(-EUCLEAN);
+			}
+
 			next->new_bytenr = root->node->start;
 			btrfs_put_root(next->root);
 			next->root = btrfs_grab_root(root);
-- 
2.26.2


  parent reply	other threads:[~2020-12-08 16:25 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-08 16:23 [PATCH v6 00/52] Josef Bacik
2020-12-08 16:23 ` [PATCH v6 01/52] btrfs: allow error injection for btrfs_search_slot and btrfs_cow_block Josef Bacik
2020-12-08 16:23 ` [PATCH v6 02/52] btrfs: modify the new_root highest_objectid under a ref count Josef Bacik
2020-12-08 16:23 ` [PATCH v6 03/52] btrfs: fix lockdep splat in btrfs_recover_relocation Josef Bacik
2020-12-08 16:23 ` [PATCH v6 04/52] btrfs: keep track of the root owner for relocation reads Josef Bacik
2020-12-08 16:23 ` [PATCH v6 05/52] btrfs: noinline btrfs_should_cancel_balance Josef Bacik
2020-12-08 16:23 ` [PATCH v6 06/52] btrfs: do not cleanup upper nodes in btrfs_backref_cleanup_node Josef Bacik
2020-12-08 16:23 ` [PATCH v6 07/52] btrfs: pass down the tree block level through ref-verify Josef Bacik
2020-12-08 16:23 ` [PATCH v6 08/52] btrfs: make sure owner is set in ref-verify Josef Bacik
2020-12-08 16:23 ` [PATCH v6 09/52] btrfs: don't clear ret in btrfs_start_dirty_block_groups Josef Bacik
2020-12-08 16:23 ` [PATCH v6 10/52] btrfs: convert some BUG_ON()'s to ASSERT()'s in do_relocation Josef Bacik
2020-12-08 16:23 ` [PATCH v6 11/52] btrfs: convert BUG_ON()'s in relocate_tree_block Josef Bacik
2020-12-08 16:23 ` [PATCH v6 12/52] btrfs: return an error from btrfs_record_root_in_trans Josef Bacik
2020-12-08 16:23 ` [PATCH v6 13/52] btrfs: handle errors from select_reloc_root() Josef Bacik
2020-12-08 16:23 ` Josef Bacik [this message]
2020-12-08 16:23 ` [PATCH v6 15/52] btrfs: check record_root_in_trans related failures in select_reloc_root Josef Bacik
2020-12-08 16:23 ` [PATCH v6 16/52] btrfs: do proper error handling in record_reloc_root_in_trans Josef Bacik
2020-12-08 16:23 ` [PATCH v6 17/52] btrfs: handle btrfs_record_root_in_trans failure in btrfs_rename_exchange Josef Bacik
2020-12-08 16:23 ` [PATCH v6 18/52] btrfs: handle btrfs_record_root_in_trans failure in btrfs_rename Josef Bacik
2020-12-08 16:23 ` [PATCH v6 19/52] btrfs: handle btrfs_record_root_in_trans failure in btrfs_delete_subvolume Josef Bacik
2020-12-08 16:23 ` [PATCH v6 20/52] btrfs: handle btrfs_record_root_in_trans failure in btrfs_recover_log_trees Josef Bacik
2020-12-08 16:23 ` [PATCH v6 21/52] btrfs: handle btrfs_record_root_in_trans failure in create_subvol Josef Bacik
2020-12-08 16:23 ` [PATCH v6 22/52] btrfs: btrfs: handle btrfs_record_root_in_trans failure in relocate_tree_block Josef Bacik
2020-12-08 16:23 ` [PATCH v6 23/52] btrfs: handle btrfs_record_root_in_trans failure in start_transaction Josef Bacik
2020-12-08 16:23 ` [PATCH v6 24/52] btrfs: handle record_root_in_trans failure in qgroup_account_snapshot Josef Bacik
2020-12-08 16:23 ` [PATCH v6 25/52] btrfs: handle record_root_in_trans failure in btrfs_record_root_in_trans Josef Bacik
2020-12-08 16:23 ` [PATCH v6 26/52] btrfs: handle record_root_in_trans failure in create_pending_snapshot Josef Bacik
2020-12-08 16:23 ` [PATCH v6 27/52] btrfs: do not panic in __add_reloc_root Josef Bacik
2020-12-08 16:23 ` [PATCH v6 28/52] btrfs: have proper error handling in btrfs_init_reloc_root Josef Bacik
2020-12-08 16:23 ` [PATCH v6 29/52] btrfs: do proper error handling in create_reloc_root Josef Bacik
2020-12-08 16:23 ` [PATCH v6 30/52] btrfs: validate ->reloc_root after recording root in trans Josef Bacik
2020-12-08 16:23 ` [PATCH v6 31/52] btrfs: handle btrfs_update_reloc_root failure in commit_fs_roots Josef Bacik
2020-12-08 16:23 ` [PATCH v6 32/52] btrfs: change insert_dirty_subvol to return errors Josef Bacik
2020-12-08 16:23 ` [PATCH v6 33/52] btrfs: handle btrfs_update_reloc_root failure in insert_dirty_subvol Josef Bacik
2020-12-08 16:23 ` [PATCH v6 34/52] btrfs: handle btrfs_update_reloc_root failure in prepare_to_merge Josef Bacik
2020-12-08 16:23 ` [PATCH v6 35/52] btrfs: do proper error handling in btrfs_update_reloc_root Josef Bacik
2020-12-08 16:23 ` [PATCH v6 36/52] btrfs: convert logic BUG_ON()'s in replace_path to ASSERT()'s Josef Bacik
2020-12-08 16:23 ` [PATCH v6 37/52] btrfs: handle btrfs_cow_block errors in replace_path Josef Bacik
2020-12-08 16:23 ` [PATCH v6 38/52] btrfs: handle btrfs_search_slot failure " Josef Bacik
2020-12-08 16:23 ` [PATCH v6 39/52] btrfs: handle errors in reference count manipulation " Josef Bacik
2020-12-08 16:23 ` [PATCH v6 40/52] btrfs: handle extent reference errors in do_relocation Josef Bacik
2020-12-08 16:23 ` [PATCH v6 41/52] btrfs: check for BTRFS_BLOCK_FLAG_FULL_BACKREF being set improperly Josef Bacik
2020-12-08 16:23 ` [PATCH v6 42/52] btrfs: remove the extent item sanity checks in relocate_block_group Josef Bacik
2020-12-08 16:23 ` [PATCH v6 43/52] btrfs: do proper error handling in create_reloc_inode Josef Bacik
2020-12-08 16:23 ` [PATCH v6 44/52] btrfs: handle __add_reloc_root failures in btrfs_recover_relocation Josef Bacik
2020-12-08 16:23 ` [PATCH v6 45/52] btrfs: cleanup error handling in prepare_to_merge Josef Bacik
2020-12-08 16:23 ` [PATCH v6 46/52] btrfs: handle extent corruption with select_one_root properly Josef Bacik
2020-12-08 16:23 ` [PATCH v6 47/52] btrfs: do proper error handling in merge_reloc_roots Josef Bacik
2020-12-08 16:23 ` [PATCH v6 48/52] btrfs: check return value of btrfs_commit_transaction in relocation Josef Bacik
2020-12-08 16:23 ` [PATCH v6 49/52] btrfs: do not WARN_ON() if we can't find the reloc root Josef Bacik
2020-12-08 16:23 ` [PATCH v6 50/52] btrfs: print the actual offset in btrfs_root_name Josef Bacik
2020-12-08 16:23 ` [PATCH v6 51/52] btrfs: fix reloc root leak with 0 ref reloc roots on recovery Josef Bacik
2020-12-08 16:23 ` [PATCH v6 52/52] btrfs: splice remaining dirty_bg's onto the transaction dirty bg list Josef Bacik
2020-12-08 19:46 ` [PATCH v6 00/52] Zygo Blaxell
2020-12-13 22:26   ` Zygo Blaxell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a4d509cfdddb7bb255a9be3565df2a4ba65b1e42.1607444471.git.josef@toxicpanda.com \
    --to=josef@toxicpanda.com \
    --cc=kernel-team@fb.com \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.