• Filipe Manana's avatar
    Btrfs: fix necessary chunk tree space calculation when allocating a chunk · 4617ea3a
    Filipe Manana authored
    When allocating a new chunk or removing one we need to update num_devs
    device items and insert or remove a chunk item in the chunk tree, so
    in the worst case the space needed in the chunk space_info is:
    
      btrfs_calc_trunc_metadata_size(chunk_root, num_devs) +
         btrfs_calc_trans_metadata_size(chunk_root, 1)
    
    That is, in the worst case we need to cow num_devs paths and cow 1 other
    path that can result in splitting every node and leaf, and each path
    consisting of BTRFS_MAX_LEVEL - 1 nodes and 1 leaf. We were requiring
    some additional chunk_root->nodesize * BTRFS_MAX_LEVEL * num_devs bytes,
    which were unnecessary since updating the existing device items does
    not result in splitting the nodes and leaf since after updating them
    they remain with the same size.
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    4617ea3a
extent-tree.c 275 KB