/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright 2023 Red Hat */ #ifndef UDS_INDEX_H #define UDS_INDEX_H #include "index-layout.h" #include "index-session.h" #include "open-chapter.h" #include "volume.h" #include "volume-index.h" /* * The index is a high-level structure which represents the totality of the UDS index. It manages * the queues for incoming requests and dispatches them to the appropriate sub-components like the * volume or the volume index. It also manages administrative tasks such as saving and loading the * index. * * The index is divided into a number of independent zones and assigns each request to a zone based * on its name. Most sub-components are similarly divided into zones as well so that requests in * each zone usually operate without interference or coordination between zones. */ typedef void (*index_callback_fn)(struct uds_request *request); struct index_zone { struct uds_index *index; struct open_chapter_zone *open_chapter; struct open_chapter_zone *writing_chapter; u64 oldest_virtual_chapter; u64 newest_virtual_chapter; unsigned int id; }; struct uds_index { bool has_saved_open_chapter; bool need_to_save; struct index_load_context *load_context; struct index_layout *layout; struct volume_index *volume_index; struct volume *volume; unsigned int zone_count; struct index_zone **zones; u64 oldest_virtual_chapter; u64 newest_virtual_chapter; u64 last_save; u64 prev_save; struct chapter_writer *chapter_writer; index_callback_fn callback; struct uds_request_queue *triage_queue; struct uds_request_queue *zone_queues[]; }; enum request_stage { STAGE_TRIAGE, STAGE_INDEX, STAGE_MESSAGE, }; int __must_check uds_make_index(struct uds_configuration *config, enum uds_open_index_type open_type, struct index_load_context *load_context, index_callback_fn callback, struct uds_index **new_index); int __must_check uds_save_index(struct uds_index *index); void uds_free_index(struct uds_index *index); int __must_check uds_replace_index_storage(struct uds_index *index, struct block_device *bdev); void uds_get_index_stats(struct uds_index *index, struct uds_index_stats *counters); void uds_enqueue_request(struct uds_request *request, enum request_stage stage); void uds_wait_for_idle_index(struct uds_index *index); #endif /* UDS_INDEX_H */