brintos

brintos / linux-shallow public Read only

0
0
Text · 4.7 KiB · 3407f34 Raw
153 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright 2023 Red Hat4 */5 6#ifndef VDO_COMPLETION_H7#define VDO_COMPLETION_H8 9#include "permassert.h"10 11#include "status-codes.h"12#include "types.h"13 14/**15 * vdo_run_completion() - Run a completion's callback or error handler on the current thread.16 *17 * Context: This function must be called from the correct callback thread.18 */19static inline void vdo_run_completion(struct vdo_completion *completion)20{21	if ((completion->result != VDO_SUCCESS) && (completion->error_handler != NULL)) {22		completion->error_handler(completion);23		return;24	}25 26	completion->callback(completion);27}28 29void vdo_set_completion_result(struct vdo_completion *completion, int result);30 31void vdo_initialize_completion(struct vdo_completion *completion, struct vdo *vdo,32			       enum vdo_completion_type type);33 34/**35 * vdo_reset_completion() - Reset a completion to a clean state, while keeping the type, vdo and36 *                          parent information.37 */38static inline void vdo_reset_completion(struct vdo_completion *completion)39{40	completion->result = VDO_SUCCESS;41	completion->complete = false;42}43 44void vdo_launch_completion_with_priority(struct vdo_completion *completion,45					 enum vdo_completion_priority priority);46 47/**48 * vdo_launch_completion() - Launch a completion with default priority.49 */50static inline void vdo_launch_completion(struct vdo_completion *completion)51{52	vdo_launch_completion_with_priority(completion, VDO_WORK_Q_DEFAULT_PRIORITY);53}54 55/**56 * vdo_continue_completion() - Continue processing a completion.57 * @result: The current result (will not mask older errors).58 *59 * Continue processing a completion by setting the current result and calling60 * vdo_launch_completion().61 */62static inline void vdo_continue_completion(struct vdo_completion *completion, int result)63{64	vdo_set_completion_result(completion, result);65	vdo_launch_completion(completion);66}67 68void vdo_finish_completion(struct vdo_completion *completion);69 70/**71 * vdo_fail_completion() - Set the result of a completion if it does not already have an error,72 *                         then finish it.73 */74static inline void vdo_fail_completion(struct vdo_completion *completion, int result)75{76	vdo_set_completion_result(completion, result);77	vdo_finish_completion(completion);78}79 80/**81 * vdo_assert_completion_type() - Assert that a completion is of the correct type.82 *83 * Return: VDO_SUCCESS or an error84 */85static inline int vdo_assert_completion_type(struct vdo_completion *completion,86					     enum vdo_completion_type expected)87{88	return VDO_ASSERT(expected == completion->type,89			  "completion type should be %u, not %u", expected,90			  completion->type);91}92 93static inline void vdo_set_completion_callback(struct vdo_completion *completion,94					       vdo_action_fn callback,95					       thread_id_t callback_thread_id)96{97	completion->callback = callback;98	completion->callback_thread_id = callback_thread_id;99}100 101/**102 * vdo_launch_completion_callback() - Set the callback for a completion and launch it immediately.103 */104static inline void vdo_launch_completion_callback(struct vdo_completion *completion,105						  vdo_action_fn callback,106						  thread_id_t callback_thread_id)107{108	vdo_set_completion_callback(completion, callback, callback_thread_id);109	vdo_launch_completion(completion);110}111 112/**113 * vdo_prepare_completion() - Prepare a completion for launch.114 *115 * Resets the completion, and then sets its callback, error handler, callback thread, and parent.116 */117static inline void vdo_prepare_completion(struct vdo_completion *completion,118					  vdo_action_fn callback,119					  vdo_action_fn error_handler,120					  thread_id_t callback_thread_id, void *parent)121{122	vdo_reset_completion(completion);123	vdo_set_completion_callback(completion, callback, callback_thread_id);124	completion->error_handler = error_handler;125	completion->parent = parent;126}127 128/**129 * vdo_prepare_completion_for_requeue() - Prepare a completion for launch ensuring that it will130 *                                        always be requeued.131 *132 * Resets the completion, and then sets its callback, error handler, callback thread, and parent.133 */134static inline void vdo_prepare_completion_for_requeue(struct vdo_completion *completion,135						      vdo_action_fn callback,136						      vdo_action_fn error_handler,137						      thread_id_t callback_thread_id,138						      void *parent)139{140	vdo_prepare_completion(completion, callback, error_handler,141			       callback_thread_id, parent);142	completion->requeue = true;143}144 145void vdo_enqueue_completion(struct vdo_completion *completion,146			    enum vdo_completion_priority priority);147 148 149bool vdo_requeue_completion_if_needed(struct vdo_completion *completion,150				      thread_id_t callback_thread_id);151 152#endif /* VDO_COMPLETION_H */153