On Fri, Apr 06, 2018 at 02:39:19PM +0800, Qu Wenruo wrote:
> Corrupted extent tree (either the root node or leaf) can normally block
> us from open the fs.
> As normally open_ctree() has the following call chain:
> __open_ctree_fd()
> |- btrfs_setup_all_roots()
>    |- btrfs_read_block_groups()
>       And we will search block group items in extent tree.
> 
> And considering how block group items are scattered around the whole
> extent tree, any error would block the fs from being mounted.
> 
> Fortunately, we already have OPEN_CTREE_NO_BLOCK_GROUPS flags to disable
> block group items search, which will not only allow us to open some
> fs, but also hugely speed up open time.
> 
> Currently dump-tree and btrfs-restore is ensured that they care nothing
> about block group items. So specify OPEN_CTREE_NO_BLOCK_GROUPS flag as
> default.
> 
> Also fix a typo where dump-tree is using OPEN_CTREE_FS_PARTIAL, which
> should be OPEN_CTREE_PARTIAL.
> This makes dump-tree do more check and can sometimes fail to open
> certain filesystems.

Oh, that's too easy to get wrong, we should rename one or the other.

> Reported-by: Christoph Anton Mitterer <cales...@scientia.net>
> Fixes: 8698a2b9ba89 ("btrfs-progs: Allow inspect dump-tree to show specified 
> tree block even some tree roots are corrupted")
> Signed-off-by: Qu Wenruo <w...@suse.com>
> ---
>  cmds-inspect-dump-tree.c | 4 +++-
>  cmds-restore.c           | 3 ++-
>  2 files changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/cmds-inspect-dump-tree.c b/cmds-inspect-dump-tree.c
> index 7defb7164a49..8be976041543 100644
> --- a/cmds-inspect-dump-tree.c
> +++ b/cmds-inspect-dump-tree.c
> @@ -303,7 +303,9 @@ int cmd_inspect_dump_tree(int argc, char **argv)
>       int uuid_tree_only = 0;
>       int roots_only = 0;
>       int root_backups = 0;
> -     unsigned open_ctree_flags = OPEN_CTREE_FS_PARTIAL;
> +     /* Speed up open_ctree() and continue if extent tree is corrupted */
> +     unsigned open_ctree_flags = OPEN_CTREE_PARTIAL |
> +                                 OPEN_CTREE_NO_BLOCK_GROUPS;

We could consider that separatelly, whether to allow dumping a partially
created filesystem, ie. OPEN_CTREE_FS_PARTIAL added by a new option.
This would be really for debugging/testing purposes, but could be useful
when the filesystem is prefilled with files or if we enable the runtime
features and the final write fails for some reason.

>       u64 block_bytenr;
>       struct btrfs_root *tree_root_scan;
>       u64 tree_id = 0;
> diff --git a/cmds-restore.c b/cmds-restore.c
> index ade35f0f880f..b43bd2ac6502 100644
> --- a/cmds-restore.c
> +++ b/cmds-restore.c
> @@ -1282,7 +1282,8 @@ static struct btrfs_root *open_fs(const char *dev, u64 
> root_location,
>       for (i = super_mirror; i < BTRFS_SUPER_MIRROR_MAX; i++) {
>               bytenr = btrfs_sb_offset(i);
>               fs_info = open_ctree_fs_info(dev, bytenr, root_location, 0,
> -                                          OPEN_CTREE_PARTIAL);
> +                                          OPEN_CTREE_PARTIAL |
> +                                          OPEN_CTREE_NO_BLOCK_GROUPS);
>               if (fs_info)
>                       break;
>               fprintf(stderr, "Could not open root, trying backup super\n");

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to