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