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