|  | /* | 
|  | * Copyright (C) 2004 Red Hat, Inc. All rights reserved. | 
|  | * | 
|  | * This file is released under the GPL. | 
|  | * | 
|  | * Multipath hardware handler registration. | 
|  | */ | 
|  |  | 
|  | #ifndef	DM_HW_HANDLER_H | 
|  | #define	DM_HW_HANDLER_H | 
|  |  | 
|  | #include <linux/device-mapper.h> | 
|  |  | 
|  | #include "dm-mpath.h" | 
|  |  | 
|  | struct hw_handler_type; | 
|  | struct hw_handler { | 
|  | struct hw_handler_type *type; | 
|  | void *context; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * Constructs a hardware handler object, takes custom arguments | 
|  | */ | 
|  | /* Information about a hardware handler type */ | 
|  | struct hw_handler_type { | 
|  | char *name; | 
|  | struct module *module; | 
|  |  | 
|  | int (*create) (struct hw_handler *handler, unsigned int argc, | 
|  | char **argv); | 
|  | void (*destroy) (struct hw_handler *hwh); | 
|  |  | 
|  | void (*pg_init) (struct hw_handler *hwh, unsigned bypassed, | 
|  | struct path *path); | 
|  | unsigned (*error) (struct hw_handler *hwh, struct bio *bio); | 
|  | int (*status) (struct hw_handler *hwh, status_type_t type, | 
|  | char *result, unsigned int maxlen); | 
|  | }; | 
|  |  | 
|  | /* Register a hardware handler */ | 
|  | int dm_register_hw_handler(struct hw_handler_type *type); | 
|  |  | 
|  | /* Unregister a hardware handler */ | 
|  | int dm_unregister_hw_handler(struct hw_handler_type *type); | 
|  |  | 
|  | /* Returns a registered hardware handler type */ | 
|  | struct hw_handler_type *dm_get_hw_handler(const char *name); | 
|  |  | 
|  | /* Releases a hardware handler  */ | 
|  | void dm_put_hw_handler(struct hw_handler_type *hwht); | 
|  |  | 
|  | /* Default err function */ | 
|  | unsigned dm_scsi_err_handler(struct hw_handler *hwh, struct bio *bio); | 
|  |  | 
|  | /* Error flags for err and dm_pg_init_complete */ | 
|  | #define MP_FAIL_PATH 1 | 
|  | #define MP_BYPASS_PG 2 | 
|  | #define MP_ERROR_IO  4	/* Don't retry this I/O */ | 
|  |  | 
|  | #endif |