^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Copyright (C) 2003 Sistina Software.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Module Author: Heinz Mauelshagen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * This file is released under the GPL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Path-Selector registration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #ifndef DM_PATH_SELECTOR_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define DM_PATH_SELECTOR_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/device-mapper.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include "dm-mpath.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * We provide an abstraction for the code that chooses which path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * to send some io down.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) struct path_selector_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) struct path_selector {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) struct path_selector_type *type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) void *context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) /* Information about a path selector type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct path_selector_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct module *module;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) unsigned int table_args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) unsigned int info_args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * Constructs a path selector object, takes custom arguments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) int (*create) (struct path_selector *ps, unsigned argc, char **argv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) void (*destroy) (struct path_selector *ps);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * Add an opaque path object, along with some selector specific
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * path args (eg, path priority).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) int (*add_path) (struct path_selector *ps, struct dm_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) int argc, char **argv, char **error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * Chooses a path for this io, if no paths are available then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * NULL will be returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct dm_path *(*select_path) (struct path_selector *ps,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) size_t nr_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * Notify the selector that a path has failed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) void (*fail_path) (struct path_selector *ps, struct dm_path *p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * Ask selector to reinstate a path.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) int (*reinstate_path) (struct path_selector *ps, struct dm_path *p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * Table content based on parameters added in ps_add_path_fn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * or path selector status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) int (*status) (struct path_selector *ps, struct dm_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) status_type_t type, char *result, unsigned int maxlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) int (*start_io) (struct path_selector *ps, struct dm_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) size_t nr_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) int (*end_io) (struct path_selector *ps, struct dm_path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) size_t nr_bytes, u64 start_time);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /* Register a path selector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) int dm_register_path_selector(struct path_selector_type *type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /* Unregister a path selector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) int dm_unregister_path_selector(struct path_selector_type *type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /* Returns a registered path selector type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) struct path_selector_type *dm_get_path_selector(const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /* Releases a path selector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) void dm_put_path_selector(struct path_selector_type *pst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #endif