From: Anand Jain <anand.jain@oracle.com>
To: Qu Wenruo <wqu@suse.com>, linux-btrfs@vger.kernel.org
Cc: Zhenyu Wu <wuzy001@gmail.com>
Subject: Re: [PATCH v4] btrfs: rescue: allow ibadroots to skip bad extent tree when reading block group items
Date: Mon, 19 Jul 2021 16:19:07 +0800 [thread overview]
Message-ID: <da3f9aee-4464-d70b-e5a8-b1009999e2e2@oracle.com> (raw)
In-Reply-To: <20210719054304.181509-1-wqu@suse.com>
On 19/07/2021 13:43, Qu Wenruo wrote:
> When extent tree gets corrupted, normally it's not extent tree root, but
> one toasted tree leaf/node.
>
> In that case, rescue=ibadroots mount option won't help as it can only
> handle the extent tree root corruption.
>
> This patch will enhance the behavior by:
>
> - Allow fill_dummy_bgs() to ignore -EEXIST error
>
> This means we may have some block group items read from disk, but
> then hit some error halfway.
>
> - Fallback to fill_dummy_bgs() if any error gets hit in
> btrfs_read_block_groups()
>
> Of course, this still needs rescue=ibadroots mount option.
>
> With that, rescue=ibadroots can handle extent tree corruption more
> gracefully and allow a better recover chance.
>
> Reported-by: Zhenyu Wu <wuzy001@gmail.com>
> Link: https://www.spinics.net/lists/linux-btrfs/msg114424.html
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---
> Changelog:
> v2:
> - Don't try to fill with dummy block groups when we hit ENOMEM
> v3:
> - Remove a dead condition
> The empty fs_info->extent_root case has already been handled.
> v4:
> - Skip to next block group if we hit EEXIST when inserting the block
> group cache
> ---
> fs/btrfs/block-group.c | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
> index 5bd76a45037e..758ba856f8c6 100644
> --- a/fs/btrfs/block-group.c
> +++ b/fs/btrfs/block-group.c
> @@ -2105,11 +2105,22 @@ static int fill_dummy_bgs(struct btrfs_fs_info *fs_info)
> bg->used = em->len;
> bg->flags = map->type;
> ret = btrfs_add_block_group_cache(fs_info, bg);
> + /*
> + * We may have some valid block group cache added already, in
> + * that case we skip to next bg.
> + */
> + if (ret == -EEXIST) {
> + ret = 0;
> + btrfs_put_block_group(bg);
> + continue;
Looks good.
Reviewed-by: Anand Jain <anand.jain@oracle.com>
Thanks.
> + }
> +
> if (ret) {
> btrfs_remove_free_space_cache(bg);
> btrfs_put_block_group(bg);
> break;
> }
> +
> btrfs_update_space_info(fs_info, bg->flags, em->len, em->len,
> 0, 0, &space_info);
> bg->space_info = space_info;
> @@ -2212,6 +2223,14 @@ int btrfs_read_block_groups(struct btrfs_fs_info *info)
> ret = check_chunk_block_group_mappings(info);
> error:
> btrfs_free_path(path);
> + /*
> + * We hit some error reading the extent tree, and have rescue=ibadroots
> + * mount option.
> + * Try to fill using dummy block groups so that the user can continue
> + * to mount and grab their data.
> + */
> + if (ret && btrfs_test_opt(info, IGNOREBADROOTS))
> + ret = fill_dummy_bgs(info);
> return ret;
> }
>
>
next prev parent reply other threads:[~2021-07-19 9:54 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-19 5:43 [PATCH v4] btrfs: rescue: allow ibadroots to skip bad extent tree when reading block group items Qu Wenruo
2021-07-19 5:52 ` Su Yue
2021-07-19 8:19 ` Anand Jain [this message]
2021-07-21 17:33 ` David Sterba
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=da3f9aee-4464-d70b-e5a8-b1009999e2e2@oracle.com \
--to=anand.jain@oracle.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=wqu@suse.com \
--cc=wuzy001@gmail.com \
/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.