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
22 #define HOST_NAME_LEN 16
23 #define SLOT_NAME_SIZE 40
25 #define VPD_DATA_SIZE 128
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
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
37 #define NO_PATH_RETRY_UNDEF 0
38 #define NO_PATH_RETRY_FAIL -1
39 #define NO_PATH_RETRY_QUEUE -2
60 /* SYSFS_BUS_SCSI should be last, see bus_protocol_id() */
87 enum queue_without_daemon_states {
88 QUE_NO_DAEMON_OFF = YN_NO,
89 QUE_NO_DAEMON_ON = YN_YES,
99 enum yes_no_undef_states {
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,
115 enum marginal_pathgroups_mode {
116 MARGINAL_PATHGROUP_OFF = YN_NO,
117 MARGINAL_PATHGROUP_ON = YN_YES,
118 MARGINAL_PATHGROUP_FPIN,
122 FLUSH_UNDEF = YNU_UNDEF,
123 FLUSH_DISABLED = YNU_NO,
124 FLUSH_ENABLED = YNU_YES,
127 enum log_checker_err_states {
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,
138 enum retain_hwhandler_states {
139 RETAIN_HWHANDLER_UNDEF = YNU_UNDEF,
140 RETAIN_HWHANDLER_OFF = YNU_NO,
141 RETAIN_HWHANDLER_ON = YNU_YES,
144 enum detect_prio_states {
145 DETECT_PRIO_UNDEF = YNU_UNDEF,
146 DETECT_PRIO_OFF = YNU_NO,
147 DETECT_PRIO_ON = YNU_YES,
150 enum detect_checker_states {
151 DETECT_CHECKER_UNDEF = YNU_UNDEF,
152 DETECT_CHECKER_OFF = YNU_NO,
153 DETECT_CHECKER_ON = YNU_YES,
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,
163 enum skip_kpartx_states {
164 SKIP_KPARTX_UNDEF = YNU_UNDEF,
165 SKIP_KPARTX_OFF = YNU_NO,
166 SKIP_KPARTX_ON = YNU_YES,
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 */
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 */
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.
193 #define LAST_BUS_PROTOCOL_ID (SYSFS_BUS_SCSI + SCSI_PROTOCOL_UNSPEC)
194 unsigned int bus_protocol_id(const struct path *pp);
196 #define SCSI_INVALID_LUN ~0ULL
198 enum no_undef_states {
203 enum ghost_delay_states {
204 GHOST_DELAY_OFF = NU_NO,
205 GHOST_DELAY_UNDEF = NU_UNDEF,
208 enum initialized_states {
215 * INIT_REMOVED: supposed to be removed from pathvec, but still
216 * mapped by some multipath map because of map reload failure.
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.
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,
240 enum vpd_vendor_ids {
243 VPD_VP_ARRAY_SIZE, /* This must remain the last entry */
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
251 enum undefined_off_zero {
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,
263 enum eh_deadline_states {
264 EH_DEADLINE_UNSET = UOZ_UNDEF,
265 EH_DEADLINE_OFF = UOZ_OFF,
266 EH_DEADLINE_ZERO = UOZ_ZERO,
269 enum recheck_wwid_states {
270 RECHECK_WWID_UNDEF = YNU_UNDEF,
271 RECHECK_WWID_OFF = YNU_NO,
272 RECHECK_WWID_ON = YNU_YES,
275 struct vpd_vendor_page {
279 extern struct vpd_vendor_page vpd_vendor_pages[VPD_VP_ARRAY_SIZE];
288 enum scsi_protocol proto_id;
293 # define HDIO_GETGEO 0x0301 /* get device geometry */
297 unsigned char sectors;
298 unsigned short cylinders;
304 char dev[FILE_NAME_SIZE];
305 char dev_t[BLK_DEV_SIZE];
306 struct udev_device *udev;
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];
316 unsigned long long size;
317 unsigned int checkint;
330 char * uid_attribute;
333 struct checker checker;
334 struct multipath * mpp;
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;
351 /* configlet pointers */
353 struct gen_path generic_path;
356 typedef int (pgpolicyfn) (struct multipath *, vector);
359 char wwid[WWID_SIZE];
360 char alias_old[WWID_SIZE];
362 pgpolicyfn *pgpolicyfn;
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;
376 int flush_on_last_del;
379 int retain_hwhandler;
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;
393 int force_udev_reload;
394 int needs_paths_uevent;
396 int ghost_delay_tick;
397 unsigned int dev_loss;
402 unsigned long long size;
407 /* configlet pointers */
413 struct mpentry * mpe;
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;
427 /* checkers shared data */
430 /* persistent management data*/
432 struct be64 reservation_key;
434 unsigned char prflag;
436 struct gen_multipath generic_mp;
437 bool fpin_must_reload;
440 static inline int marginal_path_check_enabled(const struct multipath *mpp)
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;
448 static inline int san_path_check_enabled(const struct multipath *mpp)
450 return mpp->san_path_err_threshold > 0 &&
451 mpp->san_path_err_forget_rate > 0 &&
452 mpp->san_path_err_recovery_time > 0;
462 struct multipath *mpp;
463 struct gen_pathgroup generic_pg;
466 struct adapter_group {
467 char adapter_name[SLOT_NAME_SIZE];
468 struct pathgroup *pgp;
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);
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);
499 int store_adaptergroup(vector adapters, struct adapter_group *agp);
500 int store_hostgroup(vector hostgroupvec, struct host_group *hgp);
502 int store_path (vector pathvec, struct path * pp);
503 int add_pathgroup(struct multipath*, struct pathgroup *);
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,
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);
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 *);
522 extern char sysfs_path[PATH_SIZE];
524 #endif /* _STRUCTS_H */