libmultipath: add wrapper function around pgpolicyfn
[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
25 #define SCSI_VENDOR_SIZE        9
26 #define SCSI_PRODUCT_SIZE       17
27 #define SCSI_STATE_SIZE         19
28 #define NVME_MODEL_SIZE         41
29 #define NVME_REV_SIZE           9
30
31 /* This must be the maximum of SCSI and NVME sizes */
32 #define PATH_PRODUCT_SIZE NVME_MODEL_SIZE
33 #define PATH_REV_SIZE NVME_REV_SIZE
34
35 #define NO_PATH_RETRY_UNDEF     0
36 #define NO_PATH_RETRY_FAIL      -1
37 #define NO_PATH_RETRY_QUEUE     -2
38
39
40 enum free_path_mode {
41         KEEP_PATHS,
42         FREE_PATHS
43 };
44
45 enum rr_weight_mode {
46         RR_WEIGHT_UNDEF,
47         RR_WEIGHT_NONE,
48         RR_WEIGHT_PRIO
49 };
50
51 enum failback_mode {
52         FAILBACK_UNDEF,
53         FAILBACK_MANUAL,
54         FAILBACK_IMMEDIATE,
55         FAILBACK_FOLLOWOVER
56 };
57
58 enum sysfs_buses {
59         SYSFS_BUS_UNDEF,
60         SYSFS_BUS_SCSI,
61         SYSFS_BUS_CCW,
62         SYSFS_BUS_CCISS,
63         SYSFS_BUS_NVME,
64 };
65
66 enum pathstates {
67         PSTATE_UNDEF,
68         PSTATE_FAILED,
69         PSTATE_ACTIVE
70 };
71
72 enum pgstates {
73         PGSTATE_UNDEF,
74         PGSTATE_ENABLED,
75         PGSTATE_DISABLED,
76         PGSTATE_ACTIVE
77 };
78
79 enum yes_no_states {
80         YN_NO,
81         YN_YES,
82 };
83
84 enum queue_without_daemon_states {
85         QUE_NO_DAEMON_OFF = YN_NO,
86         QUE_NO_DAEMON_ON = YN_YES,
87         QUE_NO_DAEMON_FORCE,
88 };
89
90 enum attribute_bits {
91         ATTR_UID,
92         ATTR_GID,
93         ATTR_MODE,
94 };
95
96 enum yes_no_undef_states {
97         YNU_UNDEF,
98         YNU_NO,
99         YNU_YES,
100 };
101
102 #define _FIND_MULTIPATHS_F (1 << 1)
103 #define _FIND_MULTIPATHS_I (1 << 2)
104 #define _FIND_MULTIPATHS_N (1 << 3)
105 /*
106  * _FIND_MULTIPATHS_F must have the same value as YNU_YES.
107  * Generate a compile time error if that isn't the case.
108  */
109 char ___error1___[-(_FIND_MULTIPATHS_F != YNU_YES)];
110
111 #define find_multipaths_on(conf) \
112         (!!((conf)->find_multipaths & _FIND_MULTIPATHS_F))
113 #define ignore_wwids_on(conf) \
114         (!!((conf)->find_multipaths & _FIND_MULTIPATHS_I))
115 #define ignore_new_devs_on(conf) \
116         (!!((conf)->find_multipaths & _FIND_MULTIPATHS_N))
117
118 enum find_multipaths_states {
119         FIND_MULTIPATHS_UNDEF = YNU_UNDEF,
120         FIND_MULTIPATHS_OFF = YNU_NO,
121         FIND_MULTIPATHS_ON = _FIND_MULTIPATHS_F,
122         FIND_MULTIPATHS_GREEDY = _FIND_MULTIPATHS_I,
123         FIND_MULTIPATHS_SMART = _FIND_MULTIPATHS_F|_FIND_MULTIPATHS_I,
124         FIND_MULTIPATHS_STRICT = _FIND_MULTIPATHS_F|_FIND_MULTIPATHS_N,
125         __FIND_MULTIPATHS_LAST,
126 };
127
128 enum flush_states {
129         FLUSH_UNDEF = YNU_UNDEF,
130         FLUSH_DISABLED = YNU_NO,
131         FLUSH_ENABLED = YNU_YES,
132 };
133
134 enum log_checker_err_states {
135         LOG_CHKR_ERR_ALWAYS,
136         LOG_CHKR_ERR_ONCE,
137 };
138
139 enum user_friendly_names_states {
140         USER_FRIENDLY_NAMES_UNDEF = YNU_UNDEF,
141         USER_FRIENDLY_NAMES_OFF = YNU_NO,
142         USER_FRIENDLY_NAMES_ON = YNU_YES,
143 };
144
145 enum retain_hwhandler_states {
146         RETAIN_HWHANDLER_UNDEF = YNU_UNDEF,
147         RETAIN_HWHANDLER_OFF = YNU_NO,
148         RETAIN_HWHANDLER_ON = YNU_YES,
149 };
150
151 enum detect_prio_states {
152         DETECT_PRIO_UNDEF = YNU_UNDEF,
153         DETECT_PRIO_OFF = YNU_NO,
154         DETECT_PRIO_ON = YNU_YES,
155 };
156
157 enum detect_checker_states {
158         DETECT_CHECKER_UNDEF = YNU_UNDEF,
159         DETECT_CHECKER_OFF = YNU_NO,
160         DETECT_CHECKER_ON = YNU_YES,
161 };
162
163 enum deferred_remove_states {
164         DEFERRED_REMOVE_UNDEF = YNU_UNDEF,
165         DEFERRED_REMOVE_OFF = YNU_NO,
166         DEFERRED_REMOVE_ON = YNU_YES,
167         DEFERRED_REMOVE_IN_PROGRESS,
168 };
169
170 enum skip_kpartx_states {
171         SKIP_KPARTX_UNDEF = YNU_UNDEF,
172         SKIP_KPARTX_OFF = YNU_NO,
173         SKIP_KPARTX_ON = YNU_YES,
174 };
175
176 enum max_sectors_kb_states {
177         MAX_SECTORS_KB_UNDEF = 0,
178         MAX_SECTORS_KB_MIN = 4,  /* can't be smaller than page size */
179 };
180
181 enum scsi_protocol {
182         SCSI_PROTOCOL_FCP = 0,  /* Fibre Channel */
183         SCSI_PROTOCOL_SPI = 1,  /* parallel SCSI */
184         SCSI_PROTOCOL_SSA = 2,  /* Serial Storage Architecture - Obsolete */
185         SCSI_PROTOCOL_SBP = 3,  /* firewire */
186         SCSI_PROTOCOL_SRP = 4,  /* Infiniband RDMA */
187         SCSI_PROTOCOL_ISCSI = 5,
188         SCSI_PROTOCOL_SAS = 6,
189         SCSI_PROTOCOL_ADT = 7,  /* Media Changers */
190         SCSI_PROTOCOL_ATA = 8,
191         SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */
192 };
193
194 enum no_undef_states {
195         NU_NO = -1,
196         NU_UNDEF = 0,
197 };
198
199 enum ghost_delay_states {
200         GHOST_DELAY_OFF = NU_NO,
201         GHOST_DELAY_UNDEF = NU_UNDEF,
202 };
203
204 enum initialized_states {
205         INIT_NEW,
206         INIT_FAILED,
207         INIT_MISSING_UDEV,
208         INIT_REQUESTED_UDEV,
209         INIT_OK,
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 struct sg_id {
225         int host_no;
226         int channel;
227         int scsi_id;
228         int lun;
229         short h_cmd_per_lun;
230         short d_queue_depth;
231         enum scsi_protocol proto_id;
232         int transport_id;
233 };
234
235 # ifndef HDIO_GETGEO
236 #  define HDIO_GETGEO   0x0301  /* get device geometry */
237
238 struct hd_geometry {
239         unsigned char heads;
240         unsigned char sectors;
241         unsigned short cylinders;
242         unsigned long start;
243 };
244 #endif
245
246 struct path {
247         char dev[FILE_NAME_SIZE];
248         char dev_t[BLK_DEV_SIZE];
249         struct udev_device *udev;
250         struct sg_id sg_id;
251         struct hd_geometry geom;
252         char wwid[WWID_SIZE];
253         char vendor_id[SCSI_VENDOR_SIZE];
254         char product_id[PATH_PRODUCT_SIZE];
255         char rev[PATH_REV_SIZE];
256         char serial[SERIAL_SIZE];
257         char tgt_node_name[NODE_NAME_SIZE];
258         unsigned long long size;
259         unsigned int checkint;
260         unsigned int tick;
261         int bus;
262         int offline;
263         int state;
264         int dmstate;
265         int chkrstate;
266         int failcount;
267         int priority;
268         int pgindex;
269         int detect_prio;
270         int detect_checker;
271         int watch_checks;
272         int wait_checks;
273         int tpgs;
274         char * uid_attribute;
275         char * getuid;
276         struct prio prio;
277         char * prio_args;
278         struct checker checker;
279         struct multipath * mpp;
280         int fd;
281         int initialized;
282         int retriggers;
283         unsigned int path_failures;
284         time_t dis_reinstate_time;
285         int disable_reinstate;
286         int san_path_err_forget_rate;
287         time_t io_err_dis_reinstate_time;
288         int io_err_disable_reinstate;
289         int io_err_pathfail_cnt;
290         int io_err_pathfail_starttime;
291         int find_multipaths_timeout;
292         int marginal;
293         /* configlet pointers */
294         vector hwe;
295         struct gen_path generic_path;
296 };
297
298 typedef int (pgpolicyfn) (struct multipath *);
299
300 struct multipath {
301         char wwid[WWID_SIZE];
302         char alias_old[WWID_SIZE];
303         int pgpolicy;
304         pgpolicyfn *pgpolicyfn;
305         int nextpg;
306         int bestpg;
307         int queuedio;
308         int action;
309         int wait_for_udev;
310         int uev_wait_tick;
311         int pgfailback;
312         int failback_tick;
313         int rr_weight;
314         int nr_active;     /* current available(= not known as failed) paths */
315         int no_path_retry; /* number of retries after all paths are down */
316         int retry_tick;    /* remaining times for retries */
317         int disable_queueing;
318         int minio;
319         int flush_on_last_del;
320         int attribute_flags;
321         int fast_io_fail;
322         int retain_hwhandler;
323         int deferred_remove;
324         int delay_watch_checks;
325         int delay_wait_checks;
326         int san_path_err_threshold;
327         int san_path_err_forget_rate;
328         int san_path_err_recovery_time;
329         int marginal_path_err_sample_time;
330         int marginal_path_err_rate_threshold;
331         int marginal_path_err_recheck_gap_time;
332         int marginal_path_double_failed_time;
333         int skip_kpartx;
334         int max_sectors_kb;
335         int force_readonly;
336         int force_udev_reload;
337         int needs_paths_uevent;
338         int ghost_delay;
339         int ghost_delay_tick;
340         unsigned int dev_loss;
341         uid_t uid;
342         gid_t gid;
343         mode_t mode;
344         unsigned long long size;
345         vector paths;
346         vector pg;
347         struct dm_info * dmi;
348
349         /* configlet pointers */
350         char * alias;
351         char * alias_prefix;
352         char * selector;
353         char * features;
354         char * hwhandler;
355         struct mpentry * mpe;
356         vector hwe;
357
358         /* threads */
359         pthread_t waiter;
360
361         /* stats */
362         unsigned int stat_switchgroup;
363         unsigned int stat_path_failures;
364         unsigned int stat_map_loads;
365         unsigned int stat_total_queueing_time;
366         unsigned int stat_queueing_timeouts;
367         unsigned int stat_map_failures;
368
369         /* checkers shared data */
370         void * mpcontext;
371
372         /* persistent management data*/
373         int prkey_source;
374         struct be64 reservation_key;
375         uint8_t sa_flags;
376         unsigned char prflag;
377         int all_tg_pt;
378         struct gen_multipath generic_mp;
379 };
380
381 static inline int marginal_path_check_enabled(const struct multipath *mpp)
382 {
383         return mpp->marginal_path_double_failed_time > 0 &&
384                 mpp->marginal_path_err_sample_time > 0 &&
385                 mpp->marginal_path_err_recheck_gap_time > 0 &&
386                 mpp->marginal_path_err_rate_threshold >= 0;
387 }
388
389 static inline int san_path_check_enabled(const struct multipath *mpp)
390 {
391         return mpp->san_path_err_threshold > 0 &&
392                 mpp->san_path_err_forget_rate > 0 &&
393                 mpp->san_path_err_recovery_time > 0;
394 }
395
396 static inline int delay_check_enabled(const struct multipath *mpp)
397 {
398         return mpp->delay_watch_checks != NU_NO ||
399                 mpp->delay_wait_checks != NU_NO;
400 }
401
402 struct pathgroup {
403         long id;
404         int status;
405         int priority;
406         int enabled_paths;
407         int marginal;
408         vector paths;
409         struct multipath *mpp;
410         struct gen_pathgroup generic_pg;
411 };
412
413 struct adapter_group {
414         char adapter_name[SLOT_NAME_SIZE];
415         struct pathgroup *pgp;
416         int num_hosts;
417         vector host_groups;
418         int next_host_index;
419 };
420
421 struct host_group {
422         int host_no;
423         int num_paths;
424         vector paths;
425 };
426
427 struct path * alloc_path (void);
428 struct pathgroup * alloc_pathgroup (void);
429 struct multipath * alloc_multipath (void);
430 void free_path (struct path *);
431 void free_pathvec (vector vec, enum free_path_mode free_paths);
432 void free_pathgroup (struct pathgroup * pgp, enum free_path_mode free_paths);
433 void free_pgvec (vector pgvec, enum free_path_mode free_paths);
434 void free_multipath (struct multipath *, enum free_path_mode free_paths);
435 void free_multipath_attributes (struct multipath *);
436 void drop_multipath (vector mpvec, char * wwid, enum free_path_mode free_paths);
437 void free_multipathvec (vector mpvec, enum free_path_mode free_paths);
438
439 struct adapter_group * alloc_adaptergroup(void);
440 struct host_group * alloc_hostgroup(void);
441 void free_adaptergroup(vector adapters);
442 void free_hostgroup(vector hostgroups);
443
444 int store_adaptergroup(vector adapters, struct adapter_group *agp);
445 int store_hostgroup(vector hostgroupvec, struct host_group *hgp);
446
447 int store_path (vector pathvec, struct path * pp);
448 int add_pathgroup(struct multipath*, struct pathgroup *);
449
450 struct multipath * find_mp_by_alias (const struct _vector *mp, const char *alias);
451 struct multipath * find_mp_by_wwid (const struct _vector *mp, const char *wwid);
452 struct multipath * find_mp_by_str (const struct _vector *mp, const char *wwid);
453 struct multipath * find_mp_by_minor (const struct _vector *mp, int minor);
454
455 struct path * find_path_by_devt (const struct _vector *pathvec, const char *devt);
456 struct path * find_path_by_dev (const struct _vector *pathvec, const char *dev);
457 struct path * first_path (const struct multipath *mpp);
458
459 int pathcountgr (const struct pathgroup *, int);
460 int pathcount (const struct multipath *, int);
461 int pathcmp (const struct pathgroup *, const struct pathgroup *);
462 int add_feature (char **, const char *);
463 int remove_feature (char **, const char *);
464
465 extern char sysfs_path[PATH_SIZE];
466
467 #endif /* _STRUCTS_H */