root/drivers/md/dm-vdo/indexer/config.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright 2023 Red Hat
 */

#ifndef UDS_CONFIG_H
#define UDS_CONFIG_H

#include "geometry.h"
#include "indexer.h"
#include "io-factory.h"

/*
 * The uds_configuration records a variety of parameters used to configure a new UDS index. Some
 * parameters are provided by the client, while others are fixed or derived from user-supplied
 * values. It is created when an index is created, and it is recorded in the index metadata.
 */

enum {
        DEFAULT_VOLUME_INDEX_MEAN_DELTA = 4096,
        DEFAULT_CACHE_CHAPTERS = 7,
        DEFAULT_SPARSE_SAMPLE_RATE = 32,
        MAX_ZONES = 16,
};

/* A set of configuration parameters for the indexer. */
struct uds_configuration {
        /* Storage device for the index */
        struct block_device *bdev;

        /* The maximum allowable size of the index */
        size_t size;

        /* The offset where the index should start */
        off_t offset;

        /* Parameters for the volume */

        /* The volume layout */
        struct index_geometry *geometry;

        /* Index owner's nonce */
        u64 nonce;

        /* The number of threads used to process index requests */
        unsigned int zone_count;

        /* The number of threads used to read volume pages */
        unsigned int read_threads;

        /* Size of the page cache and sparse chapter index cache in chapters */
        u32 cache_chapters;

        /* Parameters for the volume index */

        /* The mean delta for the volume index */
        u32 volume_index_mean_delta;

        /* Sampling rate for sparse indexing */
        u32 sparse_sample_rate;
};

/* On-disk structure of data for a version 8.02 index. */
struct uds_configuration_8_02 {
        /* Smaller (16), Small (64) or large (256) indices */
        u32 record_pages_per_chapter;
        /* Total number of chapters per volume */
        u32 chapters_per_volume;
        /* Number of sparse chapters per volume */
        u32 sparse_chapters_per_volume;
        /* Size of the page cache, in chapters */
        u32 cache_chapters;
        /* Unused field */
        u32 unused;
        /* The volume index mean delta to use */
        u32 volume_index_mean_delta;
        /* Size of a page, used for both record pages and index pages */
        u32 bytes_per_page;
        /* Sampling rate for sparse indexing */
        u32 sparse_sample_rate;
        /* Index owner's nonce */
        u64 nonce;
        /* Virtual chapter remapped from physical chapter 0 */
        u64 remapped_virtual;
        /* New physical chapter which remapped chapter was moved to */
        u64 remapped_physical;
} __packed;

/* On-disk structure of data for a version 6.02 index. */
struct uds_configuration_6_02 {
        /* Smaller (16), Small (64) or large (256) indices */
        u32 record_pages_per_chapter;
        /* Total number of chapters per volume */
        u32 chapters_per_volume;
        /* Number of sparse chapters per volume */
        u32 sparse_chapters_per_volume;
        /* Size of the page cache, in chapters */
        u32 cache_chapters;
        /* Unused field */
        u32 unused;
        /* The volume index mean delta to use */
        u32 volume_index_mean_delta;
        /* Size of a page, used for both record pages and index pages */
        u32 bytes_per_page;
        /* Sampling rate for sparse indexing */
        u32 sparse_sample_rate;
        /* Index owner's nonce */
        u64 nonce;
} __packed;

int __must_check uds_make_configuration(const struct uds_parameters *params,
                                        struct uds_configuration **config_ptr);

void uds_free_configuration(struct uds_configuration *config);

int __must_check uds_validate_config_contents(struct buffered_reader *reader,
                                              struct uds_configuration *config);

int __must_check uds_write_config_contents(struct buffered_writer *writer,
                                           struct uds_configuration *config, u32 version);

void uds_log_configuration(struct uds_configuration *config);

#endif /* UDS_CONFIG_H */