84 lines
2.3 KiB
C
84 lines
2.3 KiB
C
/* 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 */
|