dirty_lists
static void expire_oldest_list(struct dirty_lists *dirty_lists)
block_count_t i = dirty_lists->offset++;
dirty_lists->oldest_period++;
if (!list_empty(&dirty_lists->eras[i][VDO_TREE_PAGE])) {
list_splice_tail_init(&dirty_lists->eras[i][VDO_TREE_PAGE],
&dirty_lists->expired[VDO_TREE_PAGE]);
if (!list_empty(&dirty_lists->eras[i][VDO_CACHE_PAGE])) {
list_splice_tail_init(&dirty_lists->eras[i][VDO_CACHE_PAGE],
&dirty_lists->expired[VDO_CACHE_PAGE]);
if (dirty_lists->offset == dirty_lists->maximum_age)
dirty_lists->offset = 0;
static void update_period(struct dirty_lists *dirty, sequence_number_t period)
expired = &zone->dirty_lists->expired[VDO_TREE_PAGE];
expired = &zone->dirty_lists->expired[VDO_CACHE_PAGE];
struct dirty_lists *dirty_lists = zone->dirty_lists;
if (new_period < dirty_lists->oldest_period) {
list_move_tail(entry, &dirty_lists->expired[type]);
update_period(dirty_lists, new_period);
&dirty_lists->eras[new_period % dirty_lists->maximum_age][type]);
result = vdo_allocate_extended(maximum_age, eras, __func__, &zone->dirty_lists);
zone->dirty_lists->maximum_age = maximum_age;
INIT_LIST_HEAD(&zone->dirty_lists->expired[VDO_TREE_PAGE]);
INIT_LIST_HEAD(&zone->dirty_lists->expired[VDO_CACHE_PAGE]);
INIT_LIST_HEAD(&zone->dirty_lists->eras[i][VDO_TREE_PAGE]);
INIT_LIST_HEAD(&zone->dirty_lists->eras[i][VDO_CACHE_PAGE]);
update_period(zone->dirty_lists, map->current_era_point);
vdo_free(vdo_forget(zone->dirty_lists));
struct dirty_lists *dirty_lists = map->zones[z].dirty_lists;
VDO_ASSERT_LOG_ONLY(dirty_lists->next_period == 0, "current period not set");
dirty_lists->oldest_period = map->current_era_point;
dirty_lists->next_period = map->current_era_point + 1;
dirty_lists->offset = map->current_era_point % dirty_lists->maximum_age;
while (zone->dirty_lists->oldest_period < zone->dirty_lists->next_period)
expire_oldest_list(zone->dirty_lists);
struct dirty_lists *dirty_lists;