• Qu Wenruo's avatar
    btrfs: qgroup: prealloc btrfs_qgroup_list for __add_relation_rb() · 79ace7b8
    Qu Wenruo authored
    Currently we go GFP_ATOMIC allocation for qgroup relation add, this
    includes the following 3 call sites:
    
    - btrfs_read_qgroup_config()
      This is not really needed, as at that time we're still in single
      thread mode, and no spin lock is held.
    
    - btrfs_add_qgroup_relation()
      This one is holding a spinlock, but we're ensured to add at most one
      relation, thus we can easily do a preallocation and use the
      preallocated memory to avoid GFP_ATOMIC.
    
    - btrfs_qgroup_inherit()
      This is a little more tricky, as we may have as many relationships as
      inherit::num_qgroups.
      Thus we have to properly allocate an array then preallocate all the
      memory.
    
    This patch would remove the GFP_ATOMIC allocation for above involved
    call sites, by doing preallocation before holding the spinlock, and let
    __add_relation_rb() to handle the freeing of the structure.
    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>
    79ace7b8
qgroup.c 116 KB