/* 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 */