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