linux/drivers/md/dm-vdo/indexer/volume.h

/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright 2023 Red Hat
 */

#ifndef UDS_VOLUME_H
#define UDS_VOLUME_H

#include <linux/atomic.h>
#include <linux/cache.h>
#include <linux/dm-bufio.h>
#include <linux/limits.h>

#include "permassert.h"
#include "thread-utils.h"

#include "chapter-index.h"
#include "config.h"
#include "geometry.h"
#include "indexer.h"
#include "index-layout.h"
#include "index-page-map.h"
#include "radix-sort.h"
#include "sparse-cache.h"

/*
 * The volume manages deduplication records on permanent storage. The term "volume" can also refer
 * to the region of permanent storage where the records (and the chapters containing them) are
 * stored. The volume handles all I/O to this region by reading, caching, and writing chapter pages
 * as necessary.
 */

enum index_lookup_mode {};

struct queued_read {};

struct __aligned(L1_CACHE_BYTES) search_pending_counter {};

struct cached_page {};

struct page_cache {};

struct volume {};

int __must_check uds_make_volume(const struct uds_configuration *config,
				 struct index_layout *layout,
				 struct volume **new_volume);

void uds_free_volume(struct volume *volume);

int __must_check uds_replace_volume_storage(struct volume *volume,
					    struct index_layout *layout,
					    struct block_device *bdev);

int __must_check uds_find_volume_chapter_boundaries(struct volume *volume,
						    u64 *lowest_vcn, u64 *highest_vcn,
						    bool *is_empty);

int __must_check uds_search_volume_page_cache(struct volume *volume,
					      struct uds_request *request,
					      bool *found);

int __must_check uds_search_volume_page_cache_for_rebuild(struct volume *volume,
							  const struct uds_record_name *name,
							  u64 virtual_chapter,
							  bool *found);

int __must_check uds_search_cached_record_page(struct volume *volume,
					       struct uds_request *request, u32 chapter,
					       u16 record_page_number, bool *found);

void uds_forget_chapter(struct volume *volume, u64 chapter);

int __must_check uds_write_chapter(struct volume *volume,
				   struct open_chapter_index *chapter_index,
				   const struct uds_volume_record records[]);

void uds_prefetch_volume_chapter(const struct volume *volume, u32 chapter);

int __must_check uds_read_chapter_index_from_volume(const struct volume *volume,
						    u64 virtual_chapter,
						    struct dm_buffer *volume_buffers[],
						    struct delta_index_page index_pages[]);

int __must_check uds_get_volume_record_page(struct volume *volume, u32 chapter,
					    u32 page_number, u8 **data_ptr);

int __must_check uds_get_volume_index_page(struct volume *volume, u32 chapter,
					   u32 page_number,
					   struct delta_index_page **page_ptr);

#endif /* UDS_VOLUME_H */