1*17b1a73fSMike Snitzer /* SPDX-License-Identifier: GPL-2.0-only */ 2*17b1a73fSMike Snitzer /* 3*17b1a73fSMike Snitzer * Copyright 2023 Red Hat 4*17b1a73fSMike Snitzer */ 5*17b1a73fSMike Snitzer 6*17b1a73fSMike Snitzer #ifndef UDS_CONFIG_H 7*17b1a73fSMike Snitzer #define UDS_CONFIG_H 8*17b1a73fSMike Snitzer 9*17b1a73fSMike Snitzer #include "geometry.h" 10*17b1a73fSMike Snitzer #include "indexer.h" 11*17b1a73fSMike Snitzer #include "io-factory.h" 12*17b1a73fSMike Snitzer 13*17b1a73fSMike Snitzer /* 14*17b1a73fSMike Snitzer * The uds_configuration records a variety of parameters used to configure a new UDS index. Some 15*17b1a73fSMike Snitzer * parameters are provided by the client, while others are fixed or derived from user-supplied 16*17b1a73fSMike Snitzer * values. It is created when an index is created, and it is recorded in the index metadata. 17*17b1a73fSMike Snitzer */ 18*17b1a73fSMike Snitzer 19*17b1a73fSMike Snitzer enum { 20*17b1a73fSMike Snitzer DEFAULT_VOLUME_INDEX_MEAN_DELTA = 4096, 21*17b1a73fSMike Snitzer DEFAULT_CACHE_CHAPTERS = 7, 22*17b1a73fSMike Snitzer DEFAULT_SPARSE_SAMPLE_RATE = 32, 23*17b1a73fSMike Snitzer MAX_ZONES = 16, 24*17b1a73fSMike Snitzer }; 25*17b1a73fSMike Snitzer 26*17b1a73fSMike Snitzer /* A set of configuration parameters for the indexer. */ 27*17b1a73fSMike Snitzer struct uds_configuration { 28*17b1a73fSMike Snitzer /* Storage device for the index */ 29*17b1a73fSMike Snitzer struct block_device *bdev; 30*17b1a73fSMike Snitzer 31*17b1a73fSMike Snitzer /* The maximum allowable size of the index */ 32*17b1a73fSMike Snitzer size_t size; 33*17b1a73fSMike Snitzer 34*17b1a73fSMike Snitzer /* The offset where the index should start */ 35*17b1a73fSMike Snitzer off_t offset; 36*17b1a73fSMike Snitzer 37*17b1a73fSMike Snitzer /* Parameters for the volume */ 38*17b1a73fSMike Snitzer 39*17b1a73fSMike Snitzer /* The volume layout */ 40*17b1a73fSMike Snitzer struct index_geometry *geometry; 41*17b1a73fSMike Snitzer 42*17b1a73fSMike Snitzer /* Index owner's nonce */ 43*17b1a73fSMike Snitzer u64 nonce; 44*17b1a73fSMike Snitzer 45*17b1a73fSMike Snitzer /* The number of threads used to process index requests */ 46*17b1a73fSMike Snitzer unsigned int zone_count; 47*17b1a73fSMike Snitzer 48*17b1a73fSMike Snitzer /* The number of threads used to read volume pages */ 49*17b1a73fSMike Snitzer unsigned int read_threads; 50*17b1a73fSMike Snitzer 51*17b1a73fSMike Snitzer /* Size of the page cache and sparse chapter index cache in chapters */ 52*17b1a73fSMike Snitzer u32 cache_chapters; 53*17b1a73fSMike Snitzer 54*17b1a73fSMike Snitzer /* Parameters for the volume index */ 55*17b1a73fSMike Snitzer 56*17b1a73fSMike Snitzer /* The mean delta for the volume index */ 57*17b1a73fSMike Snitzer u32 volume_index_mean_delta; 58*17b1a73fSMike Snitzer 59*17b1a73fSMike Snitzer /* Sampling rate for sparse indexing */ 60*17b1a73fSMike Snitzer u32 sparse_sample_rate; 61*17b1a73fSMike Snitzer }; 62*17b1a73fSMike Snitzer 63*17b1a73fSMike Snitzer /* On-disk structure of data for a version 8.02 index. */ 64*17b1a73fSMike Snitzer struct uds_configuration_8_02 { 65*17b1a73fSMike Snitzer /* Smaller (16), Small (64) or large (256) indices */ 66*17b1a73fSMike Snitzer u32 record_pages_per_chapter; 67*17b1a73fSMike Snitzer /* Total number of chapters per volume */ 68*17b1a73fSMike Snitzer u32 chapters_per_volume; 69*17b1a73fSMike Snitzer /* Number of sparse chapters per volume */ 70*17b1a73fSMike Snitzer u32 sparse_chapters_per_volume; 71*17b1a73fSMike Snitzer /* Size of the page cache, in chapters */ 72*17b1a73fSMike Snitzer u32 cache_chapters; 73*17b1a73fSMike Snitzer /* Unused field */ 74*17b1a73fSMike Snitzer u32 unused; 75*17b1a73fSMike Snitzer /* The volume index mean delta to use */ 76*17b1a73fSMike Snitzer u32 volume_index_mean_delta; 77*17b1a73fSMike Snitzer /* Size of a page, used for both record pages and index pages */ 78*17b1a73fSMike Snitzer u32 bytes_per_page; 79*17b1a73fSMike Snitzer /* Sampling rate for sparse indexing */ 80*17b1a73fSMike Snitzer u32 sparse_sample_rate; 81*17b1a73fSMike Snitzer /* Index owner's nonce */ 82*17b1a73fSMike Snitzer u64 nonce; 83*17b1a73fSMike Snitzer /* Virtual chapter remapped from physical chapter 0 */ 84*17b1a73fSMike Snitzer u64 remapped_virtual; 85*17b1a73fSMike Snitzer /* New physical chapter which remapped chapter was moved to */ 86*17b1a73fSMike Snitzer u64 remapped_physical; 87*17b1a73fSMike Snitzer } __packed; 88*17b1a73fSMike Snitzer 89*17b1a73fSMike Snitzer /* On-disk structure of data for a version 6.02 index. */ 90*17b1a73fSMike Snitzer struct uds_configuration_6_02 { 91*17b1a73fSMike Snitzer /* Smaller (16), Small (64) or large (256) indices */ 92*17b1a73fSMike Snitzer u32 record_pages_per_chapter; 93*17b1a73fSMike Snitzer /* Total number of chapters per volume */ 94*17b1a73fSMike Snitzer u32 chapters_per_volume; 95*17b1a73fSMike Snitzer /* Number of sparse chapters per volume */ 96*17b1a73fSMike Snitzer u32 sparse_chapters_per_volume; 97*17b1a73fSMike Snitzer /* Size of the page cache, in chapters */ 98*17b1a73fSMike Snitzer u32 cache_chapters; 99*17b1a73fSMike Snitzer /* Unused field */ 100*17b1a73fSMike Snitzer u32 unused; 101*17b1a73fSMike Snitzer /* The volume index mean delta to use */ 102*17b1a73fSMike Snitzer u32 volume_index_mean_delta; 103*17b1a73fSMike Snitzer /* Size of a page, used for both record pages and index pages */ 104*17b1a73fSMike Snitzer u32 bytes_per_page; 105*17b1a73fSMike Snitzer /* Sampling rate for sparse indexing */ 106*17b1a73fSMike Snitzer u32 sparse_sample_rate; 107*17b1a73fSMike Snitzer /* Index owner's nonce */ 108*17b1a73fSMike Snitzer u64 nonce; 109*17b1a73fSMike Snitzer } __packed; 110*17b1a73fSMike Snitzer 111*17b1a73fSMike Snitzer int __must_check uds_make_configuration(const struct uds_parameters *params, 112*17b1a73fSMike Snitzer struct uds_configuration **config_ptr); 113*17b1a73fSMike Snitzer 114*17b1a73fSMike Snitzer void uds_free_configuration(struct uds_configuration *config); 115*17b1a73fSMike Snitzer 116*17b1a73fSMike Snitzer int __must_check uds_validate_config_contents(struct buffered_reader *reader, 117*17b1a73fSMike Snitzer struct uds_configuration *config); 118*17b1a73fSMike Snitzer 119*17b1a73fSMike Snitzer int __must_check uds_write_config_contents(struct buffered_writer *writer, 120*17b1a73fSMike Snitzer struct uds_configuration *config, u32 version); 121*17b1a73fSMike Snitzer 122*17b1a73fSMike Snitzer void uds_log_configuration(struct uds_configuration *config); 123*17b1a73fSMike Snitzer 124*17b1a73fSMike Snitzer #endif /* UDS_CONFIG_H */ 125