58af7a099bba94e61d79a22a309dbf0d84322c2a
[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             128
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 #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 #define _FIND_MULTIPATHS_F (1 << 1)
104 #define _FIND_MULTIPATHS_I (1 << 2)
105 #define _FIND_MULTIPATHS_N (1 << 3)
106 /*
107  * _FIND_MULTIPATHS_F must have the same value as YNU_YES.
108  * Generate a compile time error if that isn't the case.
109  */
110 char ___error1___[-(_FIND_MULTIPATHS_F != YNU_YES)];
111
112 #define find_multipaths_on(conf) \
113         (!!((conf)->find_multipaths & _FIND_MULTIPATHS_F))
114 #define ignore_wwids_on(conf) \
115         (!!((conf)->find_multipaths & _FIND_MULTIPATHS_I))
116 #define ignore_new_devs_on(conf) \
117         (!!((conf)->find_multipaths & _FIND_MULTIPATHS_N))
118
119 enum find_multipaths_states {
120         FIND_MULTIPATHS_UNDEF = YNU_UNDEF,
121         FIND_MULTIPATHS_OFF = YNU_NO,
122         FIND_MULTIPATHS_ON = _FIND_MULTIPATHS_F,
123         FIND_MULTIPATHS_GREEDY = _FIND_MULTIPATHS_I,
124         FIND_MULTIPATHS_SMART = _FIND_MULTIPATHS_F|_FIND_MULTIPATHS_I,
125         FIND_MULTIPATHS_STRICT = _FIND_MULTIPATHS_F|_FIND_MULTIPATHS_N,
126         __FIND_MULTIPATHS_LAST,
127 };
128
129 enum flush_states {
130         FLUSH_UNDEF = YNU_UNDEF,
131         FLUSH_DISABLED = YNU_NO,
132         FLUSH_ENABLED = YNU_YES,
133 };
134
135 enum log_checker_err_states {
136         LOG_CHKR_ERR_ALWAYS,
137         LOG_CHKR_ERR_ONCE,
138 };
139
140 enum user_friendly_names_states {
141         USER_FRIENDLY_NAMES_UNDEF = YNU_UNDEF,
142         USER_FRIENDLY_NAMES_OFF = YNU_NO,
143         USER_FRIENDLY_NAMES_ON = YNU_YES,
144 };
145
146 enum retain_hwhandler_states {
147         RETAIN_HWHANDLER_UNDEF = YNU_UNDEF,
148         RETAIN_HWHANDLER_OFF = YNU_NO,
149         RETAIN_HWHANDLER_ON = YNU_YES,
150 };
151
152 enum detect_prio_states {
153         DETECT_PRIO_UNDEF = YNU_UNDEF,
154         DETECT_PRIO_OFF = YNU_NO,
155         DETECT_PRIO_ON = YNU_YES,
156 };
157
158 enum detect_checker_states {
159         DETECT_CHECKER_UNDEF = YNU_UNDEF,
160         DETECT_CHECKER_OFF = YNU_NO,
161         DETECT_CHECKER_ON = YNU_YES,
162 };
163
164 enum deferred_remove_states {
165         DEFERRED_REMOVE_UNDEF = YNU_UNDEF,
166         DEFERRED_REMOVE_OFF = YNU_NO,
167         DEFERRED_REMOVE_ON = YNU_YES,
168         DEFERRED_REMOVE_IN_PROGRESS,
169 };
170
171 enum skip_kpartx_states {
172         SKIP_KPARTX_UNDEF = YNU_UNDEF,
173         SKIP_KPARTX_OFF = YNU_NO,
174         SKIP_KPARTX_ON = YNU_YES,
175 };
176
177 enum max_sectors_kb_states {
178         MAX_SECTORS_KB_UNDEF = 0,
179         MAX_SECTORS_KB_MIN = 4,  /* can't be smaller than page size */
180 };
181
182 enum scsi_protocol {
183         SCSI_PROTOCOL_FCP = 0,  /* Fibre Channel */
184         SCSI_PROTOCOL_SPI = 1,  /* parallel SCSI */
185         SCSI_PROTOCOL_SSA = 2,  /* Serial Storage Architecture - Obsolete */
186         SCSI_PROTOCOL_SBP = 3,  /* firewire */
187         SCSI_PROTOCOL_SRP = 4,  /* Infiniband RDMA */
188         SCSI_PROTOCOL_ISCSI = 5,
189         SCSI_PROTOCOL_SAS = 6,
190         SCSI_PROTOCOL_ADT = 7,  /* Media Changers */
191         SCSI_PROTOCOL_ATA = 8,
192         SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */
193 };
194
195 enum no_undef_states {
196         NU_NO = -1,
197         NU_UNDEF = 0,
198 };
199
200 enum ghost_delay_states {
201         GHOST_DELAY_OFF = NU_NO,
202         GHOST_DELAY_UNDEF = NU_UNDEF,
203 };
204
205 enum initialized_states {
206         INIT_NEW,
207         INIT_FAILED,
208         INIT_MISSING_UDEV,
209         INIT_REQUESTED_UDEV,
210         INIT_OK,
211 };
212
213 enum prkey_sources {
214         PRKEY_SOURCE_NONE,
215         PRKEY_SOURCE_CONF,
216         PRKEY_SOURCE_FILE,
217 };
218
219 enum all_tg_pt_states {
220         ALL_TG_PT_UNDEF = YNU_UNDEF,
221         ALL_TG_PT_OFF = YNU_NO,
222         ALL_TG_PT_ON = YNU_YES,
223 };
224
225 enum vpd_vendor_ids {
226         VPD_VP_UNDEF,
227         VPD_VP_HP3PAR,
228         VPD_VP_ARRAY_SIZE, /* This must remain the last entry */
229 };
230
231 struct vpd_vendor_page {
232         int pg;
233         const char *name;
234 };
235 extern struct vpd_vendor_page vpd_vendor_pages[VPD_VP_ARRAY_SIZE];
236
237 struct sg_id {
238         int host_no;
239         int channel;
240         int scsi_id;
241         int lun;
242         short h_cmd_per_lun;
243         short d_queue_depth;
244         enum scsi_protocol proto_id;
245         int transport_id;
246 };
247
248 # ifndef HDIO_GETGEO
249 #  define HDIO_GETGEO   0x0301  /* get device geometry */
250
251 struct hd_geometry {
252         unsigned char heads;
253         unsigned char sectors;
254         unsigned short cylinders;
255         unsigned long start;
256 };
257 #endif
258
259 struct path {
260         char dev[FILE_NAME_SIZE];
261         char dev_t[BLK_DEV_SIZE];
262         struct udev_device *udev;
263         struct sg_id sg_id;
264         struct hd_geometry geom;
265         char wwid[WWID_SIZE];
266         char vendor_id[SCSI_VENDOR_SIZE];
267         char product_id[PATH_PRODUCT_SIZE];
268         char rev[PATH_REV_SIZE];
269         char serial[SERIAL_SIZE];
270         char tgt_node_name[NODE_NAME_SIZE];
271         char *vpd_data;
272         unsigned long long size;
273         unsigned int checkint;
274         unsigned int tick;
275         int bus;
276         int offline;
277         int state;
278         int dmstate;
279         int chkrstate;
280         int failcount;
281         int priority;
282         int pgindex;
283         int detect_prio;
284         int detect_checker;
285         int tpgs;
286         char * uid_attribute;
287         char * getuid;
288         struct prio prio;
289         struct checker checker;
290         struct multipath * mpp;
291         int fd;
292         int initialized;
293         int retriggers;
294         unsigned int path_failures;
295         time_t dis_reinstate_time;
296         int disable_reinstate;
297         int san_path_err_forget_rate;
298         time_t io_err_dis_reinstate_time;
299         int io_err_disable_reinstate;
300         int io_err_pathfail_cnt;
301         int io_err_pathfail_starttime;
302         int find_multipaths_timeout;
303         int marginal;
304         int vpd_vendor_id;
305         /* configlet pointers */
306         vector hwe;
307         struct gen_path generic_path;
308 };
309
310 typedef int (pgpolicyfn) (struct multipath *, vector);
311
312 struct multipath {
313         char wwid[WWID_SIZE];
314         char alias_old[WWID_SIZE];
315         int pgpolicy;
316         pgpolicyfn *pgpolicyfn;
317         int nextpg;
318         int bestpg;
319         int queuedio;
320         int action;
321         int wait_for_udev;
322         int uev_wait_tick;
323         int pgfailback;
324         int failback_tick;
325         int rr_weight;
326         int nr_active;     /* current available(= not known as failed) paths */
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         int san_path_err_threshold;
337         int san_path_err_forget_rate;
338         int san_path_err_recovery_time;
339         int marginal_path_err_sample_time;
340         int marginal_path_err_rate_threshold;
341         int marginal_path_err_recheck_gap_time;
342         int marginal_path_double_failed_time;
343         int skip_kpartx;
344         int max_sectors_kb;
345         int force_readonly;
346         int force_udev_reload;
347         int needs_paths_uevent;
348         int ghost_delay;
349         int ghost_delay_tick;
350         unsigned int dev_loss;
351         uid_t uid;
352         gid_t gid;
353         mode_t mode;
354         unsigned long long size;
355         vector paths;
356         vector pg;
357         struct dm_info * dmi;
358
359         /* configlet pointers */
360         char * alias;
361         char * alias_prefix;
362         char * selector;
363         char * features;
364         char * hwhandler;
365         struct mpentry * mpe;
366         vector hwe;
367
368         /* threads */
369         pthread_t waiter;
370
371         /* stats */
372         unsigned int stat_switchgroup;
373         unsigned int stat_path_failures;
374         unsigned int stat_map_loads;
375         unsigned int stat_total_queueing_time;
376         unsigned int stat_queueing_timeouts;
377         unsigned int stat_map_failures;
378
379         /* checkers shared data */
380         void * mpcontext;
381
382         /* persistent management data*/
383         int prkey_source;
384         struct be64 reservation_key;
385         uint8_t sa_flags;
386         unsigned char prflag;
387         int all_tg_pt;
388         struct gen_multipath generic_mp;
389 };
390
391 static inline int marginal_path_check_enabled(const struct multipath *mpp)
392 {
393         return mpp->marginal_path_double_failed_time > 0 &&
394                 mpp->marginal_path_err_sample_time > 0 &&
395                 mpp->marginal_path_err_recheck_gap_time > 0 &&
396                 mpp->marginal_path_err_rate_threshold >= 0;
397 }
398
399 static inline int san_path_check_enabled(const struct multipath *mpp)
400 {
401         return mpp->san_path_err_threshold > 0 &&
402                 mpp->san_path_err_forget_rate > 0 &&
403                 mpp->san_path_err_recovery_time > 0;
404 }
405
406 struct pathgroup {
407         long id;
408         int status;
409         int priority;
410         int enabled_paths;
411         int marginal;
412         vector paths;
413         struct multipath *mpp;
414         struct gen_pathgroup generic_pg;
415 };
416
417 struct adapter_group {
418         char adapter_name[SLOT_NAME_SIZE];
419         struct pathgroup *pgp;
420         int num_hosts;
421         vector host_groups;
422         int next_host_index;
423 };
424
425 struct host_group {
426         int host_no;
427         int num_paths;
428         vector paths;
429 };
430
431 struct path * alloc_path (void);
432 struct pathgroup * alloc_pathgroup (void);
433 struct multipath * alloc_multipath (void);
434 void free_path (struct path *);
435 void free_pathvec (vector vec, enum free_path_mode free_paths);
436 void free_pathgroup (struct pathgroup * pgp, enum free_path_mode free_paths);
437 void free_pgvec (vector pgvec, enum free_path_mode free_paths);
438 void free_multipath (struct multipath *, enum free_path_mode free_paths);
439 void free_multipath_attributes (struct multipath *);
440 void drop_multipath (vector mpvec, char * wwid, enum free_path_mode free_paths);
441 void free_multipathvec (vector mpvec, enum free_path_mode free_paths);
442
443 struct adapter_group * alloc_adaptergroup(void);
444 struct host_group * alloc_hostgroup(void);
445 void free_adaptergroup(vector adapters);
446 void free_hostgroup(vector hostgroups);
447
448 int store_adaptergroup(vector adapters, struct adapter_group *agp);
449 int store_hostgroup(vector hostgroupvec, struct host_group *hgp);
450
451 int store_path (vector pathvec, struct path * pp);
452 int add_pathgroup(struct multipath*, struct pathgroup *);
453
454 struct multipath * find_mp_by_alias (const struct _vector *mp, const char *alias);
455 struct multipath * find_mp_by_wwid (const struct _vector *mp, const char *wwid);
456 struct multipath * find_mp_by_str (const struct _vector *mp, const char *wwid);
457 struct multipath * find_mp_by_minor (const struct _vector *mp,
458                                      unsigned int minor);
459
460 struct path * find_path_by_devt (const struct _vector *pathvec, const char *devt);
461 struct path * find_path_by_dev (const struct _vector *pathvec, const char *dev);
462 struct path * first_path (const struct multipath *mpp);
463
464 int pathcountgr (const struct pathgroup *, int);
465 int pathcount (const struct multipath *, int);
466 int pathcmp (const struct pathgroup *, const struct pathgroup *);
467 int add_feature (char **, const char *);
468 int remove_feature (char **, const char *);
469
470 extern char sysfs_path[PATH_SIZE];
471
472 #endif /* _STRUCTS_H */