• Qu Wenruo's avatar
    btrfs: rework lzo_decompress_bio() to make it subpage compatible · a6e66e6f
    Qu Wenruo authored
    For the initial subpage support, although we won't support compressed
    write, we still need to support compressed read.
    
    But for lzo_decompress_bio() it has several problems:
    
    - The abuse of PAGE_SIZE for boundary detection
      For subpage case, we should follow sectorsize to detect the padding
      zeros.
      Using PAGE_SIZE will cause subpage compress read to skip certain
      bytes, and causing read error.
    
    - Too many helper variables
      There are half a dozen helper variables, which is only making things
      harder to read
    
    This patch will rework lzo_decompress_bio() to make it work for subpage:
    
    - Use sectorsize to do boundary check, while still use PAGE_SIZE for
      page switching
      This allows us to have the same on-disk format for 4K sectorsize fs,
      while take advantage of larger page size.
    
    - Use two main cursors
      Only @cur_in and @cur_out is utilized as the main cursor.
      The helper variables will only be declared inside the loop, and only 2
      helper variables needed.
    
    - Introduce a helper function to copy compressed segment payload
      Introduce a new helper, copy_compressed_segment(), to copy a
      compressed segment to workspace buffer.
      This function will handle the page switching.
    
    Now the net result is, with all the excessive comments and new helper
    function, the refactored code is still smaller, and easier to read.
    
    For other decompression code, they have no special padding rule, thus no
    need to bother for initial subpage support, but will be refactored to
    the same style later.
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    a6e66e6f
lzo.c 11.1 KB