111 lines
4.1 KiB
C
111 lines
4.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright 2023 Red Hat
|
|
*/
|
|
|
|
#ifndef VDO_ACTION_MANAGER_H
|
|
#define VDO_ACTION_MANAGER_H
|
|
|
|
#include "admin-state.h"
|
|
#include "types.h"
|
|
|
|
/*
|
|
* An action_manager provides a generic mechanism for applying actions to multi-zone entities (such
|
|
* as the block map or slab depot). Each action manager is tied to a specific context for which it
|
|
* manages actions. The manager ensures that only one action is active on that context at a time,
|
|
* and supports at most one pending action. Calls to schedule an action when there is already a
|
|
* pending action will result in VDO_COMPONENT_BUSY errors. Actions may only be submitted to the
|
|
* action manager from a single thread (which thread is determined when the action manager is
|
|
* constructed).
|
|
*
|
|
* A scheduled action consists of four components:
|
|
*
|
|
* preamble
|
|
* an optional method to be run on the initiator thread before applying the action to all zones
|
|
* zone_action
|
|
* an optional method to be applied to each of the zones
|
|
* conclusion
|
|
* an optional method to be run on the initiator thread once the per-zone method has been
|
|
* applied to all zones
|
|
* parent
|
|
* an optional completion to be finished once the conclusion is done
|
|
*
|
|
* At least one of the three methods must be provided.
|
|
*/
|
|
|
|
/*
|
|
* A function which is to be applied asynchronously to a set of zones.
|
|
* @context: The object which holds the per-zone context for the action
|
|
* @zone_number: The number of zone to which the action is being applied
|
|
* @parent: The object to notify when the action is complete
|
|
*/
|
|
typedef void (*vdo_zone_action_fn)(void *context, zone_count_t zone_number,
|
|
struct vdo_completion *parent);
|
|
|
|
/*
|
|
* A function which is to be applied asynchronously on an action manager's initiator thread as the
|
|
* preamble of an action.
|
|
* @context: The object which holds the per-zone context for the action
|
|
* @parent: The object to notify when the action is complete
|
|
*/
|
|
typedef void (*vdo_action_preamble_fn)(void *context, struct vdo_completion *parent);
|
|
|
|
/*
|
|
* A function which will run on the action manager's initiator thread as the conclusion of an
|
|
* action.
|
|
* @context: The object which holds the per-zone context for the action
|
|
*
|
|
* Return: VDO_SUCCESS or an error
|
|
*/
|
|
typedef int (*vdo_action_conclusion_fn)(void *context);
|
|
|
|
/*
|
|
* A function to schedule an action.
|
|
* @context: The object which holds the per-zone context for the action
|
|
*
|
|
* Return: true if an action was scheduled
|
|
*/
|
|
typedef bool (*vdo_action_scheduler_fn)(void *context);
|
|
|
|
/*
|
|
* A function to get the id of the thread associated with a given zone.
|
|
* @context: The action context
|
|
* @zone_number: The number of the zone for which the thread ID is desired
|
|
*/
|
|
typedef thread_id_t (*vdo_zone_thread_getter_fn)(void *context, zone_count_t zone_number);
|
|
|
|
struct action_manager;
|
|
|
|
int __must_check vdo_make_action_manager(zone_count_t zones,
|
|
vdo_zone_thread_getter_fn get_zone_thread_id,
|
|
thread_id_t initiator_thread_id, void *context,
|
|
vdo_action_scheduler_fn scheduler,
|
|
struct vdo *vdo,
|
|
struct action_manager **manager_ptr);
|
|
|
|
const struct admin_state_code *__must_check
|
|
vdo_get_current_manager_operation(struct action_manager *manager);
|
|
|
|
void * __must_check vdo_get_current_action_context(struct action_manager *manager);
|
|
|
|
bool vdo_schedule_default_action(struct action_manager *manager);
|
|
|
|
bool vdo_schedule_action(struct action_manager *manager, vdo_action_preamble_fn preamble,
|
|
vdo_zone_action_fn action, vdo_action_conclusion_fn conclusion,
|
|
struct vdo_completion *parent);
|
|
|
|
bool vdo_schedule_operation(struct action_manager *manager,
|
|
const struct admin_state_code *operation,
|
|
vdo_action_preamble_fn preamble, vdo_zone_action_fn action,
|
|
vdo_action_conclusion_fn conclusion,
|
|
struct vdo_completion *parent);
|
|
|
|
bool vdo_schedule_operation_with_context(struct action_manager *manager,
|
|
const struct admin_state_code *operation,
|
|
vdo_action_preamble_fn preamble,
|
|
vdo_zone_action_fn action,
|
|
vdo_action_conclusion_fn conclusion,
|
|
void *context, struct vdo_completion *parent);
|
|
|
|
#endif /* VDO_ACTION_MANAGER_H */
|