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