• Qu Wenruo's avatar
    btrfs: scrub: reduce width of extent_len/stripe_len from 64 to 32 bits · fa485d21
    Qu Wenruo authored
    Btrfs on-disk format chose to use u64 for almost everything, but there
    are a other restrictions that won't let us use more than u32 for things
    like extent length (the maximum length is 128MiB for non-hole extents),
    or stripe length (we have device number limit).
    
    This means if we don't have extra handling to convert u64 to u32, we
    will always have some questionable operations like
    "u32 = u64 >> sectorsize_bits" in the code.
    
    This patch will try to address the problem by reducing the width for the
    following members/parameters:
    
    - scrub_parity::stripe_len
    - @len of scrub_pages()
    - @extent_len of scrub_remap_extent()
    - @len of scrub_parity_mark_sectors_error()
    - @len of scrub_parity_mark_sectors_data()
    - @len of scrub_extent()
    - @len of scrub_pages_for_parity()
    - @len of scrub_extent_for_parity()
    
    For members extracted from on-disk structure, like map->stripe_len, they
    will be kept as is. Since that modification would require on-disk format
    change.
    
    There will be cases like "u32 = u64 - u64" or "u32 = u64", for such call
    sites, extra ASSERT() is added to be extra safe for debug builds.
    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>
    fa485d21
scrub.c 109 KB