switch (root->root_key.objectid) {
        case BTRFS_CSUM_TREE_OBJECTID:
        case BTRFS_EXTENT_TREE_OBJECTID:
+       case BTRFS_FREE_SPACE_TREE_OBJECTID:
                root->block_rsv = &fs_info->delayed_refs_rsv;
                break;
        case BTRFS_ROOT_TREE_OBJECTID:
 
        u64 num_bytes = btrfs_calc_insert_metadata_size(fs_info, nr);
        u64 released = 0;
 
+       /*
+        * We have to check the mount option here because we could be enabling
+        * the free space tree for the first time and don't have the compat_ro
+        * option set yet.
+        *
+        * We need extra reservations if we have the free space tree because
+        * we'll have to modify that tree as well.
+        */
+       if (btrfs_test_opt(fs_info, FREE_SPACE_TREE))
+               num_bytes *= 2;
+
        released = btrfs_block_rsv_release(fs_info, block_rsv, num_bytes, NULL);
        if (released)
                trace_btrfs_space_reservation(fs_info, "delayed_refs_rsv",
 
        num_bytes = btrfs_calc_insert_metadata_size(fs_info,
                                                    trans->delayed_ref_updates);
+       /*
+        * We have to check the mount option here because we could be enabling
+        * the free space tree for the first time and don't have the compat_ro
+        * option set yet.
+        *
+        * We need extra reservations if we have the free space tree because
+        * we'll have to modify that tree as well.
+        */
+       if (btrfs_test_opt(fs_info, FREE_SPACE_TREE))
+               num_bytes *= 2;
+
        spin_lock(&delayed_rsv->lock);
        delayed_rsv->size += num_bytes;
        delayed_rsv->full = 0;