• Qu Wenruo's avatar
    btrfs: refactor main loop in memcpy_extent_buffer() · 13840f3f
    Qu Wenruo authored
    [BACKGROUND]
    Currently memcpy_extent_buffer() does a loop where it would stop at
    any page boundary inside [dst_offset, dst_offset + len) or [src_offset,
    src_offset + len).
    
    This is mostly allowing us to do copy_pages(), but if we're going to use
    folios we will need to handle multi-page (the old behavior) or single
    folio (the new optimization).
    
    The current code would be a burden for future changes.
    
    [ENHANCEMENT]
    There is a hidden pitfall of the naming memcpy_extent_buffer(), unlike
    regular memcpy(), this function can handle overlapping ranges.
    
    So here we extract write_extent_buffer() into a new internal helper,
    __write_extent_buffer(), and add a new parameter @use_memmove, to
    indicate whether we should use memmove() or regular memcpy().
    
    Now we can go __write_extent_buffer() to handle writing into the dst
    range, with proper overlapping detection.
    
    This has a tiny change to the chance of calling memmove().
    As the split only happens at the source range page boundaries, the
    memcpy/memmove() range would be slightly larger than the old code,
    thus slightly increase the chance we call memmove() other than memcopy().
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    13840f3f
extent_io.c 129 KB