multipath-tools: add alias_prefix to multipath.conf.5
[multipath-tools/.git] / libmultipath / checkers.h
1 #ifndef _CHECKERS_H
2 #define _CHECKERS_H
3
4 #include "list.h"
5 #include "memory.h"
6
7 /*
8  *
9  * Userspace (multipath/multipathd) path states
10  *
11  * PATH_WILD:
12  * - Use: None of the checkers (returned if we don't have an fd)
13  * - Description: Corner case where "fd <= 0" for path fd (see checker_check())
14  *
15  * PATH_UNCHECKED:
16  * - Use: Only in directio checker
17  * - Description: set when fcntl(F_GETFL) fails to return flags or O_DIRECT
18  *   not include in flags, or O_DIRECT read fails
19  * - Notes:
20  *   - multipathd: uses it to skip over paths in sync_map_state()
21  *   - multipath: used in update_paths(); if state==PATH_UNCHECKED, call
22  *     pathinfo()
23  *
24  * PATH_DOWN:
25  * - Use: All checkers (directio, emc_clariion, hp_sw, readsector0, tur)
26  * - Description: Either a) SG_IO ioctl failed, or b) check condition on some
27  *   SG_IO ioctls that succeed (tur, readsector0 checkers); path is down and
28  *   you shouldn't try to send commands to it
29  *
30  * PATH_UP:
31  * - Use: All checkers (directio, emc_clariion, hp_sw, readsector0, tur)
32  * - Description: Path is up and I/O can be sent to it
33  *
34  * PATH_SHAKY:
35  * - Use: Only emc_clariion
36  * - Description: Indicates path not available for "normal" operations
37  *
38  * PATH_GHOST:
39  * - Use: Only hp_sw and rdac
40  * - Description: Indicates a "passive/standby" path on active/passive HP
41  *   arrays.  These paths will return valid answers to certain SCSI commands
42  *   (tur, read_capacity, inquiry, start_stop), but will fail I/O commands.
43  *   The path needs an initialization command to be sent to it in order for
44  *   I/Os to succeed.
45  *
46  * PATH_PENDING:
47  * - Use: All async checkers
48  * - Description: Indicates a check IO is in flight.
49  *
50  * PATH_TIMEOUT:
51  * - Use: Only tur checker
52  * - Description: Command timed out
53  *
54  * PATH REMOVED:
55  * - Use: All checkers
56  * - Description: Device has been removed from the system
57  *
58  * PATH_DELAYED:
59  * - Use: None of the checkers (returned if the path is being delayed before
60  *   reintegration.
61  * - Description: If a path fails after being up for less than
62  *   delay_watch_checks checks, when it comes back up again, it will not
63  *   be marked as up until it has been up for delay_wait_checks checks.
64  *   During this time, it is marked as "delayed"
65  */
66 enum path_check_state {
67         PATH_WILD,
68         PATH_UNCHECKED,
69         PATH_DOWN,
70         PATH_UP,
71         PATH_SHAKY,
72         PATH_GHOST,
73         PATH_PENDING,
74         PATH_TIMEOUT,
75         PATH_REMOVED,
76         PATH_DELAYED,
77         PATH_MAX_STATE
78 };
79
80 #define DIRECTIO     "directio"
81 #define TUR          "tur"
82 #define HP_SW        "hp_sw"
83 #define RDAC         "rdac"
84 #define EMC_CLARIION "emc_clariion"
85 #define READSECTOR0  "readsector0"
86 #define CCISS_TUR    "cciss_tur"
87
88 #define DEFAULT_CHECKER TUR
89
90 #define ASYNC_TIMEOUT_SEC       30
91
92 /*
93  * strings lengths
94  */
95 #define CHECKER_NAME_LEN 16
96 #define CHECKER_MSG_LEN 256
97 #define CHECKER_DEV_LEN 256
98 #define LIB_CHECKER_NAMELEN 256
99
100 struct checker {
101         struct list_head node;
102         void *handle;
103         int refcount;
104         int fd;
105         int sync;
106         unsigned int timeout;
107         int disable;
108         char name[CHECKER_NAME_LEN];
109         char message[CHECKER_MSG_LEN];       /* comm with callers */
110         void * context;                      /* store for persistent data */
111         void ** mpcontext;                   /* store for persistent data shared
112                                                 multipath-wide. Use MALLOC if
113                                                 you want to stuff data in. */
114         int (*check)(struct checker *);
115         int (*init)(struct checker *);       /* to allocate the context */
116         void (*free)(struct checker *);      /* to free the context */
117 };
118
119 #define MSG(c, fmt, args...) snprintf((c)->message, CHECKER_MSG_LEN, fmt, ##args);
120
121 char * checker_state_name (int);
122 int init_checkers (char *);
123 void cleanup_checkers (void);
124 struct checker * add_checker (char *, char *);
125 struct checker * checker_lookup (char *);
126 int checker_init (struct checker *, void **);
127 void checker_put (struct checker *);
128 void checker_reset (struct checker *);
129 void checker_set_sync (struct checker *);
130 void checker_set_async (struct checker *);
131 void checker_set_fd (struct checker *, int);
132 void checker_enable (struct checker *);
133 void checker_disable (struct checker *);
134 int checker_check (struct checker *);
135 int checker_selected (struct checker *);
136 char * checker_name (struct checker *);
137 char * checker_message (struct checker *);
138 void checker_clear_message (struct checker *c);
139 void checker_get (char *, struct checker *, char *);
140
141 #endif /* _CHECKERS_H */