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