forest
static struct tree_page * __must_check get_tree_page_by_index(struct forest *forest,
for (segment = 0; segment < forest->segments; segment++) {
page_number_t border = forest->boundaries[segment].levels[height - 1];
struct block_map_tree *tree = &forest->trees[root_index];
return get_tree_page_by_index(zone->block_map->forest, lock->root_index,
tree_page = get_tree_page_by_index(map->forest, root_index, 1, page_index);
static int make_segment(struct forest *old_forest, block_count_t new_pages,
struct boundary *new_boundary, struct forest *forest)
forest->segments = index + 1;
result = vdo_allocate(forest->segments, "forest boundary array", &forest->boundaries);
result = vdo_allocate(forest->segments, "forest page pointers", &forest->pages);
result = vdo_allocate(new_pages, "new forest pages", &forest->pages[index]);
memcpy(forest->boundaries, old_forest->boundaries,
memcpy(forest->pages, old_forest->pages,
memcpy(&(forest->boundaries[index]), new_boundary, sizeof(struct boundary));
page_ptr = forest->pages[index];
for (root = 0; root < forest->map->root_count; root++) {
struct block_map_tree *tree = &(forest->trees[root]);
result = vdo_allocate(forest->segments, "tree root segments", &tree->segments);
forest->map->nonce,
vdo_pack_block_map_entry(forest->map->root_origin + root,
static void deforest(struct forest *forest, size_t first_page_segment)
if (forest->pages != NULL) {
for (segment = first_page_segment; segment < forest->segments; segment++)
vdo_free(forest->pages[segment]);
vdo_free(forest->pages);
for (root = 0; root < forest->map->root_count; root++)
vdo_free(forest->trees[root].segments);
vdo_free(forest->boundaries);
vdo_free(forest);
struct forest *forest, *old_forest = map->forest;
result = vdo_allocate_extended(map->root_count, trees, __func__, &forest);
forest->map = map;
result = make_segment(old_forest, new_pages, &new_boundary, forest);
deforest(forest, forest->segments - 1);
map->next_forest = forest;
if (map->forest != NULL)
deforest(map->forest, map->forest->segments);
map->forest = vdo_forget(map->next_forest);
.tree = &map->forest->trees[root],
if (map->forest != NULL)
deforest(vdo_forget(map->forest), 0);
struct forest *forest = vdo_forget(map->next_forest);
if (forest != NULL)
deforest(forest, forest->segments - 1);
struct forest;
struct forest *forest;
struct forest *next_forest;