// SPDX-License-Identifier: GPL-2.0-only /* * Copyright 2023 Red Hat */ #include "vio.h" #include <linux/bio.h> #include <linux/blkdev.h> #include <linux/kernel.h> #include <linux/ratelimit.h> #include "logger.h" #include "memory-alloc.h" #include "permassert.h" #include "constants.h" #include "io-submitter.h" #include "vdo.h" /* A vio_pool is a collection of preallocated vios. */ struct vio_pool { … }; physical_block_number_t pbn_from_vio_bio(struct bio *bio) { … } static int create_multi_block_bio(block_count_t size, struct bio **bio_ptr) { … } int vdo_create_bio(struct bio **bio_ptr) { … } void vdo_free_bio(struct bio *bio) { … } int allocate_vio_components(struct vdo *vdo, enum vio_type vio_type, enum vio_priority priority, void *parent, unsigned int block_count, char *data, struct vio *vio) { … } /** * create_multi_block_metadata_vio() - Create a vio. * @vdo: The vdo on which the vio will operate. * @vio_type: The type of vio to create. * @priority: The relative priority to assign to the vio. * @parent: The parent of the vio. * @block_count: The size of the vio in blocks. * @data: The buffer. * @vio_ptr: A pointer to hold the new vio. * * Return: VDO_SUCCESS or an error. */ int create_multi_block_metadata_vio(struct vdo *vdo, enum vio_type vio_type, enum vio_priority priority, void *parent, unsigned int block_count, char *data, struct vio **vio_ptr) { … } /** * free_vio_components() - Free the components of a vio embedded in a larger structure. * @vio: The vio to destroy */ void free_vio_components(struct vio *vio) { … } /** * free_vio() - Destroy a vio. * @vio: The vio to destroy. */ void free_vio(struct vio *vio) { … } /* Set bio properties for a VDO read or write. */ void vdo_set_bio_properties(struct bio *bio, struct vio *vio, bio_end_io_t callback, blk_opf_t bi_opf, physical_block_number_t pbn) { … } /* * Prepares the bio to perform IO with the specified buffer. May only be used on a VDO-allocated * bio, as it assumes the bio wraps a 4k buffer that is 4k aligned, but there does not have to be a * vio associated with the bio. */ int vio_reset_bio(struct vio *vio, char *data, bio_end_io_t callback, blk_opf_t bi_opf, physical_block_number_t pbn) { … } /** * update_vio_error_stats() - Update per-vio error stats and log the error. * @vio: The vio which got an error. * @format: The format of the message to log (a printf style format). */ void update_vio_error_stats(struct vio *vio, const char *format, ...) { … } void vio_record_metadata_io_error(struct vio *vio) { … } /** * make_vio_pool() - Create a new vio pool. * @vdo: The vdo. * @pool_size: The number of vios in the pool. * @thread_id: The ID of the thread using this pool. * @vio_type: The type of vios in the pool. * @priority: The priority with which vios from the pool should be enqueued. * @context: The context that each entry will have. * @pool_ptr: The resulting pool. * * Return: A success or error code. */ int make_vio_pool(struct vdo *vdo, size_t pool_size, thread_id_t thread_id, enum vio_type vio_type, enum vio_priority priority, void *context, struct vio_pool **pool_ptr) { … } /** * free_vio_pool() - Destroy a vio pool. * @pool: The pool to free. */ void free_vio_pool(struct vio_pool *pool) { … } /** * is_vio_pool_busy() - Check whether an vio pool has outstanding entries. * * Return: true if the pool is busy. */ bool is_vio_pool_busy(struct vio_pool *pool) { … } /** * acquire_vio_from_pool() - Acquire a vio and buffer from the pool (asynchronous). * @pool: The vio pool. * @waiter: Object that is requesting a vio. */ void acquire_vio_from_pool(struct vio_pool *pool, struct vdo_waiter *waiter) { … } /** * return_vio_to_pool() - Return a vio to the pool * @pool: The vio pool. * @vio: The pooled vio to return. */ void return_vio_to_pool(struct vio_pool *pool, struct pooled_vio *vio) { … } /* * Various counting functions for statistics. * These are used for bios coming into VDO, as well as bios generated by VDO. */ void vdo_count_bios(struct atomic_bio_stats *bio_stats, struct bio *bio) { … } static void count_all_bios_completed(struct vio *vio, struct bio *bio) { … } void vdo_count_completed_bios(struct bio *bio) { … }