• Qu Wenruo's avatar
    btrfs: replace btrfs_io_context::raid_map with a fixed u64 value · 18d758a2
    Qu Wenruo authored
    In btrfs_io_context structure, we have a pointer raid_map, which
    indicates the logical bytenr for each stripe.
    
    But considering we always call sort_parity_stripes(), the result
    raid_map[] is always sorted, thus raid_map[0] is always the logical
    bytenr of the full stripe.
    
    So why we waste the space and time (for sorting) for raid_map?
    
    This patch will replace btrfs_io_context::raid_map with a single u64
    number, full_stripe_start, by:
    
    - Replace btrfs_io_context::raid_map with full_stripe_start
    
    - Replace call sites using raid_map[0] to use full_stripe_start
    
    - Replace call sites using raid_map[i] to compare with nr_data_stripes.
    
    The benefits are:
    
    - Less memory wasted on raid_map
      It's sizeof(u64) * num_stripes vs sizeof(u64).
      It'll always save at least one u64, and the benefit grows larger with
      num_stripes.
    
    - No more weird alloc_btrfs_io_context() behavior
      As there is only one fixed size + one variable length array.
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    18d758a2
raid56.c 74 KB