volume_index
result = uds_save_volume_index(index->volume_index, writers, index->zone_count);
result = uds_load_volume_index(index->volume_index, readers, isl->zone_count);
uds_set_volume_index_open_chapter(index->volume_index, upto_virtual);
result = uds_make_volume_index(config, nonce, &index->volume_index);
uds_free_volume_index(index->volume_index);
virtual_chapter = uds_lookup_volume_index_name(index->volume_index,
uds_get_volume_index_stats(index->volume_index, &stats);
counters->memory_used = (index->volume_index->memory_size +
uds_get_volume_index_zone(index->volume_index, &request->record_name);
uds_set_volume_index_zone_open_chapter(zone->index->volume_index, zone->id,
result = uds_get_volume_index_record(zone->index->volume_index,
!uds_is_volume_index_sample(zone->index->volume_index,
result = uds_get_volume_index_record(zone->index->volume_index,
!uds_is_volume_index_sample(index->volume_index, name)) {
result = uds_get_volume_index_record(index->volume_index, name, &record);
uds_set_volume_index_open_chapter(index->volume_index, virtual);
struct volume_index *volume_index;
zone = uds_get_volume_index_zone(index->volume_index,
abort_restoring_volume_index(volume_index);
static int start_saving_volume_index(const struct volume_index *volume_index,
if (!has_sparse(volume_index)) {
return start_saving_volume_sub_index(&volume_index->vi_non_hook,
encode_u32_le(buffer, &offset, volume_index->sparse_sample_rate);
result = start_saving_volume_sub_index(&volume_index->vi_non_hook, zone_number,
return start_saving_volume_sub_index(&volume_index->vi_hook, zone_number,
static int finish_saving_volume_index(const struct volume_index *volume_index,
result = finish_saving_volume_sub_index(&volume_index->vi_non_hook, zone_number);
if ((result == UDS_SUCCESS) && has_sparse(volume_index))
result = finish_saving_volume_sub_index(&volume_index->vi_hook, zone_number);
int uds_save_volume_index(struct volume_index *volume_index,
result = start_saving_volume_index(volume_index, zone, writers[zone]);
result = finish_saving_volume_index(volume_index, zone);
void uds_get_volume_index_stats(const struct volume_index *volume_index,
get_volume_sub_index_stats(&volume_index->vi_non_hook, stats);
if (!has_sparse(volume_index))
get_volume_sub_index_stats(&volume_index->vi_hook, &sparse_stats);
struct volume_index **volume_index_ptr)
struct volume_index *volume_index;
result = vdo_allocate(1, "volume index", &volume_index);
volume_index->zone_count = config->zone_count;
&volume_index->vi_non_hook);
uds_free_volume_index(volume_index);
volume_index->memory_size = volume_index->vi_non_hook.memory_size;
*volume_index_ptr = volume_index;
volume_index->sparse_sample_rate = config->sparse_sample_rate;
result = vdo_allocate(config->zone_count, "volume index zones", &volume_index->zones);
uds_free_volume_index(volume_index);
mutex_init(&volume_index->zones[zone].hook_mutex);
&volume_index->vi_non_hook);
uds_free_volume_index(volume_index);
&volume_index->vi_hook);
uds_free_volume_index(volume_index);
volume_index->memory_size =
volume_index->vi_non_hook.memory_size + volume_index->vi_hook.memory_size;
*volume_index_ptr = volume_index;
static inline bool has_sparse(const struct volume_index *volume_index)
return volume_index->sparse_sample_rate > 0;
bool uds_is_volume_index_sample(const struct volume_index *volume_index,
if (!has_sparse(volume_index))
return (uds_extract_sampling_bytes(name) % volume_index->sparse_sample_rate) == 0;
get_volume_sub_index(const struct volume_index *volume_index,
return (uds_is_volume_index_sample(volume_index, name) ?
&volume_index->vi_hook :
&volume_index->vi_non_hook);
unsigned int uds_get_volume_index_zone(const struct volume_index *volume_index,
return get_volume_sub_index_zone(get_volume_sub_index(volume_index, name), name);
void uds_free_volume_index(struct volume_index *volume_index)
if (volume_index == NULL)
if (volume_index->zones != NULL)
vdo_free(vdo_forget(volume_index->zones));
uninitialize_volume_sub_index(&volume_index->vi_non_hook);
uninitialize_volume_sub_index(&volume_index->vi_hook);
vdo_free(volume_index);
int uds_get_volume_index_record(struct volume_index *volume_index,
if (uds_is_volume_index_sample(volume_index, name)) {
get_volume_sub_index_zone(&volume_index->vi_hook, name);
struct mutex *mutex = &volume_index->zones[zone].hook_mutex;
result = get_volume_sub_index_record(&volume_index->vi_hook, name,
result = get_volume_sub_index_record(&volume_index->vi_non_hook, name,
void uds_set_volume_index_zone_open_chapter(struct volume_index *volume_index,
struct mutex *mutex = &volume_index->zones[zone_number].hook_mutex;
set_volume_sub_index_zone_open_chapter(&volume_index->vi_non_hook, zone_number,
if (has_sparse(volume_index)) {
set_volume_sub_index_zone_open_chapter(&volume_index->vi_hook,
void uds_set_volume_index_open_chapter(struct volume_index *volume_index,
for (zone = 0; zone < volume_index->zone_count; zone++)
uds_set_volume_index_zone_open_chapter(volume_index, zone, virtual_chapter);
u64 uds_lookup_volume_index_name(const struct volume_index *volume_index,
unsigned int zone_number = uds_get_volume_index_zone(volume_index, name);
struct mutex *mutex = &volume_index->zones[zone_number].hook_mutex;
if (!uds_is_volume_index_sample(volume_index, name))
virtual_chapter = lookup_volume_sub_index_name(&volume_index->vi_hook, name);
static void abort_restoring_volume_index(struct volume_index *volume_index)
abort_restoring_volume_sub_index(&volume_index->vi_non_hook);
if (has_sparse(volume_index))
abort_restoring_volume_sub_index(&volume_index->vi_hook);
static int start_restoring_volume_index(struct volume_index *volume_index,
if (!has_sparse(volume_index)) {
return start_restoring_volume_sub_index(&volume_index->vi_non_hook,
volume_index->sparse_sample_rate = header.sparse_sample_rate;
} else if (volume_index->sparse_sample_rate != header.sparse_sample_rate) {
volume_index->sparse_sample_rate,
result = start_restoring_volume_sub_index(&volume_index->vi_non_hook,
return start_restoring_volume_sub_index(&volume_index->vi_hook, buffered_readers,
static int finish_restoring_volume_index(struct volume_index *volume_index,
result = finish_restoring_volume_sub_index(&volume_index->vi_non_hook,
if ((result == UDS_SUCCESS) && has_sparse(volume_index)) {
result = finish_restoring_volume_sub_index(&volume_index->vi_hook,
int uds_load_volume_index(struct volume_index *volume_index,
result = start_restoring_volume_index(volume_index, readers, reader_count);
result = finish_restoring_volume_index(volume_index, readers, reader_count);
abort_restoring_volume_index(volume_index);
struct volume_index **volume_index);
void uds_free_volume_index(struct volume_index *volume_index);
unsigned int __must_check uds_get_volume_index_zone(const struct volume_index *volume_index,
bool __must_check uds_is_volume_index_sample(const struct volume_index *volume_index,
u64 __must_check uds_lookup_volume_index_name(const struct volume_index *volume_index,
int __must_check uds_get_volume_index_record(struct volume_index *volume_index,
void uds_set_volume_index_open_chapter(struct volume_index *volume_index,
void uds_set_volume_index_zone_open_chapter(struct volume_index *volume_index,
int __must_check uds_load_volume_index(struct volume_index *volume_index,
int __must_check uds_save_volume_index(struct volume_index *volume_index,
void uds_get_volume_index_stats(const struct volume_index *volume_index,