c0f8929c2921bb710e20e304989c697214f47f8e
[platform/upstream/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 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 #define VPD_DATA_SIZE           128
25
26 #define SCSI_VENDOR_SIZE        9
27 #define SCSI_PRODUCT_SIZE       17
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_CCW,
63         SYSFS_BUS_CCISS,
64         SYSFS_BUS_NVME,
65 };
66
67 enum pathstates {
68         PSTATE_UNDEF,
69         PSTATE_FAILED,
70         PSTATE_ACTIVE
71 };
72
73 enum pgstates {
74         PGSTATE_UNDEF,
75         PGSTATE_ENABLED,
76         PGSTATE_DISABLED,
77         PGSTATE_ACTIVE
78 };
79
80 enum yes_no_states {
81         YN_NO,
82         YN_YES,
83 };
84
85 enum queue_without_daemon_states {
86         QUE_NO_DAEMON_OFF = YN_NO,
87         QUE_NO_DAEMON_ON = YN_YES,
88         QUE_NO_DAEMON_FORCE,
89 };
90
91 enum attribute_bits {
92         ATTR_UID,
93         ATTR_GID,
94         ATTR_MODE,
95 };
96
97 enum yes_no_undef_states {
98         YNU_UNDEF,
99         YNU_NO,
100         YNU_YES,
101 };
102
103 enum find_multipaths_states {
104         FIND_MULTIPATHS_UNDEF = YNU_UNDEF,
105         FIND_MULTIPATHS_OFF = YNU_NO,
106         FIND_MULTIPATHS_ON = YNU_YES,
107         FIND_MULTIPATHS_GREEDY,
108         FIND_MULTIPATHS_SMART,
109         FIND_MULTIPATHS_STRICT,
110         __FIND_MULTIPATHS_LAST,
111 };
112
113 enum flush_states {
114         FLUSH_UNDEF = YNU_UNDEF,
115         FLUSH_DISABLED = YNU_NO,
116         FLUSH_ENABLED = YNU_YES,
117 };
118
119 enum log_checker_err_states {
120         LOG_CHKR_ERR_ALWAYS,
121         LOG_CHKR_ERR_ONCE,
122 };
123
124 enum user_friendly_names_states {
125         USER_FRIENDLY_NAMES_UNDEF = YNU_UNDEF,
126         USER_FRIENDLY_NAMES_OFF = YNU_NO,
127         USER_FRIENDLY_NAMES_ON = YNU_YES,
128 };
129
130 enum retain_hwhandler_states {
131         RETAIN_HWHANDLER_UNDEF = YNU_UNDEF,
132         RETAIN_HWHANDLER_OFF = YNU_NO,
133         RETAIN_HWHANDLER_ON = YNU_YES,
134 };
135
136 enum detect_prio_states {
137         DETECT_PRIO_UNDEF = YNU_UNDEF,
138         DETECT_PRIO_OFF = YNU_NO,
139         DETECT_PRIO_ON = YNU_YES,
140 };
141
142 enum detect_checker_states {
143         DETECT_CHECKER_UNDEF = YNU_UNDEF,
144         DETECT_CHECKER_OFF = YNU_NO,
145         DETECT_CHECKER_ON = YNU_YES,
146 };
147
148 enum deferred_remove_states {
149         DEFERRED_REMOVE_UNDEF = YNU_UNDEF,
150         DEFERRED_REMOVE_OFF = YNU_NO,
151         DEFERRED_REMOVE_ON = YNU_YES,
152         DEFERRED_REMOVE_IN_PROGRESS,
153 };
154
155 enum skip_kpartx_states {
156         SKIP_KPARTX_UNDEF = YNU_UNDEF,
157         SKIP_KPARTX_OFF = YNU_NO,
158         SKIP_KPARTX_ON = YNU_YES,
159 };
160
161 enum max_sectors_kb_states {
162         MAX_SECTORS_KB_UNDEF = 0,
163         MAX_SECTORS_KB_MIN = 4,  /* can't be smaller than page size */
164 };
165
166 enum scsi_protocol {
167         SCSI_PROTOCOL_FCP = 0,  /* Fibre Channel */
168         SCSI_PROTOCOL_SPI = 1,  /* parallel SCSI */
169         SCSI_PROTOCOL_SSA = 2,  /* Serial Storage Architecture - Obsolete */
170         SCSI_PROTOCOL_SBP = 3,  /* firewire */
171         SCSI_PROTOCOL_SRP = 4,  /* Infiniband RDMA */
172         SCSI_PROTOCOL_ISCSI = 5,
173         SCSI_PROTOCOL_SAS = 6,
174         SCSI_PROTOCOL_ADT = 7,  /* Media Changers */
175         SCSI_PROTOCOL_ATA = 8,
176         SCSI_PROTOCOL_USB = 9,  /* USB Attached SCSI (UAS), and others */
177         SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */
178 };
179
180 #define SCSI_INVALID_LUN ~0ULL
181
182 enum no_undef_states {
183         NU_NO = -1,
184         NU_UNDEF = 0,
185 };
186
187 enum ghost_delay_states {
188         GHOST_DELAY_OFF = NU_NO,
189         GHOST_DELAY_UNDEF = NU_UNDEF,
190 };
191
192 enum initialized_states {
193         INIT_NEW,
194         INIT_FAILED,
195         INIT_MISSING_UDEV,
196         INIT_REQUESTED_UDEV,
197         INIT_OK,
198         /*
199          * INIT_REMOVED: supposed to be removed from pathvec, but still
200          * mapped by some multipath map because of map reload failure.
201          */
202         INIT_REMOVED,
203         /*
204          * INIT_PARTIAL: paths added by update_pathvec_from_dm() will not
205          * be fully initialized. This will be handled when an add or
206          * change uevent is received.
207          */
208         INIT_PARTIAL,
209         __INIT_LAST,
210 };
211
212 enum prkey_sources {
213         PRKEY_SOURCE_NONE,
214         PRKEY_SOURCE_CONF,
215         PRKEY_SOURCE_FILE,
216 };
217
218 enum all_tg_pt_states {
219         ALL_TG_PT_UNDEF = YNU_UNDEF,
220         ALL_TG_PT_OFF = YNU_NO,
221         ALL_TG_PT_ON = YNU_YES,
222 };
223
224 enum vpd_vendor_ids {
225         VPD_VP_UNDEF,
226         VPD_VP_HP3PAR,
227         VPD_VP_ARRAY_SIZE, /* This must remain the last entry */
228 };
229
230 /*
231  * Multipath treats 0 as undefined for optional config parameters.
232  * Use this for cases where 0 is a valid option for systems multipath
233  * is communicating with
234  */
235 enum undefined_off_zero {
236         UOZ_UNDEF = 0,
237         UOZ_OFF = -1,
238         UOZ_ZERO = -2,
239 };
240
241 enum fast_io_fail_states {
242         MP_FAST_IO_FAIL_UNSET = UOZ_UNDEF,
243         MP_FAST_IO_FAIL_OFF = UOZ_OFF,
244         MP_FAST_IO_FAIL_ZERO = UOZ_ZERO,
245 };
246
247 enum eh_deadline_states {
248         EH_DEADLINE_UNSET = UOZ_UNDEF,
249         EH_DEADLINE_OFF = UOZ_OFF,
250         EH_DEADLINE_ZERO = UOZ_ZERO,
251 };
252
253 enum recheck_wwid_states {
254         RECHECK_WWID_UNDEF = YNU_UNDEF,
255         RECHECK_WWID_OFF = YNU_NO,
256         RECHECK_WWID_ON = YNU_YES,
257 };
258
259 struct vpd_vendor_page {
260         int pg;
261         const char *name;
262 };
263 extern struct vpd_vendor_page vpd_vendor_pages[VPD_VP_ARRAY_SIZE];
264
265 struct sg_id {
266         int host_no;
267         int channel;
268         int scsi_id;
269         uint64_t lun;
270         short h_cmd_per_lun;
271         short d_queue_depth;
272         enum scsi_protocol proto_id;
273         int transport_id;
274 };
275
276 # ifndef HDIO_GETGEO
277 #  define HDIO_GETGEO   0x0301  /* get device geometry */
278
279 struct hd_geometry {
280         unsigned char heads;
281         unsigned char sectors;
282         unsigned short cylinders;
283         unsigned long start;
284 };
285 #endif
286
287 struct path {
288         char dev[FILE_NAME_SIZE];
289         char dev_t[BLK_DEV_SIZE];
290         struct udev_device *udev;
291         struct sg_id sg_id;
292         struct hd_geometry geom;
293         char wwid[WWID_SIZE];
294         char vendor_id[SCSI_VENDOR_SIZE];
295         char product_id[PATH_PRODUCT_SIZE];
296         char rev[PATH_REV_SIZE];
297         char serial[SERIAL_SIZE];
298         char tgt_node_name[NODE_NAME_SIZE];
299         char *vpd_data;
300         unsigned long long size;
301         unsigned int checkint;
302         unsigned int tick;
303         int bus;
304         int offline;
305         int state;
306         int dmstate;
307         int chkrstate;
308         int failcount;
309         int priority;
310         int pgindex;
311         int detect_prio;
312         int detect_checker;
313         int tpgs;
314         char * uid_attribute;
315         char * getuid;
316         struct prio prio;
317         struct checker checker;
318         struct multipath * mpp;
319         int fd;
320         int initialized;
321         int retriggers;
322         int partial_retrigger_delay;
323         unsigned int path_failures;
324         time_t dis_reinstate_time;
325         int disable_reinstate;
326         int san_path_err_forget_rate;
327         time_t io_err_dis_reinstate_time;
328         int io_err_disable_reinstate;
329         int io_err_pathfail_cnt;
330         int io_err_pathfail_starttime;
331         int find_multipaths_timeout;
332         int marginal;
333         int vpd_vendor_id;
334         int recheck_wwid;
335         /* configlet pointers */
336         vector hwe;
337         struct gen_path generic_path;
338 };
339
340 typedef int (pgpolicyfn) (struct multipath *, vector);
341
342 struct multipath {
343         char wwid[WWID_SIZE];
344         char alias_old[WWID_SIZE];
345         int pgpolicy;
346         pgpolicyfn *pgpolicyfn;
347         int nextpg;
348         int bestpg;
349         int queuedio;
350         int action;
351         int wait_for_udev;
352         int uev_wait_tick;
353         int pgfailback;
354         int failback_tick;
355         int rr_weight;
356         int no_path_retry; /* number of retries after all paths are down */
357         int retry_tick;    /* remaining times for retries */
358         int disable_queueing;
359         int minio;
360         int flush_on_last_del;
361         int attribute_flags;
362         int fast_io_fail;
363         int retain_hwhandler;
364         int deferred_remove;
365         bool in_recovery;
366         bool need_reload;
367         int san_path_err_threshold;
368         int san_path_err_forget_rate;
369         int san_path_err_recovery_time;
370         int marginal_path_err_sample_time;
371         int marginal_path_err_rate_threshold;
372         int marginal_path_err_recheck_gap_time;
373         int marginal_path_double_failed_time;
374         int skip_kpartx;
375         int max_sectors_kb;
376         int force_readonly;
377         int force_udev_reload;
378         int needs_paths_uevent;
379         int ghost_delay;
380         int ghost_delay_tick;
381         unsigned int dev_loss;
382         int eh_deadline;
383         uid_t uid;
384         gid_t gid;
385         mode_t mode;
386         unsigned long long size;
387         vector paths;
388         vector pg;
389         struct dm_info * dmi;
390
391         /* configlet pointers */
392         char * alias;
393         char * alias_prefix;
394         char * selector;
395         char * features;
396         char * hwhandler;
397         struct mpentry * mpe;
398         vector hwe;
399
400         /* threads */
401         pthread_t waiter;
402
403         /* stats */
404         unsigned int stat_switchgroup;
405         unsigned int stat_path_failures;
406         unsigned int stat_map_loads;
407         unsigned int stat_total_queueing_time;
408         unsigned int stat_queueing_timeouts;
409         unsigned int stat_map_failures;
410
411         /* checkers shared data */
412         void * mpcontext;
413
414         /* persistent management data*/
415         int prkey_source;
416         struct be64 reservation_key;
417         uint8_t sa_flags;
418         unsigned char prflag;
419         int all_tg_pt;
420         struct gen_multipath generic_mp;
421 };
422
423 static inline int marginal_path_check_enabled(const struct multipath *mpp)
424 {
425         return mpp->marginal_path_double_failed_time > 0 &&
426                 mpp->marginal_path_err_sample_time > 0 &&
427                 mpp->marginal_path_err_recheck_gap_time > 0 &&
428                 mpp->marginal_path_err_rate_threshold >= 0;
429 }
430
431 static inline int san_path_check_enabled(const struct multipath *mpp)
432 {
433         return mpp->san_path_err_threshold > 0 &&
434                 mpp->san_path_err_forget_rate > 0 &&
435                 mpp->san_path_err_recovery_time > 0;
436 }
437
438 struct pathgroup {
439         long id;
440         int status;
441         int priority;
442         int enabled_paths;
443         int marginal;
444         vector paths;
445         struct multipath *mpp;
446         struct gen_pathgroup generic_pg;
447 };
448
449 struct adapter_group {
450         char adapter_name[SLOT_NAME_SIZE];
451         struct pathgroup *pgp;
452         int num_hosts;
453         vector host_groups;
454         int next_host_index;
455 };
456
457 struct host_group {
458         int host_no;
459         int num_paths;
460         vector paths;
461 };
462
463 struct path * alloc_path (void);
464 struct pathgroup * alloc_pathgroup (void);
465 struct multipath * alloc_multipath (void);
466 void *set_mpp_hwe(struct multipath *mpp, const struct path *pp);
467 void uninitialize_path(struct path *pp);
468 void free_path (struct path *);
469 void free_pathvec (vector vec, enum free_path_mode free_paths);
470 void free_pathgroup (struct pathgroup * pgp, enum free_path_mode free_paths);
471 void free_pgvec (vector pgvec, enum free_path_mode free_paths);
472 void free_multipath (struct multipath *, enum free_path_mode free_paths);
473 void free_multipath_attributes (struct multipath *);
474 void drop_multipath (vector mpvec, char * wwid, enum free_path_mode free_paths);
475 void free_multipathvec (vector mpvec, enum free_path_mode free_paths);
476
477 struct adapter_group * alloc_adaptergroup(void);
478 struct host_group * alloc_hostgroup(void);
479 void free_adaptergroup(vector adapters);
480 void free_hostgroup(vector hostgroups);
481
482 int store_adaptergroup(vector adapters, struct adapter_group *agp);
483 int store_hostgroup(vector hostgroupvec, struct host_group *hgp);
484
485 int store_path (vector pathvec, struct path * pp);
486 int add_pathgroup(struct multipath*, struct pathgroup *);
487
488 struct multipath * find_mp_by_alias (const struct _vector *mp, const char *alias);
489 struct multipath * find_mp_by_wwid (const struct _vector *mp, const char *wwid);
490 struct multipath * find_mp_by_str (const struct _vector *mp, const char *wwid);
491 struct multipath * find_mp_by_minor (const struct _vector *mp,
492                                      unsigned int minor);
493
494 struct path * find_path_by_devt (const struct _vector *pathvec, const char *devt);
495 struct path * find_path_by_dev (const struct _vector *pathvec, const char *dev);
496 struct path * first_path (const struct multipath *mpp);
497
498 int pathcount (const struct multipath *, int);
499 int count_active_paths(const struct multipath *);
500 int count_active_pending_paths(const struct multipath *);
501 int pathcmp (const struct pathgroup *, const struct pathgroup *);
502 int add_feature (char **, const char *);
503 int remove_feature (char **, const char *);
504
505 extern char sysfs_path[PATH_SIZE];
506
507 #endif /* _STRUCTS_H */