• Qu Wenruo's avatar
    btrfs: introduce new members for extent_map · 3d2ac992
    Qu Wenruo authored
    Introduce two new members for extent_map:
    
    - disk_bytenr
    - offset
    
    Both are matching the members with the same name inside
    btrfs_file_extent_items.
    
    For now this patch only touches those members when:
    
    - Reading btrfs_file_extent_items from disk
    - Inserting new holes
    - Merging two extent maps
      With the new disk_bytenr and disk_num_bytes, doing merging would be a
      little more complex, as we have 3 different cases:
    
      * Both extent maps are referring to the same data extents
        |<----- data extent A ----->|
           |<- em 1 ->|<- em 2 ->|
    
      * Both extent maps are referring to different data extents
        |<-- data extent A -->|<-- data extent B -->|
                   |<- em 1 ->|<- em 2 ->|
    
      * One of the extent maps is referring to a merged and larger data
        extent that covers both extent maps
    
        This is not really valid case other than some selftests.
        So this test case would be removed.
    
      A new helper merge_ondisk_extents() is introduced to handle the above
      valid cases.
    
    To properly assign values for those new members, a new btrfs_file_extent
    parameter is introduced to all the involved call sites.
    
    - For NOCOW writes the btrfs_file_extent would be exposed from
      can_nocow_file_extent().
    
    - For other writes, the members can be easily calculated
      As most of them have 0 offset and utilizing the whole on-disk data
      extent.
      The exception is encoded write, but thankfully that interface provided
      offset directly and all other needed info.
    
    For now, both the old members (block_start/block_len/orig_start) are
    co-existing with the new members (disk_bytenr/offset), meanwhile all the
    critical code is still using the old members only.
    
    The cleanup will happen later after all the old and new members are
    properly validated.
    
    There would be some re-ordering for the assignment of the extent_map
    members, now we follow the new ordering:
    
    - start and len
      Or file_pos and num_bytes for other structures.
    
    - disk_bytenr and disk_num_bytes
    - offset and ram_bytes
    - compression
    
    So expect some seemingly unrelated line movement.
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.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>
    3d2ac992
extent_map.h 6 KB