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