On Tue, May 05, 2026 at 05:43:23PM +0200, Martin Wilck wrote:
> Add a framework for an asynchronous path checker utilizing the
> recently added runner code for thread handling.
>
> This code has been derived from the TUR checker code by removing
> all references to the actual sending of TUR ioctls.
>
> Follow-up patches will convert the current TUR checker into an
> instance of this async checker class.
>
> Signed-off-by: Martin Wilck <[email protected]>
> ---
> libmultipath/Makefile | 2 +-
> libmultipath/async_checker.c | 216 +++++++++++++++++++++++++++++++++++
> libmultipath/async_checker.h | 35 ++++++
> libmultipath/checkers.c | 1 +
> libmultipath/checkers.h | 2 +
> 5 files changed, 255 insertions(+), 1 deletion(-)
> create mode 100644 libmultipath/async_checker.c
> create mode 100644 libmultipath/async_checker.h
>
[...]
> diff --git a/libmultipath/async_checker.h b/libmultipath/async_checker.h
> new file mode 100644
> index 0000000..835de2a
> --- /dev/null
> +++ b/libmultipath/async_checker.h
> @@ -0,0 +1,35 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +// Copyright (c) 2026 SUSE LLC
> +#ifndef ASYNC_CHECKER_H_INCLUDED
> +#define ASYNC_CHECKER_H_INCLUDED
> +
> +struct runner_data;
> +struct checker;
> +typedef int (*async_checker_func)(struct runner_data *);
> +
> +struct runner_data {
> + int fd;
> + dev_t devt;
> + async_checker_func afunc;
> + unsigned int timeout;
> + int state;
> + short msgid;
> + char checker_ctx[];
checker_ctx should be probably be aligned.
-Ben
> +};
> +
> +int async_check_init(struct checker *c);
> +void async_check_free(struct checker *c);
> +bool async_check_need_wait(struct checker *c);
> +int async_check_pending(struct checker *c);
> +int async_check_check(struct checker *c);
> +
> +#define CHECKER_MAX_CONTEXT_SIZE 1024
> +
> +/* For testing handling of async checker timeouts */
> +#ifdef ASYNC_TEST_MAJOR
> +static void async_deep_sleep(const struct runner_data *rdata);
> +#else
> +#define async_deep_sleep(x) do {} while (0)
> +#endif
> +
> +#endif
> diff --git a/libmultipath/checkers.c b/libmultipath/checkers.c
> index a3b9cc8..3a1663f 100644
> --- a/libmultipath/checkers.c
> +++ b/libmultipath/checkers.c
> @@ -9,6 +9,7 @@
>
> #include "debug.h"
> #include "checkers.h"
> +#include "async_checker.h"
> #include "vector.h"
> #include "util.h"
>
> diff --git a/libmultipath/checkers.h b/libmultipath/checkers.h
> index 630e987..744be54 100644
> --- a/libmultipath/checkers.h
> +++ b/libmultipath/checkers.h
> @@ -132,6 +132,7 @@ enum {
> };
>
> struct checker;
> +struct runner_data;
> struct checker_class {
> struct list_head node;
> void *handle;
> @@ -144,6 +145,7 @@ struct checker_class {
> void (*reset)(void); /* to reset the global variables */
> int (*pending)(struct checker *); /* to recheck pending paths */
> bool (*need_wait)(struct checker *); /* checker needs waiting for */
> + int (*async_func)(struct runner_data *); /* callback for async_checker
> */
> const char **msgtable;
> short msgtable_size;
> };
> --
> 2.54.0