• Qu Wenruo's avatar
    btrfs: make attach_extent_buffer_page() handle subpage case · 760f991f
    Qu Wenruo authored
    For subpage case, we need to allocate additional memory for each
    metadata page.
    
    So we need to:
    
    - Allow attach_extent_buffer_page() to return int to indicate allocation
      failure
    
    - Allow manually pre-allocate subpage memory for alloc_extent_buffer()
      As we don't want to use GFP_ATOMIC under spinlock, we introduce
      btrfs_alloc_subpage() and btrfs_free_subpage() functions for this
      purpose.
      (The simple wrap for btrfs_free_subpage() is for later convert to
       kmem_cache. Already internally tested without problem)
    
    - Preallocate btrfs_subpage structure for alloc_extent_buffer()
      We don't want to call memory allocation with spinlock held, so
      do preallocation before we acquire mapping->private_lock.
    
    - Handle subpage and regular case differently in
      attach_extent_buffer_page()
      For regular case, no change, just do the usual thing.
      For subpage case, allocate new memory or use the preallocated memory.
    
    For future subpage metadata, we will make use of radix tree to grab
    extent buffer.
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.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>
    760f991f
extent_io.c 163 KB