2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 2003 Sistina Software .
* Copyright ( C ) 2004 Red Hat , Inc . All rights reserved .
*
* Module Author : Heinz Mauelshagen
*
* This file is released under the GPL .
*
* Path - Selector registration .
*/
# ifndef DM_PATH_SELECTOR_H
# define DM_PATH_SELECTOR_H
# include <linux/device-mapper.h>
# include "dm-mpath.h"
/*
* We provide an abstraction for the code that chooses which path
* to send some io down .
*/
struct path_selector_type ;
struct path_selector {
struct path_selector_type * type ;
void * context ;
} ;
/* Information about a path selector type */
struct path_selector_type {
char * name ;
struct module * module ;
unsigned int table_args ;
unsigned int info_args ;
/*
* Constructs a path selector object , takes custom arguments
*/
int ( * create ) ( struct path_selector * ps , unsigned argc , char * * argv ) ;
void ( * destroy ) ( struct path_selector * ps ) ;
/*
* Add an opaque path object , along with some selector specific
* path args ( eg , path priority ) .
*/
2006-12-08 13:36:33 +03:00
int ( * add_path ) ( struct path_selector * ps , struct dm_path * path ,
2005-04-17 02:20:36 +04:00
int argc , char * * argv , char * * error ) ;
/*
* Chooses a path for this io , if no paths are available then
* NULL will be returned .
*
* repeat_count is the number of times to use the path before
* calling the function again . 0 means don ' t call it again unless
* the path fails .
*/
2006-12-08 13:36:33 +03:00
struct dm_path * ( * select_path ) ( struct path_selector * ps ,
2009-06-22 13:12:27 +04:00
unsigned * repeat_count ,
size_t nr_bytes ) ;
2005-04-17 02:20:36 +04:00
/*
* Notify the selector that a path has failed .
*/
2006-12-08 13:36:33 +03:00
void ( * fail_path ) ( struct path_selector * ps , struct dm_path * p ) ;
2005-04-17 02:20:36 +04:00
/*
* Ask selector to reinstate a path .
*/
2006-12-08 13:36:33 +03:00
int ( * reinstate_path ) ( struct path_selector * ps , struct dm_path * p ) ;
2005-04-17 02:20:36 +04:00
/*
* Table content based on parameters added in ps_add_path_fn
* or path selector status
*/
2006-12-08 13:36:33 +03:00
int ( * status ) ( struct path_selector * ps , struct dm_path * path ,
2005-04-17 02:20:36 +04:00
status_type_t type , char * result , unsigned int maxlen ) ;
2009-06-22 13:12:27 +04:00
int ( * start_io ) ( struct path_selector * ps , struct dm_path * path ,
size_t nr_bytes ) ;
int ( * end_io ) ( struct path_selector * ps , struct dm_path * path ,
size_t nr_bytes ) ;
2005-04-17 02:20:36 +04:00
} ;
/* Register a path selector */
int dm_register_path_selector ( struct path_selector_type * type ) ;
/* Unregister a path selector */
int dm_unregister_path_selector ( struct path_selector_type * type ) ;
/* Returns a registered path selector type */
struct path_selector_type * dm_get_path_selector ( const char * name ) ;
/* Releases a path selector */
void dm_put_path_selector ( struct path_selector_type * pst ) ;
# endif