11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Copyright (C) 2003 Sistina Software. 31da177e4SLinus Torvalds * Copyright (C) 2004 Red Hat, Inc. All rights reserved. 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Module Author: Heinz Mauelshagen 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * This file is released under the GPL. 81da177e4SLinus Torvalds * 91da177e4SLinus Torvalds * Path-Selector registration. 101da177e4SLinus Torvalds */ 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #ifndef DM_PATH_SELECTOR_H 131da177e4SLinus Torvalds #define DM_PATH_SELECTOR_H 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds #include <linux/device-mapper.h> 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds #include "dm-mpath.h" 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds /* 201da177e4SLinus Torvalds * We provide an abstraction for the code that chooses which path 211da177e4SLinus Torvalds * to send some io down. 221da177e4SLinus Torvalds */ 231da177e4SLinus Torvalds struct path_selector_type; 241da177e4SLinus Torvalds struct path_selector { 251da177e4SLinus Torvalds struct path_selector_type *type; 261da177e4SLinus Torvalds void *context; 271da177e4SLinus Torvalds }; 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds /* Information about a path selector type */ 301da177e4SLinus Torvalds struct path_selector_type { 311da177e4SLinus Torvalds char *name; 321da177e4SLinus Torvalds struct module *module; 331da177e4SLinus Torvalds 341da177e4SLinus Torvalds unsigned int table_args; 351da177e4SLinus Torvalds unsigned int info_args; 361da177e4SLinus Torvalds 371da177e4SLinus Torvalds /* 381da177e4SLinus Torvalds * Constructs a path selector object, takes custom arguments 391da177e4SLinus Torvalds */ 401da177e4SLinus Torvalds int (*create) (struct path_selector *ps, unsigned argc, char **argv); 411da177e4SLinus Torvalds void (*destroy) (struct path_selector *ps); 421da177e4SLinus Torvalds 431da177e4SLinus Torvalds /* 441da177e4SLinus Torvalds * Add an opaque path object, along with some selector specific 451da177e4SLinus Torvalds * path args (eg, path priority). 461da177e4SLinus Torvalds */ 47c922d5f7SJosef "Jeff" Sipek int (*add_path) (struct path_selector *ps, struct dm_path *path, 481da177e4SLinus Torvalds int argc, char **argv, char **error); 491da177e4SLinus Torvalds 501da177e4SLinus Torvalds /* 511da177e4SLinus Torvalds * Chooses a path for this io, if no paths are available then 521da177e4SLinus Torvalds * NULL will be returned. 531da177e4SLinus Torvalds */ 54c922d5f7SJosef "Jeff" Sipek struct dm_path *(*select_path) (struct path_selector *ps, 5502ab823fSKiyoshi Ueda size_t nr_bytes); 561da177e4SLinus Torvalds 571da177e4SLinus Torvalds /* 581da177e4SLinus Torvalds * Notify the selector that a path has failed. 591da177e4SLinus Torvalds */ 60c922d5f7SJosef "Jeff" Sipek void (*fail_path) (struct path_selector *ps, struct dm_path *p); 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds /* 631da177e4SLinus Torvalds * Ask selector to reinstate a path. 641da177e4SLinus Torvalds */ 65c922d5f7SJosef "Jeff" Sipek int (*reinstate_path) (struct path_selector *ps, struct dm_path *p); 661da177e4SLinus Torvalds 671da177e4SLinus Torvalds /* 681da177e4SLinus Torvalds * Table content based on parameters added in ps_add_path_fn 691da177e4SLinus Torvalds * or path selector status 701da177e4SLinus Torvalds */ 71c922d5f7SJosef "Jeff" Sipek int (*status) (struct path_selector *ps, struct dm_path *path, 721da177e4SLinus Torvalds status_type_t type, char *result, unsigned int maxlen); 731da177e4SLinus Torvalds 7402ab823fSKiyoshi Ueda int (*start_io) (struct path_selector *ps, struct dm_path *path, 7502ab823fSKiyoshi Ueda size_t nr_bytes); 7602ab823fSKiyoshi Ueda int (*end_io) (struct path_selector *ps, struct dm_path *path, 77*087615bfSGabriel Krisman Bertazi size_t nr_bytes, u64 start_time); 781da177e4SLinus Torvalds }; 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds /* Register a path selector */ 811da177e4SLinus Torvalds int dm_register_path_selector(struct path_selector_type *type); 821da177e4SLinus Torvalds 831da177e4SLinus Torvalds /* Unregister a path selector */ 841da177e4SLinus Torvalds int dm_unregister_path_selector(struct path_selector_type *type); 851da177e4SLinus Torvalds 861da177e4SLinus Torvalds /* Returns a registered path selector type */ 871da177e4SLinus Torvalds struct path_selector_type *dm_get_path_selector(const char *name); 881da177e4SLinus Torvalds 891da177e4SLinus Torvalds /* Releases a path selector */ 901da177e4SLinus Torvalds void dm_put_path_selector(struct path_selector_type *pst); 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds #endif 93