| From 902c5de9cc45c2b1d9bcb92b5648323da66e1b96 Mon Sep 17 00:00:00 2001 |
| From: Qu Wenruo <wqu@suse.com> |
| Date: Tue, 26 Feb 2019 16:33:56 +0800 |
| Subject: btrfs: Don't panic when we can't find a root key |
| |
| [ Upstream commit 7ac1e464c4d473b517bb784f30d40da1f842482e ] |
| |
| When we failed to find a root key in btrfs_update_root(), we just panic. |
| |
| That's definitely not cool, fix it by outputting an unique error |
| message, aborting current transaction and return -EUCLEAN. This should |
| not normally happen as the root has been used by the callers in some |
| way. |
| |
| Reviewed-by: Filipe Manana <fdmanana@suse.com> |
| Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> |
| Signed-off-by: Qu Wenruo <wqu@suse.com> |
| Reviewed-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/btrfs/root-tree.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c |
| index 1a92ad546f912..22124122728cd 100644 |
| --- a/fs/btrfs/root-tree.c |
| +++ b/fs/btrfs/root-tree.c |
| @@ -135,11 +135,14 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root |
| if (ret < 0) |
| goto out; |
| |
| - if (ret != 0) { |
| - btrfs_print_leaf(path->nodes[0]); |
| - btrfs_crit(fs_info, "unable to update root key %llu %u %llu", |
| - key->objectid, key->type, key->offset); |
| - BUG_ON(1); |
| + if (ret > 0) { |
| + btrfs_crit(fs_info, |
| + "unable to find root key (%llu %u %llu) in tree %llu", |
| + key->objectid, key->type, key->offset, |
| + root->root_key.objectid); |
| + ret = -EUCLEAN; |
| + btrfs_abort_transaction(trans, ret); |
| + goto out; |
| } |
| |
| l = path->nodes[0]; |
| -- |
| 2.20.1 |
| |