111 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright 2023 Red Hat4 */5 6#ifndef VDO_ACTION_MANAGER_H7#define VDO_ACTION_MANAGER_H8 9#include "admin-state.h"10#include "types.h"11 12/*13 * An action_manager provides a generic mechanism for applying actions to multi-zone entities (such14 * as the block map or slab depot). Each action manager is tied to a specific context for which it15 * manages actions. The manager ensures that only one action is active on that context at a time,16 * and supports at most one pending action. Calls to schedule an action when there is already a17 * pending action will result in VDO_COMPONENT_BUSY errors. Actions may only be submitted to the18 * action manager from a single thread (which thread is determined when the action manager is19 * constructed).20 *21 * A scheduled action consists of four components:22 *23 * preamble24 * an optional method to be run on the initiator thread before applying the action to all zones25 * zone_action26 * an optional method to be applied to each of the zones27 * conclusion28 * an optional method to be run on the initiator thread once the per-zone method has been29 * applied to all zones30 * parent31 * an optional completion to be finished once the conclusion is done32 *33 * At least one of the three methods must be provided.34 */35 36/*37 * A function which is to be applied asynchronously to a set of zones.38 * @context: The object which holds the per-zone context for the action39 * @zone_number: The number of zone to which the action is being applied40 * @parent: The object to notify when the action is complete41 */42typedef void (*vdo_zone_action_fn)(void *context, zone_count_t zone_number,43 struct vdo_completion *parent);44 45/*46 * A function which is to be applied asynchronously on an action manager's initiator thread as the47 * preamble of an action.48 * @context: The object which holds the per-zone context for the action49 * @parent: The object to notify when the action is complete50 */51typedef void (*vdo_action_preamble_fn)(void *context, struct vdo_completion *parent);52 53/*54 * A function which will run on the action manager's initiator thread as the conclusion of an55 * action.56 * @context: The object which holds the per-zone context for the action57 *58 * Return: VDO_SUCCESS or an error59 */60typedef int (*vdo_action_conclusion_fn)(void *context);61 62/*63 * A function to schedule an action.64 * @context: The object which holds the per-zone context for the action65 *66 * Return: true if an action was scheduled67 */68typedef bool (*vdo_action_scheduler_fn)(void *context);69 70/*71 * A function to get the id of the thread associated with a given zone.72 * @context: The action context73 * @zone_number: The number of the zone for which the thread ID is desired74 */75typedef thread_id_t (*vdo_zone_thread_getter_fn)(void *context, zone_count_t zone_number);76 77struct action_manager;78 79int __must_check vdo_make_action_manager(zone_count_t zones,80 vdo_zone_thread_getter_fn get_zone_thread_id,81 thread_id_t initiator_thread_id, void *context,82 vdo_action_scheduler_fn scheduler,83 struct vdo *vdo,84 struct action_manager **manager_ptr);85 86const struct admin_state_code *__must_check87vdo_get_current_manager_operation(struct action_manager *manager);88 89void * __must_check vdo_get_current_action_context(struct action_manager *manager);90 91bool vdo_schedule_default_action(struct action_manager *manager);92 93bool vdo_schedule_action(struct action_manager *manager, vdo_action_preamble_fn preamble,94 vdo_zone_action_fn action, vdo_action_conclusion_fn conclusion,95 struct vdo_completion *parent);96 97bool vdo_schedule_operation(struct action_manager *manager,98 const struct admin_state_code *operation,99 vdo_action_preamble_fn preamble, vdo_zone_action_fn action,100 vdo_action_conclusion_fn conclusion,101 struct vdo_completion *parent);102 103bool vdo_schedule_operation_with_context(struct action_manager *manager,104 const struct admin_state_code *operation,105 vdo_action_preamble_fn preamble,106 vdo_zone_action_fn action,107 vdo_action_conclusion_fn conclusion,108 void *context, struct vdo_completion *parent);109 110#endif /* VDO_ACTION_MANAGER_H */111