From: Josef Bacik <josef@toxicpanda.com>
To: linux-btrfs@vger.kernel.org, kernel-team@fb.com
Subject: [PATCH v3 00/54] Cleanup error handling in relocation
Date: Wed, 2 Dec 2020 14:50:18 -0500 [thread overview]
Message-ID: <cover.1606938211.git.josef@toxicpanda.com> (raw)
v2->v3:
- A lot of extra patches fixing various things that I encountered while
debugging the corruption problem that was uncovered by these patches.
- Fixed the panic that Zygo was seeing and other issues.
- Fixed up the comments from Nikolay and Filipe.
A slight note, the first set of patches could probably be taken now, and in fact
btrfs: fix error handling in commit_fs_roots
Was sent earlier this week and is very important and needs to be reviewed and
merged ASAP. The following are safe and could be merged outside of the rest of
this series
btrfs: allow error injection for btrfs_search_slot and btrfs_cow_block
btrfs: fix lockdep splat in btrfs_recover_relocation
btrfs: keep track of the root owner for relocation reads
btrfs: noinline btrfs_should_cancel_balance
btrfs: do not cleanup upper nodes in btrfs_backref_cleanup_node
btrfs: pass down the tree block level through ref-verify
btrfs: make sure owner is set in ref-verify
btrfs: don't clear ret in btrfs_start_dirty_block_groups
The rest obviously are all around the actual error handling.
v1->v2:
- fixed a bug where I accidentally dropped reading flags in relocate_block_group
when I dropped the extra checks that we handle in the tree checker.
--- Original message ---
Hello,
Relocation is the last place that is not able to handle errors at all, which
results in all sorts of lovely panics if you encounter corruptions or IO errors.
I'm going to start cleaning up relocation, but before I move code around I want
the error handling to be somewhat sane, so I'm not changing behavior and error
handling at the same time.
These patches are purely about error handling, there is no behavior changing
other than returning errors up the chain properly. There is a lot of room for
follow up cleanups, which will happen next. However I wanted to get this series
done today and out so we could get it merged ASAP, and then the follow up
cleanups can happen later as they are less important and less critical.
The only exception to the above is the patch to add the error injection sites
for btrfs_cow_block and btrfs_search_slot, and a lockdep fix that I discovered
while running my tests, those are the first two patches in the series.
I tested this with my error injection stress test, where I keep track of all
stack traces that have been tested and only inject errors when we have a new
stack trace, which means I should have covered all of the various error
conditions. With this patchset I'm no longer panicing while stressing the error
conditions. Thanks,
Josef
Josef Bacik (54):
btrfs: fix error handling in commit_fs_roots
btrfs: allow error injection for btrfs_search_slot and btrfs_cow_block
btrfs: fix lockdep splat in btrfs_recover_relocation
btrfs: keep track of the root owner for relocation reads
btrfs: noinline btrfs_should_cancel_balance
btrfs: do not cleanup upper nodes in btrfs_backref_cleanup_node
btrfs: pass down the tree block level through ref-verify
btrfs: make sure owner is set in ref-verify
btrfs: don't clear ret in btrfs_start_dirty_block_groups
btrfs: convert some BUG_ON()'s to ASSERT()'s in do_relocation
btrfs: convert BUG_ON()'s in relocate_tree_block
btrfs: return an error from btrfs_record_root_in_trans
btrfs: handle errors from select_reloc_root()
btrfs: convert BUG_ON()'s in select_reloc_root() to proper errors
btrfs: check record_root_in_trans related failures in
select_reloc_root
btrfs: do proper error handling in record_reloc_root_in_trans
btrfs: handle btrfs_record_root_in_trans failure in
btrfs_rename_exchange
btrfs: handle btrfs_record_root_in_trans failure in btrfs_rename
btrfs: handle btrfs_record_root_in_trans failure in
btrfs_delete_subvolume
btrfs: handle btrfs_record_root_in_trans failure in
btrfs_recover_log_trees
btrfs: handle btrfs_record_root_in_trans failure in create_subvol
btrfs: btrfs: handle btrfs_record_root_in_trans failure in
relocate_tree_block
btrfs: handle btrfs_record_root_in_trans failure in start_transaction
btrfs: handle record_root_in_trans failure in qgroup_account_snapshot
btrfs: handle record_root_in_trans failure in
btrfs_record_root_in_trans
btrfs: handle record_root_in_trans failure in create_pending_snapshot
btrfs: do not panic in __add_reloc_root
btrfs: have proper error handling in btrfs_init_reloc_root
btrfs: do proper error handling in create_reloc_root
btrfs: validate ->reloc_root after recording root in trans
btrfs: handle btrfs_update_reloc_root failure in commit_fs_roots
btrfs: change insert_dirty_subvol to return errors
btrfs: handle btrfs_update_reloc_root failure in insert_dirty_subvol
btrfs: handle btrfs_update_reloc_root failure in prepare_to_merge
btrfs: do proper error handling in btrfs_update_reloc_root
btrfs: convert logic BUG_ON()'s in replace_path to ASSERT()'s
btrfs: handle initial btrfs_cow_block error in replace_path
btrfs: handle the loop btrfs_cow_block error in replace_path
btrfs: handle btrfs_search_slot failure in replace_path
btrfs: handle errors in reference count manipulation in replace_path
btrfs: handle extent reference errors in do_relocation
btrfs: check for BTRFS_BLOCK_FLAG_FULL_BACKREF being set improperly
btrfs: remove the extent item sanity checks in relocate_block_group
btrfs: do proper error handling in create_reloc_inode
btrfs: handle __add_reloc_root failure in btrfs_recover_relocation
btrfs: handle __add_reloc_root failure in btrfs_reloc_post_snapshot
btrfs: cleanup error handling in prepare_to_merge
btrfs: handle extent corruption with select_one_root properly
btrfs: do proper error handling in merge_reloc_roots
btrfs: check return value of btrfs_commit_transaction in relocation
btrfs: do not WARN_ON() if we can't find the reloc root
btrfs: print the actual offset in btrfs_root_name
btrfs: fix reloc root leak with 0 ref reloc roots on recovery
btrfs: splice remaining dirty_bg's onto the transaction dirty bg list
fs/btrfs/backref.c | 9 +-
fs/btrfs/block-group.c | 6 +-
fs/btrfs/ctree.c | 2 +
fs/btrfs/disk-io.c | 2 +-
fs/btrfs/inode.c | 20 +-
fs/btrfs/ioctl.c | 6 +-
fs/btrfs/print-tree.c | 10 +-
fs/btrfs/print-tree.h | 2 +-
fs/btrfs/ref-verify.c | 43 ++--
fs/btrfs/relocation.c | 438 +++++++++++++++++++++++++++++++---------
fs/btrfs/transaction.c | 46 +++--
fs/btrfs/tree-checker.c | 5 +
fs/btrfs/tree-log.c | 8 +-
fs/btrfs/volumes.c | 2 +
14 files changed, 440 insertions(+), 159 deletions(-)
--
2.26.2
next reply other threads:[~2020-12-02 19:51 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-02 19:50 Josef Bacik [this message]
2020-12-02 19:50 ` [PATCH v3 01/54] btrfs: fix error handling in commit_fs_roots Josef Bacik
2020-12-03 1:45 ` Qu Wenruo
2020-12-03 8:09 ` Johannes Thumshirn
2020-12-02 19:50 ` [PATCH v3 02/54] btrfs: allow error injection for btrfs_search_slot and btrfs_cow_block Josef Bacik
2020-12-03 1:48 ` Qu Wenruo
2020-12-03 8:21 ` Johannes Thumshirn
2020-12-02 19:50 ` [PATCH v3 03/54] btrfs: fix lockdep splat in btrfs_recover_relocation Josef Bacik
2020-12-03 1:49 ` Qu Wenruo
2020-12-03 8:44 ` Johannes Thumshirn
2020-12-02 19:50 ` [PATCH v3 04/54] btrfs: keep track of the root owner for relocation reads Josef Bacik
2020-12-03 2:04 ` Qu Wenruo
2020-12-03 15:55 ` Josef Bacik
2020-12-02 19:50 ` [PATCH v3 05/54] btrfs: noinline btrfs_should_cancel_balance Josef Bacik
2020-12-03 2:06 ` Qu Wenruo
2020-12-03 8:44 ` Johannes Thumshirn
2020-12-03 9:00 ` Nikolay Borisov
2020-12-03 17:04 ` Josef Bacik
2020-12-02 19:50 ` [PATCH v3 06/54] btrfs: do not cleanup upper nodes in btrfs_backref_cleanup_node Josef Bacik
2020-12-03 2:08 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 07/54] btrfs: pass down the tree block level through ref-verify Josef Bacik
2020-12-02 19:50 ` [PATCH v3 08/54] btrfs: make sure owner is set in ref-verify Josef Bacik
2020-12-02 19:50 ` [PATCH v3 09/54] btrfs: don't clear ret in btrfs_start_dirty_block_groups Josef Bacik
2020-12-03 2:13 ` Qu Wenruo
2020-12-03 8:58 ` Johannes Thumshirn
2020-12-02 19:50 ` [PATCH v3 10/54] btrfs: convert some BUG_ON()'s to ASSERT()'s in do_relocation Josef Bacik
2020-12-03 2:14 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 11/54] btrfs: convert BUG_ON()'s in relocate_tree_block Josef Bacik
2020-12-03 2:15 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 12/54] btrfs: return an error from btrfs_record_root_in_trans Josef Bacik
2020-12-03 2:20 ` Qu Wenruo
2020-12-03 13:50 ` Johannes Thumshirn
2020-12-02 19:50 ` [PATCH v3 13/54] btrfs: handle errors from select_reloc_root() Josef Bacik
2020-12-03 2:23 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 14/54] btrfs: convert BUG_ON()'s in select_reloc_root() to proper errors Josef Bacik
2020-12-03 2:29 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 15/54] btrfs: check record_root_in_trans related failures in select_reloc_root Josef Bacik
2020-12-03 2:33 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 16/54] btrfs: do proper error handling in record_reloc_root_in_trans Josef Bacik
2020-12-03 2:39 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 17/54] btrfs: handle btrfs_record_root_in_trans failure in btrfs_rename_exchange Josef Bacik
2020-12-03 2:40 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 18/54] btrfs: handle btrfs_record_root_in_trans failure in btrfs_rename Josef Bacik
2020-12-02 19:50 ` [PATCH v3 19/54] btrfs: handle btrfs_record_root_in_trans failure in btrfs_delete_subvolume Josef Bacik
2020-12-03 2:41 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 20/54] btrfs: handle btrfs_record_root_in_trans failure in btrfs_recover_log_trees Josef Bacik
2020-12-03 2:42 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 21/54] btrfs: handle btrfs_record_root_in_trans failure in create_subvol Josef Bacik
2020-12-03 2:43 ` Qu Wenruo
2020-12-03 16:06 ` Josef Bacik
2020-12-02 19:50 ` [PATCH v3 22/54] btrfs: btrfs: handle btrfs_record_root_in_trans failure in relocate_tree_block Josef Bacik
2020-12-03 2:44 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 23/54] btrfs: handle btrfs_record_root_in_trans failure in start_transaction Josef Bacik
2020-12-03 2:47 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 24/54] btrfs: handle record_root_in_trans failure in qgroup_account_snapshot Josef Bacik
2020-12-03 2:48 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 25/54] btrfs: handle record_root_in_trans failure in btrfs_record_root_in_trans Josef Bacik
2020-12-02 19:50 ` [PATCH v3 26/54] btrfs: handle record_root_in_trans failure in create_pending_snapshot Josef Bacik
2020-12-03 2:56 ` Qu Wenruo
2020-12-03 16:14 ` Josef Bacik
2020-12-02 19:50 ` [PATCH v3 27/54] btrfs: do not panic in __add_reloc_root Josef Bacik
2020-12-03 3:00 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 28/54] btrfs: have proper error handling in btrfs_init_reloc_root Josef Bacik
2020-12-02 19:50 ` [PATCH v3 29/54] btrfs: do proper error handling in create_reloc_root Josef Bacik
2020-12-03 3:29 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 30/54] btrfs: validate ->reloc_root after recording root in trans Josef Bacik
2020-12-03 4:49 ` Qu Wenruo
2020-12-03 16:18 ` Josef Bacik
2020-12-02 19:50 ` [PATCH v3 31/54] btrfs: handle btrfs_update_reloc_root failure in commit_fs_roots Josef Bacik
2020-12-03 4:51 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 32/54] btrfs: change insert_dirty_subvol to return errors Josef Bacik
2020-12-02 19:50 ` [PATCH v3 33/54] btrfs: handle btrfs_update_reloc_root failure in insert_dirty_subvol Josef Bacik
2020-12-02 19:50 ` [PATCH v3 34/54] btrfs: handle btrfs_update_reloc_root failure in prepare_to_merge Josef Bacik
2020-12-02 19:50 ` [PATCH v3 35/54] btrfs: do proper error handling in btrfs_update_reloc_root Josef Bacik
2020-12-03 4:54 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 36/54] btrfs: convert logic BUG_ON()'s in replace_path to ASSERT()'s Josef Bacik
2020-12-03 4:55 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 37/54] btrfs: handle initial btrfs_cow_block error in replace_path Josef Bacik
2020-12-03 5:05 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 38/54] btrfs: handle the loop " Josef Bacik
2020-12-03 5:11 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 39/54] btrfs: handle btrfs_search_slot failure " Josef Bacik
2020-12-03 5:13 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 40/54] btrfs: handle errors in reference count manipulation " Josef Bacik
2020-12-03 5:14 ` Qu Wenruo
2020-12-02 19:50 ` [PATCH v3 41/54] btrfs: handle extent reference errors in do_relocation Josef Bacik
2020-12-03 5:15 ` Qu Wenruo
2020-12-03 16:26 ` Josef Bacik
2020-12-02 19:51 ` [PATCH v3 42/54] btrfs: check for BTRFS_BLOCK_FLAG_FULL_BACKREF being set improperly Josef Bacik
2020-12-03 5:19 ` Qu Wenruo
2020-12-02 19:51 ` [PATCH v3 43/54] btrfs: remove the extent item sanity checks in relocate_block_group Josef Bacik
2020-12-03 5:20 ` Qu Wenruo
2020-12-02 19:51 ` [PATCH v3 44/54] btrfs: do proper error handling in create_reloc_inode Josef Bacik
2020-12-03 5:25 ` Qu Wenruo
2020-12-03 16:34 ` Josef Bacik
2020-12-02 19:51 ` [PATCH v3 45/54] btrfs: handle __add_reloc_root failure in btrfs_recover_relocation Josef Bacik
2020-12-03 5:32 ` Qu Wenruo
2020-12-02 19:51 ` [PATCH v3 46/54] btrfs: handle __add_reloc_root failure in btrfs_reloc_post_snapshot Josef Bacik
2020-12-03 5:34 ` Qu Wenruo
2020-12-02 19:51 ` [PATCH v3 47/54] btrfs: cleanup error handling in prepare_to_merge Josef Bacik
2020-12-03 5:39 ` Qu Wenruo
2020-12-03 16:53 ` Josef Bacik
2020-12-02 19:51 ` [PATCH v3 48/54] btrfs: handle extent corruption with select_one_root properly Josef Bacik
2020-12-03 5:40 ` Qu Wenruo
2020-12-02 19:51 ` [PATCH v3 49/54] btrfs: do proper error handling in merge_reloc_roots Josef Bacik
2020-12-03 5:42 ` Qu Wenruo
2020-12-02 19:51 ` [PATCH v3 50/54] btrfs: check return value of btrfs_commit_transaction in relocation Josef Bacik
2020-12-03 5:42 ` Qu Wenruo
2020-12-02 19:51 ` [PATCH v3 51/54] btrfs: do not WARN_ON() if we can't find the reloc root Josef Bacik
2020-12-02 19:51 ` [PATCH v3 52/54] btrfs: print the actual offset in btrfs_root_name Josef Bacik
2020-12-03 5:44 ` Qu Wenruo
2020-12-02 19:51 ` [PATCH v3 53/54] btrfs: fix reloc root leak with 0 ref reloc roots on recovery Josef Bacik
2020-12-02 19:51 ` [PATCH v3 54/54] btrfs: splice remaining dirty_bg's onto the transaction dirty bg list Josef Bacik
2020-12-03 5:47 ` Qu Wenruo
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=cover.1606938211.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox