• Qu Wenruo's avatar
    btrfs: refactor submit_extent_page() to make bio and its flag tracing easier · 390ed29b
    Qu Wenruo authored
    There is a lot of code inside extent_io.c needs both "struct bio
    **bio_ret" and "unsigned long prev_bio_flags", along with some
    parameters like "unsigned long bio_flags".
    
    Such strange parameters are here for bio assembly.
    
    For example, we have such inode page layout:
    
      0       4K      8K      12K
      |<-- Extent A-->|<- EB->|
    
    Then what we do is:
    
    - Page [0, 4K)
      *bio_ret = NULL
      So we allocate a new bio to bio_ret,
      Add page [0, 4K) to *bio_ret.
    
    - Page [4K, 8K)
      *bio_ret != NULL
      We found this page is continuous to *bio_ret,
      and if we're not at stripe boundary, we
      add page [4K, 8K) to *bio_ret.
    
    - Page [8K, 12K)
      *bio_ret != NULL
      But we found this page is not continuous, so
      we submit *bio_ret, then allocate a new bio,
      and add page [8K, 12K) to the new bio.
    
    This means we need to record both the bio and its bio_flag, but we
    record them manually using those strange parameter list, other than
    encapsulating them into their own structure.
    
    So this patch will introduce a new structure, btrfs_bio_ctrl, to record
    both the bio, and its bio_flags.
    
    Also, in above case, for all pages added to the bio, we need to check if
    the new page crosses stripe boundary.  This check itself can be time
    consuming, and we don't really need to do that for each page.
    
    This patch also integrates the stripe boundary check into btrfs_bio_ctrl.
    When a new bio is allocated, the stripe and ordered extent boundary is
    also calculated, so no matter how large the bio will be, we only
    calculate the boundaries once, to save some CPU time.
    
    The following functions/structures are affected:
    
    - struct extent_page_data
      Replace its bio pointer with structure btrfs_bio_ctrl (embedded
      structure, not pointer)
    
    - end_write_bio()
    - flush_write_bio()
      Just change how bio is fetched
    
    - btrfs_bio_add_page()
      Use pre-calculated boundaries instead of re-calculating them.
      And use @bio_ctrl to replace @bio and @prev_bio_flags.
    
    - calc_bio_boundaries()
      New function
    
    - submit_extent_page() callers
    - btrfs_do_readpage() callers
    - contiguous_readpages() callers
      To Use @bio_ctrl to replace @bio and @prev_bio_flags, and how to grab
      bio.
    
    - btrfs_bio_fits_in_ordered_extent()
      Removed, as now the ordered extent size limit is done at bio
      allocation time, no need to check for each page range.
    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>
    390ed29b
extent_io.c 186 KB