7 #include <libdevmapper.h>
10 #include "byteorder.h"
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
21 #define HOST_NAME_LEN 16
22 #define SLOT_NAME_SIZE 40
24 #define VPD_DATA_SIZE 128
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
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
36 #define NO_PATH_RETRY_UNDEF 0
37 #define NO_PATH_RETRY_FAIL -1
38 #define NO_PATH_RETRY_QUEUE -2
77 enum queue_without_daemon_states {
78 QUE_NO_DAEMON_OFF = YN_NO,
79 QUE_NO_DAEMON_ON = YN_YES,
89 enum yes_no_undef_states {
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,
105 enum marginal_pathgroups_mode {
106 MARGINAL_PATHGROUP_OFF = YN_NO,
107 MARGINAL_PATHGROUP_ON = YN_YES,
108 MARGINAL_PATHGROUP_FPIN,
112 FLUSH_UNDEF = YNU_UNDEF,
113 FLUSH_DISABLED = YNU_NO,
114 FLUSH_ENABLED = YNU_YES,
117 enum log_checker_err_states {
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,
128 enum retain_hwhandler_states {
129 RETAIN_HWHANDLER_UNDEF = YNU_UNDEF,
130 RETAIN_HWHANDLER_OFF = YNU_NO,
131 RETAIN_HWHANDLER_ON = YNU_YES,
134 enum detect_prio_states {
135 DETECT_PRIO_UNDEF = YNU_UNDEF,
136 DETECT_PRIO_OFF = YNU_NO,
137 DETECT_PRIO_ON = YNU_YES,
140 enum detect_checker_states {
141 DETECT_CHECKER_UNDEF = YNU_UNDEF,
142 DETECT_CHECKER_OFF = YNU_NO,
143 DETECT_CHECKER_ON = YNU_YES,
146 enum detect_pgpolicy_states {
147 DETECT_PGPOLICY_UNDEF = YNU_UNDEF,
148 DETECT_PGPOLICY_OFF = YNU_NO,
149 DETECT_PGPOLICY_ON = YNU_YES,
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,
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,
165 enum skip_kpartx_states {
166 SKIP_KPARTX_UNDEF = YNU_UNDEF,
167 SKIP_KPARTX_OFF = YNU_NO,
168 SKIP_KPARTX_ON = YNU_YES,
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 */
176 enum queue_mode_states {
177 QUEUE_MODE_UNDEF = 0,
182 enum auto_resize_state {
183 AUTO_RESIZE_UNDEF = 0,
185 AUTO_RESIZE_GROW_ONLY,
186 AUTO_RESIZE_GROW_SHRINK,
189 #define PROTOCOL_UNSET -1
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 */
206 /* values from /sys/class/nvme/nvmeX */
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 */
222 SYSFS_BUS_NVME = SYSFS_BUS_SCSI + SCSI_PROTOCOL_END,
226 * Linear ordering of bus/protocol
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[];
232 #define SCSI_INVALID_LUN ~0ULL
234 enum no_undef_states {
239 enum ghost_delay_states {
240 GHOST_DELAY_OFF = NU_NO,
241 GHOST_DELAY_UNDEF = NU_UNDEF,
244 enum initialized_states {
251 * INIT_REMOVED: supposed to be removed from pathvec, but still
252 * mapped by some multipath map because of map reload failure.
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.
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,
276 enum vpd_vendor_ids {
279 VPD_VP_ARRAY_SIZE, /* This must remain the last entry */
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
287 enum undefined_off_zero {
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,
299 enum eh_deadline_states {
300 EH_DEADLINE_UNSET = UOZ_UNDEF,
301 EH_DEADLINE_OFF = UOZ_OFF,
302 EH_DEADLINE_ZERO = UOZ_ZERO,
305 enum max_retries_states {
306 MAX_RETRIES_UNSET = UOZ_UNDEF,
307 MAX_RETRIES_OFF = UOZ_OFF,
308 MAX_RETRIES_ZERO = UOZ_ZERO,
311 enum recheck_wwid_states {
312 RECHECK_WWID_UNDEF = YNU_UNDEF,
313 RECHECK_WWID_OFF = YNU_NO,
314 RECHECK_WWID_ON = YNU_YES,
317 struct vpd_vendor_page {
321 extern struct vpd_vendor_page vpd_vendor_pages[VPD_VP_ARRAY_SIZE];
335 # define HDIO_GETGEO 0x0301 /* get device geometry */
339 unsigned char sectors;
340 unsigned short cylinders;
345 #define GROUP_ID_UNDEF -1
348 char dev[FILE_NAME_SIZE];
349 char dev_t[BLK_DEV_SIZE];
350 struct udev_device *udev;
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];
360 unsigned long long size;
361 unsigned int checkint;
374 const char *uid_attribute;
376 struct checker checker;
377 struct multipath * mpp;
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;
395 unsigned int dev_loss;
398 bool can_use_env_uid;
399 unsigned int checker_timeout;
400 /* configlet pointers */
402 struct gen_path generic_path;
406 typedef int (pgpolicyfn) (struct multipath *, vector);
416 char wwid[WWID_SIZE];
417 char alias_old[WWID_SIZE];
419 int detect_pgpolicy_use_tpg;
421 pgpolicyfn *pgpolicyfn;
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;
435 int flush_on_last_del;
437 int retain_hwhandler;
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;
451 int force_udev_reload;
452 int needs_paths_uevent;
454 int ghost_delay_tick;
459 unsigned long long size;
464 /* configlet pointers */
470 struct mpentry * mpe;
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;
484 /* checkers shared data */
487 /* persistent management data*/
489 struct be64 reservation_key;
493 struct gen_multipath generic_mp;
494 bool fpin_must_reload;
497 static inline int marginal_path_check_enabled(const struct multipath *mpp)
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;
505 static inline int san_path_check_enabled(const struct multipath *mpp)
507 return mpp->san_path_err_threshold > 0 &&
508 mpp->san_path_err_forget_rate > 0 &&
509 mpp->san_path_err_recovery_time > 0;
519 struct multipath *mpp;
520 struct gen_pathgroup generic_pg;
523 struct adapter_group {
524 char adapter_name[SLOT_NAME_SIZE];
525 struct pathgroup *pgp;
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);
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);
556 int store_adaptergroup(vector adapters, struct adapter_group *agp);
557 int store_hostgroup(vector hostgroupvec, struct host_group *hgp);
559 int store_path (vector pathvec, struct path * pp);
560 int add_pathgroup(struct multipath*, struct pathgroup *);
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,
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);
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 *);
579 #endif /* _STRUCTS_H */