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