80 lines
2.5 KiB
C
80 lines
2.5 KiB
C
/* 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 */
|