/* Already aborted the transaction if it failed. */
 next:
-               btrfs_delayed_refs_rsv_release(fs_info, 1, 0);
+               btrfs_dec_delayed_refs_rsv_bg_inserts(fs_info);
                list_del_init(&block_group->bg_list);
                clear_bit(BLOCK_GROUP_FLAG_NEW, &block_group->runtime_flags);
        }
 #endif
 
        list_add_tail(&cache->bg_list, &trans->new_bgs);
-       trans->delayed_ref_updates++;
-       btrfs_update_delayed_refs_rsv(trans);
+       btrfs_inc_delayed_refs_rsv_bg_inserts(fs_info);
 
        set_avail_alloc_bits(fs_info, type);
        return cache;
 
        trans->delayed_ref_csum_deletions = 0;
 }
 
+/*
+ * Adjust the size of the delayed refs block reserve for 1 block group item
+ * insertion, used after allocating a block group.
+ */
+void btrfs_inc_delayed_refs_rsv_bg_inserts(struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_refs_rsv;
+
+       spin_lock(&delayed_rsv->lock);
+       /*
+        * Inserting a block group item does not require changing the free space
+        * tree, only the extent tree or the block group tree, so this is all we
+        * need.
+        */
+       delayed_rsv->size += btrfs_calc_insert_metadata_size(fs_info, 1);
+       delayed_rsv->full = false;
+       spin_unlock(&delayed_rsv->lock);
+}
+
+/*
+ * Adjust the size of the delayed refs block reserve to release space for 1
+ * block group item insertion.
+ */
+void btrfs_dec_delayed_refs_rsv_bg_inserts(struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_refs_rsv;
+       const u64 num_bytes = btrfs_calc_insert_metadata_size(fs_info, 1);
+       u64 released;
+
+       released = btrfs_block_rsv_release(fs_info, delayed_rsv, num_bytes, NULL);
+       if (released > 0)
+               trace_btrfs_space_reservation(fs_info, "delayed_refs_rsv",
+                                             0, released, 0);
+}
+
 /*
  * Adjust the size of the delayed refs block reserve for 1 block group item
  * update.
 
 
 void btrfs_delayed_refs_rsv_release(struct btrfs_fs_info *fs_info, int nr_refs, int nr_csums);
 void btrfs_update_delayed_refs_rsv(struct btrfs_trans_handle *trans);
+void btrfs_inc_delayed_refs_rsv_bg_inserts(struct btrfs_fs_info *fs_info);
+void btrfs_dec_delayed_refs_rsv_bg_inserts(struct btrfs_fs_info *fs_info);
 void btrfs_inc_delayed_refs_rsv_bg_updates(struct btrfs_fs_info *fs_info);
 void btrfs_dec_delayed_refs_rsv_bg_updates(struct btrfs_fs_info *fs_info);
 int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info,
 
        struct btrfs_block_group *block_group, *tmp;
 
        list_for_each_entry_safe(block_group, tmp, &trans->new_bgs, bg_list) {
-               btrfs_delayed_refs_rsv_release(fs_info, 1, 0);
+               btrfs_dec_delayed_refs_rsv_bg_inserts(fs_info);
                list_del_init(&block_group->bg_list);
        }
 }