18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Copyright (C) 2003 Sistina Software.
38c2ecf20Sopenharmony_ci * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Module Author: Heinz Mauelshagen
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * This file is released under the GPL.
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci * Path-Selector registration.
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#ifndef	DM_PATH_SELECTOR_H
138c2ecf20Sopenharmony_ci#define	DM_PATH_SELECTOR_H
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <linux/device-mapper.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#include "dm-mpath.h"
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci/*
208c2ecf20Sopenharmony_ci * We provide an abstraction for the code that chooses which path
218c2ecf20Sopenharmony_ci * to send some io down.
228c2ecf20Sopenharmony_ci */
238c2ecf20Sopenharmony_cistruct path_selector_type;
248c2ecf20Sopenharmony_cistruct path_selector {
258c2ecf20Sopenharmony_ci	struct path_selector_type *type;
268c2ecf20Sopenharmony_ci	void *context;
278c2ecf20Sopenharmony_ci};
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci/* Information about a path selector type */
308c2ecf20Sopenharmony_cistruct path_selector_type {
318c2ecf20Sopenharmony_ci	char *name;
328c2ecf20Sopenharmony_ci	struct module *module;
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	unsigned int table_args;
358c2ecf20Sopenharmony_ci	unsigned int info_args;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	/*
388c2ecf20Sopenharmony_ci	 * Constructs a path selector object, takes custom arguments
398c2ecf20Sopenharmony_ci	 */
408c2ecf20Sopenharmony_ci	int (*create) (struct path_selector *ps, unsigned argc, char **argv);
418c2ecf20Sopenharmony_ci	void (*destroy) (struct path_selector *ps);
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	/*
448c2ecf20Sopenharmony_ci	 * Add an opaque path object, along with some selector specific
458c2ecf20Sopenharmony_ci	 * path args (eg, path priority).
468c2ecf20Sopenharmony_ci	 */
478c2ecf20Sopenharmony_ci	int (*add_path) (struct path_selector *ps, struct dm_path *path,
488c2ecf20Sopenharmony_ci			 int argc, char **argv, char **error);
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	/*
518c2ecf20Sopenharmony_ci	 * Chooses a path for this io, if no paths are available then
528c2ecf20Sopenharmony_ci	 * NULL will be returned.
538c2ecf20Sopenharmony_ci	 */
548c2ecf20Sopenharmony_ci	struct dm_path *(*select_path) (struct path_selector *ps,
558c2ecf20Sopenharmony_ci					size_t nr_bytes);
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	/*
588c2ecf20Sopenharmony_ci	 * Notify the selector that a path has failed.
598c2ecf20Sopenharmony_ci	 */
608c2ecf20Sopenharmony_ci	void (*fail_path) (struct path_selector *ps, struct dm_path *p);
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	/*
638c2ecf20Sopenharmony_ci	 * Ask selector to reinstate a path.
648c2ecf20Sopenharmony_ci	 */
658c2ecf20Sopenharmony_ci	int (*reinstate_path) (struct path_selector *ps, struct dm_path *p);
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	/*
688c2ecf20Sopenharmony_ci	 * Table content based on parameters added in ps_add_path_fn
698c2ecf20Sopenharmony_ci	 * or path selector status
708c2ecf20Sopenharmony_ci	 */
718c2ecf20Sopenharmony_ci	int (*status) (struct path_selector *ps, struct dm_path *path,
728c2ecf20Sopenharmony_ci		       status_type_t type, char *result, unsigned int maxlen);
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci	int (*start_io) (struct path_selector *ps, struct dm_path *path,
758c2ecf20Sopenharmony_ci			 size_t nr_bytes);
768c2ecf20Sopenharmony_ci	int (*end_io) (struct path_selector *ps, struct dm_path *path,
778c2ecf20Sopenharmony_ci		       size_t nr_bytes, u64 start_time);
788c2ecf20Sopenharmony_ci};
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci/* Register a path selector */
818c2ecf20Sopenharmony_ciint dm_register_path_selector(struct path_selector_type *type);
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci/* Unregister a path selector */
848c2ecf20Sopenharmony_ciint dm_unregister_path_selector(struct path_selector_type *type);
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci/* Returns a registered path selector type */
878c2ecf20Sopenharmony_cistruct path_selector_type *dm_get_path_selector(const char *name);
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci/* Releases a path selector  */
908c2ecf20Sopenharmony_civoid dm_put_path_selector(struct path_selector_type *pst);
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci#endif
93