#ifndef UDS_INDEX_GEOMETRY_H
#define UDS_INDEX_GEOMETRY_H
#include "indexer.h"
struct index_geometry {
size_t bytes_per_page;
u32 record_pages_per_chapter;
u32 chapters_per_volume;
u32 sparse_chapters_per_volume;
u8 chapter_delta_list_bits;
u64 remapped_virtual;
u64 remapped_physical;
u32 pages_per_volume;
size_t bytes_per_volume;
u32 pages_per_chapter;
u32 index_pages_per_chapter;
u32 records_per_page;
u32 records_per_chapter;
u64 records_per_volume;
u32 delta_lists_per_chapter;
u32 chapter_mean_delta;
u8 chapter_payload_bits;
u8 chapter_address_bits;
u32 dense_chapters_per_volume;
};
enum {
BYTES_PER_RECORD = (UDS_RECORD_NAME_SIZE + UDS_RECORD_DATA_SIZE),
DEFAULT_BYTES_PER_PAGE = 1024 * BYTES_PER_RECORD,
DEFAULT_RECORDS_PER_PAGE = DEFAULT_BYTES_PER_PAGE / BYTES_PER_RECORD,
DEFAULT_RECORD_PAGES_PER_CHAPTER = 256,
SMALL_RECORD_PAGES_PER_CHAPTER = 64,
DEFAULT_CHAPTERS_PER_VOLUME = 1024,
DEFAULT_SPARSE_CHAPTERS_PER_VOLUME = 0,
DEFAULT_CHAPTER_MEAN_DELTA_BITS = 16,
DEFAULT_CHAPTER_DELTA_LIST_BITS = 12,
SMALL_CHAPTER_DELTA_LIST_BITS = 10,
HEADER_PAGES_PER_VOLUME = 1,
};
int __must_check uds_make_index_geometry(size_t bytes_per_page, u32 record_pages_per_chapter,
u32 chapters_per_volume,
u32 sparse_chapters_per_volume, u64 remapped_virtual,
u64 remapped_physical,
struct index_geometry **geometry_ptr);
int __must_check uds_copy_index_geometry(struct index_geometry *source,
struct index_geometry **geometry_ptr);
void uds_free_index_geometry(struct index_geometry *geometry);
u32 __must_check uds_map_to_physical_chapter(const struct index_geometry *geometry,
u64 virtual_chapter);
static inline bool __must_check
uds_is_reduced_index_geometry(const struct index_geometry *geometry)
{
return !!(geometry->chapters_per_volume & 1);
}
static inline bool __must_check
uds_is_sparse_index_geometry(const struct index_geometry *geometry)
{
return geometry->sparse_chapters_per_volume > 0;
}
bool __must_check uds_has_sparse_chapters(const struct index_geometry *geometry,
u64 oldest_virtual_chapter,
u64 newest_virtual_chapter);
bool __must_check uds_is_chapter_sparse(const struct index_geometry *geometry,
u64 oldest_virtual_chapter,
u64 newest_virtual_chapter,
u64 virtual_chapter_number);
u32 __must_check uds_chapters_to_expire(const struct index_geometry *geometry,
u64 newest_chapter);
#endif