blob: a4250bb19525ec9714fdbcc26523672fc40dd3be [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright 2023 Red Hat
*/
#ifndef UDS_OPEN_CHAPTER_H
#define UDS_OPEN_CHAPTER_H
#include "chapter-index.h"
#include "geometry.h"
#include "index.h"
#include "volume.h"
/*
* The open chapter tracks the newest records in memory. Like the index as a whole, each open
* chapter is divided into a number of independent zones which are interleaved when the chapter is
* committed to the volume.
*/
enum {
OPEN_CHAPTER_RECORD_NUMBER_BITS = 23,
};
struct open_chapter_zone_slot {
/* If non-zero, the record number addressed by this hash slot */
unsigned int record_number : OPEN_CHAPTER_RECORD_NUMBER_BITS;
/* If true, the record at the index of this hash slot was deleted */
bool deleted : 1;
} __packed;
struct open_chapter_zone {
/* The maximum number of records that can be stored */
unsigned int capacity;
/* The number of records stored */
unsigned int size;
/* The number of deleted records */
unsigned int deletions;
/* Array of chunk records, 1-based */
struct uds_volume_record *records;
/* The number of slots in the hash table */
unsigned int slot_count;
/* The hash table slots, referencing virtual record numbers */
struct open_chapter_zone_slot slots[];
};
int __must_check uds_make_open_chapter(const struct index_geometry *geometry,
unsigned int zone_count,
struct open_chapter_zone **open_chapter_ptr);
void uds_reset_open_chapter(struct open_chapter_zone *open_chapter);
void uds_search_open_chapter(struct open_chapter_zone *open_chapter,
const struct uds_record_name *name,
struct uds_record_data *metadata, bool *found);
int __must_check uds_put_open_chapter(struct open_chapter_zone *open_chapter,
const struct uds_record_name *name,
const struct uds_record_data *metadata);
void uds_remove_from_open_chapter(struct open_chapter_zone *open_chapter,
const struct uds_record_name *name);
void uds_free_open_chapter(struct open_chapter_zone *open_chapter);
int __must_check uds_close_open_chapter(struct open_chapter_zone **chapter_zones,
unsigned int zone_count, struct volume *volume,
struct open_chapter_index *chapter_index,
struct uds_volume_record *collated_records,
u64 virtual_chapter_number);
int __must_check uds_save_open_chapter(struct uds_index *index,
struct buffered_writer *writer);
int __must_check uds_load_open_chapter(struct uds_index *index,
struct buffered_reader *reader);
u64 uds_compute_saved_open_chapter_size(struct index_geometry *geometry);
#endif /* UDS_OPEN_CHAPTER_H */