1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright 2023 Red Hat
4 */
5
6#ifndef UDS_INDEX_H
7#define UDS_INDEX_H
8
9#include "index-layout.h"
10#include "index-session.h"
11#include "open-chapter.h"
12#include "volume.h"
13#include "volume-index.h"
14
15/*
16 * The index is a high-level structure which represents the totality of the UDS index. It manages
17 * the queues for incoming requests and dispatches them to the appropriate sub-components like the
18 * volume or the volume index. It also manages administrative tasks such as saving and loading the
19 * index.
20 *
21 * The index is divided into a number of independent zones and assigns each request to a zone based
22 * on its name. Most sub-components are similarly divided into zones as well so that requests in
23 * each zone usually operate without interference or coordination between zones.
24 */
25
26typedef void (*index_callback_fn)(struct uds_request *request);
27
28struct index_zone {
29	struct uds_index *index;
30	struct open_chapter_zone *open_chapter;
31	struct open_chapter_zone *writing_chapter;
32	u64 oldest_virtual_chapter;
33	u64 newest_virtual_chapter;
34	unsigned int id;
35};
36
37struct uds_index {
38	bool has_saved_open_chapter;
39	bool need_to_save;
40	struct index_load_context *load_context;
41	struct index_layout *layout;
42	struct volume_index *volume_index;
43	struct volume *volume;
44	unsigned int zone_count;
45	struct index_zone **zones;
46
47	u64 oldest_virtual_chapter;
48	u64 newest_virtual_chapter;
49
50	u64 last_save;
51	u64 prev_save;
52	struct chapter_writer *chapter_writer;
53
54	index_callback_fn callback;
55	struct uds_request_queue *triage_queue;
56	struct uds_request_queue *zone_queues[];
57};
58
59enum request_stage {
60	STAGE_TRIAGE,
61	STAGE_INDEX,
62	STAGE_MESSAGE,
63};
64
65int __must_check uds_make_index(struct uds_configuration *config,
66				enum uds_open_index_type open_type,
67				struct index_load_context *load_context,
68				index_callback_fn callback, struct uds_index **new_index);
69
70int __must_check uds_save_index(struct uds_index *index);
71
72void uds_free_index(struct uds_index *index);
73
74int __must_check uds_replace_index_storage(struct uds_index *index,
75					   struct block_device *bdev);
76
77void uds_get_index_stats(struct uds_index *index, struct uds_index_stats *counters);
78
79void uds_enqueue_request(struct uds_request *request, enum request_stage stage);
80
81void uds_wait_for_idle_index(struct uds_index *index);
82
83#endif /* UDS_INDEX_H */
84