0194b1ec3153c95cefbcf54969c7f6815ae52149
[multipath-tools/.git] / libmultipath / structs.h
1 #ifndef _STRUCTS_H
2 #define _STRUCTS_H
3
4 #include <sys/types.h>
5 #include <inttypes.h>
6
7 #include "prio.h"
8 #include "byteorder.h"
9 #include "generic.h"
10
11 #define WWID_SIZE               128
12 #define SERIAL_SIZE             65
13 #define NODE_NAME_SIZE          224
14 #define PATH_STR_SIZE           16
15 #define PARAMS_SIZE             4096
16 #define FILE_NAME_SIZE          256
17 #define CALLOUT_MAX_SIZE        256
18 #define BLK_DEV_SIZE            33
19 #define PATH_SIZE               512
20 #define NAME_SIZE               512
21 #define HOST_NAME_LEN           16
22 #define SLOT_NAME_SIZE          40
23 #define PRKEY_SIZE              19
24
25 #define SCSI_VENDOR_SIZE        9
26 #define SCSI_PRODUCT_SIZE       17
27 #define SCSI_REV_SIZE           5
28 #define SCSI_STATE_SIZE         19
29 #define NVME_MODEL_SIZE         41
30 #define NVME_REV_SIZE           9
31
32 /* This must be the maximum of SCSI and NVME sizes */
33 #define PATH_PRODUCT_SIZE NVME_MODEL_SIZE
34 #define PATH_REV_SIZE NVME_REV_SIZE
35
36 #define NO_PATH_RETRY_UNDEF     0
37 #define NO_PATH_RETRY_FAIL      -1
38 #define NO_PATH_RETRY_QUEUE     -2
39
40
41 enum free_path_mode {
42         KEEP_PATHS,
43         FREE_PATHS
44 };
45
46 enum rr_weight_mode {
47         RR_WEIGHT_UNDEF,
48         RR_WEIGHT_NONE,
49         RR_WEIGHT_PRIO
50 };
51
52 enum failback_mode {
53         FAILBACK_UNDEF,
54         FAILBACK_MANUAL,
55         FAILBACK_IMMEDIATE,
56         FAILBACK_FOLLOWOVER
57 };
58
59 enum sysfs_buses {
60         SYSFS_BUS_UNDEF,
61         SYSFS_BUS_SCSI,
62         SYSFS_BUS_IDE,
63         SYSFS_BUS_CCW,
64         SYSFS_BUS_CCISS,
65         SYSFS_BUS_RBD,
66         SYSFS_BUS_NVME,
67 };
68
69 enum pathstates {
70         PSTATE_UNDEF,
71         PSTATE_FAILED,
72         PSTATE_ACTIVE
73 };
74
75 enum pgstates {
76         PGSTATE_UNDEF,
77         PGSTATE_ENABLED,
78         PGSTATE_DISABLED,
79         PGSTATE_ACTIVE
80 };
81
82 enum yes_no_states {
83         YN_NO,
84         YN_YES,
85 };
86
87 enum queue_without_daemon_states {
88         QUE_NO_DAEMON_OFF = YN_NO,
89         QUE_NO_DAEMON_ON = YN_YES,
90         QUE_NO_DAEMON_FORCE,
91 };
92
93 enum attribute_bits {
94         ATTR_UID,
95         ATTR_GID,
96         ATTR_MODE,
97 };
98
99 enum yes_no_undef_states {
100         YNU_UNDEF,
101         YNU_NO,
102         YNU_YES,
103 };
104
105 #define _FIND_MULTIPATHS_F (1 << 1)
106 #define _FIND_MULTIPATHS_I (1 << 2)
107 #define _FIND_MULTIPATHS_N (1 << 3)
108 /*
109  * _FIND_MULTIPATHS_F must have the same value as YNU_YES.
110  * Generate a compile time error if that isn't the case.
111  */
112 char ___error1___[-(_FIND_MULTIPATHS_F != YNU_YES)];
113
114 #define find_multipaths_on(conf) \
115         (!!((conf)->find_multipaths & _FIND_MULTIPATHS_F))
116 #define ignore_wwids_on(conf) \
117         (!!((conf)->find_multipaths & _FIND_MULTIPATHS_I))
118 #define ignore_new_devs_on(conf) \
119         (!!((conf)->find_multipaths & _FIND_MULTIPATHS_N))
120
121 enum find_multipaths_states {
122         FIND_MULTIPATHS_UNDEF = YNU_UNDEF,
123         FIND_MULTIPATHS_OFF = YNU_NO,
124         FIND_MULTIPATHS_ON = _FIND_MULTIPATHS_F,
125         FIND_MULTIPATHS_GREEDY = _FIND_MULTIPATHS_I,
126         FIND_MULTIPATHS_SMART = _FIND_MULTIPATHS_F|_FIND_MULTIPATHS_I,
127         FIND_MULTIPATHS_STRICT = _FIND_MULTIPATHS_F|_FIND_MULTIPATHS_N,
128         __FIND_MULTIPATHS_LAST,
129 };
130
131 enum flush_states {
132         FLUSH_UNDEF = YNU_UNDEF,
133         FLUSH_DISABLED = YNU_NO,
134         FLUSH_ENABLED = YNU_YES,
135 };
136
137 enum log_checker_err_states {
138         LOG_CHKR_ERR_ALWAYS,
139         LOG_CHKR_ERR_ONCE,
140 };
141
142 enum user_friendly_names_states {
143         USER_FRIENDLY_NAMES_UNDEF = YNU_UNDEF,
144         USER_FRIENDLY_NAMES_OFF = YNU_NO,
145         USER_FRIENDLY_NAMES_ON = YNU_YES,
146 };
147
148 enum retain_hwhandler_states {
149         RETAIN_HWHANDLER_UNDEF = YNU_UNDEF,
150         RETAIN_HWHANDLER_OFF = YNU_NO,
151         RETAIN_HWHANDLER_ON = YNU_YES,
152 };
153
154 enum detect_prio_states {
155         DETECT_PRIO_UNDEF = YNU_UNDEF,
156         DETECT_PRIO_OFF = YNU_NO,
157         DETECT_PRIO_ON = YNU_YES,
158 };
159
160 enum detect_checker_states {
161         DETECT_CHECKER_UNDEF = YNU_UNDEF,
162         DETECT_CHECKER_OFF = YNU_NO,
163         DETECT_CHECKER_ON = YNU_YES,
164 };
165
166 enum deferred_remove_states {
167         DEFERRED_REMOVE_UNDEF = YNU_UNDEF,
168         DEFERRED_REMOVE_OFF = YNU_NO,
169         DEFERRED_REMOVE_ON = YNU_YES,
170         DEFERRED_REMOVE_IN_PROGRESS,
171 };
172
173 enum skip_kpartx_states {
174         SKIP_KPARTX_UNDEF = YNU_UNDEF,
175         SKIP_KPARTX_OFF = YNU_NO,
176         SKIP_KPARTX_ON = YNU_YES,
177 };
178
179 enum max_sectors_kb_states {
180         MAX_SECTORS_KB_UNDEF = 0,
181         MAX_SECTORS_KB_MIN = 4,  /* can't be smaller than page size */
182 };
183
184 enum scsi_protocol {
185         SCSI_PROTOCOL_FCP = 0,  /* Fibre Channel */
186         SCSI_PROTOCOL_SPI = 1,  /* parallel SCSI */
187         SCSI_PROTOCOL_SSA = 2,  /* Serial Storage Architecture - Obsolete */
188         SCSI_PROTOCOL_SBP = 3,  /* firewire */
189         SCSI_PROTOCOL_SRP = 4,  /* Infiniband RDMA */
190         SCSI_PROTOCOL_ISCSI = 5,
191         SCSI_PROTOCOL_SAS = 6,
192         SCSI_PROTOCOL_ADT = 7,  /* Media Changers */
193         SCSI_PROTOCOL_ATA = 8,
194         SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */
195 };
196
197 enum no_undef_states {
198         NU_NO = -1,
199         NU_UNDEF = 0,
200 };
201
202 enum ghost_delay_states {
203         GHOST_DELAY_OFF = NU_NO,
204         GHOST_DELAY_UNDEF = NU_UNDEF,
205 };
206
207 enum initialized_states {
208         INIT_FAILED,
209         INIT_MISSING_UDEV,
210         INIT_REQUESTED_UDEV,
211         INIT_OK,
212 };
213
214 enum prkey_sources {
215         PRKEY_SOURCE_NONE,
216         PRKEY_SOURCE_CONF,
217         PRKEY_SOURCE_FILE,
218 };
219
220 enum all_tg_pt_states {
221         ALL_TG_PT_UNDEF = YNU_UNDEF,
222         ALL_TG_PT_OFF = YNU_NO,
223         ALL_TG_PT_ON = YNU_YES,
224 };
225
226 struct sg_id {
227         int host_no;
228         int channel;
229         int scsi_id;
230         int lun;
231         short h_cmd_per_lun;
232         short d_queue_depth;
233         enum scsi_protocol proto_id;
234         int transport_id;
235 };
236
237 # ifndef HDIO_GETGEO
238 #  define HDIO_GETGEO   0x0301  /* get device geometry */
239
240 struct hd_geometry {
241         unsigned char heads;
242         unsigned char sectors;
243         unsigned short cylinders;
244         unsigned long start;
245 };
246 #endif
247
248 struct path {
249         char dev[FILE_NAME_SIZE];
250         char dev_t[BLK_DEV_SIZE];
251         struct udev_device *udev;
252         struct sg_id sg_id;
253         struct hd_geometry geom;
254         char wwid[WWID_SIZE];
255         char vendor_id[SCSI_VENDOR_SIZE];
256         char product_id[PATH_PRODUCT_SIZE];
257         char rev[PATH_REV_SIZE];
258         char serial[SERIAL_SIZE];
259         char tgt_node_name[NODE_NAME_SIZE];
260         unsigned long long size;
261         unsigned int checkint;
262         unsigned int tick;
263         int bus;
264         int offline;
265         int state;
266         int dmstate;
267         int chkrstate;
268         int failcount;
269         int priority;
270         int pgindex;
271         int detect_prio;
272         int detect_checker;
273         int watch_checks;
274         int wait_checks;
275         int tpgs;
276         char * uid_attribute;
277         char * getuid;
278         struct prio prio;
279         char * prio_args;
280         struct checker checker;
281         struct multipath * mpp;
282         int fd;
283         int initialized;
284         int retriggers;
285         int wwid_changed;
286         time_t io_err_dis_reinstate_time;
287         int io_err_disable_reinstate;
288         int io_err_pathfail_cnt;
289         int io_err_pathfail_starttime;
290         int find_multipaths_timeout;
291         /* configlet pointers */
292         struct hwentry * hwe;
293         struct gen_path generic_path;
294 };
295
296 typedef int (pgpolicyfn) (struct multipath *);
297
298 struct multipath {
299         char wwid[WWID_SIZE];
300         char alias_old[WWID_SIZE];
301         int pgpolicy;
302         pgpolicyfn *pgpolicyfn;
303         int nextpg;
304         int bestpg;
305         int queuedio;
306         int action;
307         int wait_for_udev;
308         int uev_wait_tick;
309         int pgfailback;
310         int failback_tick;
311         int rr_weight;
312         int nr_active;     /* current available(= not known as failed) paths */
313         int no_path_retry; /* number of retries after all paths are down */
314         int retry_tick;    /* remaining times for retries */
315         int disable_queueing;
316         int minio;
317         int flush_on_last_del;
318         int attribute_flags;
319         int fast_io_fail;
320         int retain_hwhandler;
321         int deferred_remove;
322         int delay_watch_checks;
323         int delay_wait_checks;
324         int marginal_path_err_sample_time;
325         int marginal_path_err_rate_threshold;
326         int marginal_path_err_recheck_gap_time;
327         int marginal_path_double_failed_time;
328         int skip_kpartx;
329         int max_sectors_kb;
330         int force_readonly;
331         int force_udev_reload;
332         int needs_paths_uevent;
333         int ghost_delay;
334         int ghost_delay_tick;
335         unsigned int dev_loss;
336         uid_t uid;
337         gid_t gid;
338         mode_t mode;
339         unsigned long long size;
340         vector paths;
341         vector pg;
342         struct dm_info * dmi;
343
344         /* configlet pointers */
345         char * alias;
346         char * alias_prefix;
347         char * selector;
348         char * features;
349         char * hwhandler;
350         struct mpentry * mpe;
351         struct hwentry * hwe;
352
353         /* threads */
354         pthread_t waiter;
355
356         /* stats */
357         unsigned int stat_switchgroup;
358         unsigned int stat_path_failures;
359         unsigned int stat_map_loads;
360         unsigned int stat_total_queueing_time;
361         unsigned int stat_queueing_timeouts;
362         unsigned int stat_map_failures;
363
364         /* checkers shared data */
365         void * mpcontext;
366
367         /* persistent management data*/
368         int prkey_source;
369         struct be64 reservation_key;
370         unsigned char prflag;
371         int all_tg_pt;
372         struct gen_multipath generic_mp;
373 };
374
375 struct pathgroup {
376         long id;
377         int status;
378         int priority;
379         int enabled_paths;
380         vector paths;
381         struct multipath *mpp;
382         struct gen_pathgroup generic_pg;
383 };
384
385 struct adapter_group {
386         char adapter_name[SLOT_NAME_SIZE];
387         struct pathgroup *pgp;
388         int num_hosts;
389         vector host_groups;
390         int next_host_index;
391 };
392
393 struct host_group {
394         int host_no;
395         int num_paths;
396         vector paths;
397 };
398
399 struct path * alloc_path (void);
400 struct pathgroup * alloc_pathgroup (void);
401 struct multipath * alloc_multipath (void);
402 void free_path (struct path *);
403 void free_pathvec (vector vec, enum free_path_mode free_paths);
404 void free_pathgroup (struct pathgroup * pgp, enum free_path_mode free_paths);
405 void free_pgvec (vector pgvec, enum free_path_mode free_paths);
406 void free_multipath (struct multipath *, enum free_path_mode free_paths);
407 void free_multipath_attributes (struct multipath *);
408 void drop_multipath (vector mpvec, char * wwid, enum free_path_mode free_paths);
409 void free_multipathvec (vector mpvec, enum free_path_mode free_paths);
410
411 struct adapter_group * alloc_adaptergroup(void);
412 struct host_group * alloc_hostgroup(void);
413 void free_adaptergroup(vector adapters);
414 void free_hostgroup(vector hostgroups);
415
416 int store_adaptergroup(vector adapters, struct adapter_group *agp);
417 int store_hostgroup(vector hostgroupvec, struct host_group *hgp);
418
419 int store_path (vector pathvec, struct path * pp);
420 int store_pathgroup (vector pgvec, struct pathgroup * pgp);
421 int add_pathgroup(struct multipath*, struct pathgroup *);
422
423 struct multipath * find_mp_by_alias (vector mp, const char * alias);
424 struct multipath * find_mp_by_wwid (vector mp, char * wwid);
425 struct multipath * find_mp_by_str (vector mp, char * wwid);
426 struct multipath * find_mp_by_minor (vector mp, int minor);
427
428 struct path * find_path_by_devt (vector pathvec, const char * devt);
429 struct path * find_path_by_dev (vector pathvec, const char * dev);
430 struct path * first_path (struct multipath * mpp);
431
432 int pathcountgr (struct pathgroup *, int);
433 int pathcount (struct multipath *, int);
434 int pathcmp (struct pathgroup *, struct pathgroup *);
435 int add_feature (char **, const char *);
436 int remove_feature (char **, const char *);
437
438 extern char sysfs_path[PATH_SIZE];
439
440 #endif /* _STRUCTS_H */