• Qu Wenruo's avatar
    btrfs: tree-checker: Don't check max block group size as current max chunk size limit is unreliable · 1aadbb4a
    Qu Wenruo authored
    commit 10950929 upstream.
    
    [BUG]
    A completely valid btrfs will refuse to mount, with error message like:
      BTRFS critical (device sdb2): corrupt leaf: root=2 block=239681536 slot=172 \
        bg_start=12018974720 bg_len=10888413184, invalid block group size, \
        have 10888413184 expect (0, 10737418240]
    
    This has been reported several times as the 4.19 kernel is now being
    used. The filesystem refuses to mount, but is otherwise ok and booting
    4.18 is a workaround.
    
    Btrfs check returns no error, and all kernels used on this fs is later
    than 2011, which should all have the 10G size limit commit.
    
    [CAUSE]
    For a 12 devices btrfs, we could allocate a chunk larger than 10G due to
    stripe stripe bump up.
    
    __btrfs_alloc_chunk()
    |- max_stripe_size = 1G
    |- max_chunk_size = 10G
    |- data_stripe = 11
    |- if (1G * 11 > 10G) {
           stripe_size = 976128930;
           stripe_size = round_up(976128930, SZ_16M) = 989855744
    
    However the final stripe_size (989855744) * 11 = 10888413184, which is
    still larger than 10G.
    
    [FIX]
    For the comprehensive check, we need to do the full check at chunk read
    time, and rely on bg <-> chunk mapping to do the check.
    
    We could just skip the length check for now.
    
    Fixes: fce466ea ("btrfs: tree-checker: Verify block_group_item")
    Cc: stable@vger.kernel.org # v4.19+
    Reported-by: default avatarWang Yugui <wangyugui@e16-tech.com>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    1aadbb4a
tree-checker.c 18.3 KB