#ifndef _STRUCTS_H #define _STRUCTS_H #include #include #include #include "prio.h" #include "byteorder.h" #include "generic.h" #define WWID_SIZE 128 #define SERIAL_SIZE 128 #define NODE_NAME_SIZE 224 #define PATH_STR_SIZE 16 #define PARAMS_SIZE 4096 #define FILE_NAME_SIZE 256 #define CALLOUT_MAX_SIZE 256 #define BLK_DEV_SIZE 33 #define PATH_SIZE 512 #define NAME_SIZE 512 #define HOST_NAME_LEN 16 #define SLOT_NAME_SIZE 40 #define PRKEY_SIZE 19 #define VPD_DATA_SIZE 128 #define SCSI_VENDOR_SIZE 9 #define SCSI_PRODUCT_SIZE 17 #define SCSI_STATE_SIZE 19 #define NVME_MODEL_SIZE 41 #define NVME_REV_SIZE 9 /* This must be the maximum of SCSI and NVME sizes */ #define PATH_PRODUCT_SIZE NVME_MODEL_SIZE #define PATH_REV_SIZE NVME_REV_SIZE #define NO_PATH_RETRY_UNDEF 0 #define NO_PATH_RETRY_FAIL -1 #define NO_PATH_RETRY_QUEUE -2 enum free_path_mode { KEEP_PATHS, FREE_PATHS }; enum rr_weight_mode { RR_WEIGHT_UNDEF, RR_WEIGHT_NONE, RR_WEIGHT_PRIO }; enum failback_mode { FAILBACK_UNDEF, FAILBACK_MANUAL, FAILBACK_IMMEDIATE, FAILBACK_FOLLOWOVER }; enum sysfs_buses { SYSFS_BUS_UNDEF, SYSFS_BUS_SCSI, SYSFS_BUS_CCW, SYSFS_BUS_CCISS, SYSFS_BUS_NVME, }; enum pathstates { PSTATE_UNDEF, PSTATE_FAILED, PSTATE_ACTIVE }; enum pgstates { PGSTATE_UNDEF, PGSTATE_ENABLED, PGSTATE_DISABLED, PGSTATE_ACTIVE }; enum yes_no_states { YN_NO, YN_YES, }; enum queue_without_daemon_states { QUE_NO_DAEMON_OFF = YN_NO, QUE_NO_DAEMON_ON = YN_YES, QUE_NO_DAEMON_FORCE, }; enum attribute_bits { ATTR_UID, ATTR_GID, ATTR_MODE, }; enum yes_no_undef_states { YNU_UNDEF, YNU_NO, YNU_YES, }; #define _FIND_MULTIPATHS_F (1 << 1) #define _FIND_MULTIPATHS_I (1 << 2) #define _FIND_MULTIPATHS_N (1 << 3) /* * _FIND_MULTIPATHS_F must have the same value as YNU_YES. * Generate a compile time error if that isn't the case. */ extern char ___error1___[-(_FIND_MULTIPATHS_F != YNU_YES)]; #define find_multipaths_on(conf) \ (!!((conf)->find_multipaths & _FIND_MULTIPATHS_F)) #define ignore_wwids_on(conf) \ (!!((conf)->find_multipaths & _FIND_MULTIPATHS_I)) #define ignore_new_devs_on(conf) \ (!!((conf)->find_multipaths & _FIND_MULTIPATHS_N)) enum find_multipaths_states { FIND_MULTIPATHS_UNDEF = YNU_UNDEF, FIND_MULTIPATHS_OFF = YNU_NO, FIND_MULTIPATHS_ON = _FIND_MULTIPATHS_F, FIND_MULTIPATHS_GREEDY = _FIND_MULTIPATHS_I, FIND_MULTIPATHS_SMART = _FIND_MULTIPATHS_F|_FIND_MULTIPATHS_I, FIND_MULTIPATHS_STRICT = _FIND_MULTIPATHS_F|_FIND_MULTIPATHS_N, __FIND_MULTIPATHS_LAST, }; enum flush_states { FLUSH_UNDEF = YNU_UNDEF, FLUSH_DISABLED = YNU_NO, FLUSH_ENABLED = YNU_YES, }; enum log_checker_err_states { LOG_CHKR_ERR_ALWAYS, LOG_CHKR_ERR_ONCE, }; enum user_friendly_names_states { USER_FRIENDLY_NAMES_UNDEF = YNU_UNDEF, USER_FRIENDLY_NAMES_OFF = YNU_NO, USER_FRIENDLY_NAMES_ON = YNU_YES, }; enum retain_hwhandler_states { RETAIN_HWHANDLER_UNDEF = YNU_UNDEF, RETAIN_HWHANDLER_OFF = YNU_NO, RETAIN_HWHANDLER_ON = YNU_YES, }; enum detect_prio_states { DETECT_PRIO_UNDEF = YNU_UNDEF, DETECT_PRIO_OFF = YNU_NO, DETECT_PRIO_ON = YNU_YES, }; enum detect_checker_states { DETECT_CHECKER_UNDEF = YNU_UNDEF, DETECT_CHECKER_OFF = YNU_NO, DETECT_CHECKER_ON = YNU_YES, }; enum deferred_remove_states { DEFERRED_REMOVE_UNDEF = YNU_UNDEF, DEFERRED_REMOVE_OFF = YNU_NO, DEFERRED_REMOVE_ON = YNU_YES, DEFERRED_REMOVE_IN_PROGRESS, }; enum skip_kpartx_states { SKIP_KPARTX_UNDEF = YNU_UNDEF, SKIP_KPARTX_OFF = YNU_NO, SKIP_KPARTX_ON = YNU_YES, }; enum max_sectors_kb_states { MAX_SECTORS_KB_UNDEF = 0, MAX_SECTORS_KB_MIN = 4, /* can't be smaller than page size */ }; enum scsi_protocol { SCSI_PROTOCOL_FCP = 0, /* Fibre Channel */ SCSI_PROTOCOL_SPI = 1, /* parallel SCSI */ SCSI_PROTOCOL_SSA = 2, /* Serial Storage Architecture - Obsolete */ SCSI_PROTOCOL_SBP = 3, /* firewire */ SCSI_PROTOCOL_SRP = 4, /* Infiniband RDMA */ SCSI_PROTOCOL_ISCSI = 5, SCSI_PROTOCOL_SAS = 6, SCSI_PROTOCOL_ADT = 7, /* Media Changers */ SCSI_PROTOCOL_ATA = 8, SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */ }; enum no_undef_states { NU_NO = -1, NU_UNDEF = 0, }; enum ghost_delay_states { GHOST_DELAY_OFF = NU_NO, GHOST_DELAY_UNDEF = NU_UNDEF, }; enum initialized_states { INIT_NEW, INIT_FAILED, INIT_MISSING_UDEV, INIT_REQUESTED_UDEV, INIT_OK, }; enum prkey_sources { PRKEY_SOURCE_NONE, PRKEY_SOURCE_CONF, PRKEY_SOURCE_FILE, }; enum all_tg_pt_states { ALL_TG_PT_UNDEF = YNU_UNDEF, ALL_TG_PT_OFF = YNU_NO, ALL_TG_PT_ON = YNU_YES, }; enum vpd_vendor_ids { VPD_VP_UNDEF, VPD_VP_HP3PAR, VPD_VP_ARRAY_SIZE, /* This must remain the last entry */ }; struct vpd_vendor_page { int pg; const char *name; }; extern struct vpd_vendor_page vpd_vendor_pages[VPD_VP_ARRAY_SIZE]; struct sg_id { int host_no; int channel; int scsi_id; int lun; short h_cmd_per_lun; short d_queue_depth; enum scsi_protocol proto_id; int transport_id; }; # ifndef HDIO_GETGEO # define HDIO_GETGEO 0x0301 /* get device geometry */ struct hd_geometry { unsigned char heads; unsigned char sectors; unsigned short cylinders; unsigned long start; }; #endif struct path { char dev[FILE_NAME_SIZE]; char dev_t[BLK_DEV_SIZE]; struct udev_device *udev; struct sg_id sg_id; struct hd_geometry geom; char wwid[WWID_SIZE]; char vendor_id[SCSI_VENDOR_SIZE]; char product_id[PATH_PRODUCT_SIZE]; char rev[PATH_REV_SIZE]; char serial[SERIAL_SIZE]; char tgt_node_name[NODE_NAME_SIZE]; char *vpd_data; unsigned long long size; unsigned int checkint; unsigned int tick; int bus; int offline; int state; int dmstate; int chkrstate; int failcount; int priority; int pgindex; int detect_prio; int detect_checker; int tpgs; char * uid_attribute; char * getuid; struct prio prio; struct checker checker; struct multipath * mpp; int fd; int initialized; int retriggers; unsigned int path_failures; time_t dis_reinstate_time; int disable_reinstate; int san_path_err_forget_rate; time_t io_err_dis_reinstate_time; int io_err_disable_reinstate; int io_err_pathfail_cnt; int io_err_pathfail_starttime; int find_multipaths_timeout; int marginal; int vpd_vendor_id; /* configlet pointers */ vector hwe; struct gen_path generic_path; }; typedef int (pgpolicyfn) (struct multipath *, vector); struct multipath { char wwid[WWID_SIZE]; char alias_old[WWID_SIZE]; int pgpolicy; pgpolicyfn *pgpolicyfn; int nextpg; int bestpg; int queuedio; int action; int wait_for_udev; int uev_wait_tick; int pgfailback; int failback_tick; int rr_weight; int no_path_retry; /* number of retries after all paths are down */ int retry_tick; /* remaining times for retries */ int disable_queueing; int minio; int flush_on_last_del; int attribute_flags; int fast_io_fail; int retain_hwhandler; int deferred_remove; bool in_recovery; int san_path_err_threshold; int san_path_err_forget_rate; int san_path_err_recovery_time; int marginal_path_err_sample_time; int marginal_path_err_rate_threshold; int marginal_path_err_recheck_gap_time; int marginal_path_double_failed_time; int skip_kpartx; int max_sectors_kb; int force_readonly; int force_udev_reload; int needs_paths_uevent; int ghost_delay; int ghost_delay_tick; unsigned int dev_loss; uid_t uid; gid_t gid; mode_t mode; unsigned long long size; vector paths; vector pg; struct dm_info * dmi; /* configlet pointers */ char * alias; char * alias_prefix; char * selector; char * features; char * hwhandler; struct mpentry * mpe; vector hwe; /* threads */ pthread_t waiter; /* stats */ unsigned int stat_switchgroup; unsigned int stat_path_failures; unsigned int stat_map_loads; unsigned int stat_total_queueing_time; unsigned int stat_queueing_timeouts; unsigned int stat_map_failures; /* checkers shared data */ void * mpcontext; /* persistent management data*/ int prkey_source; struct be64 reservation_key; uint8_t sa_flags; unsigned char prflag; int all_tg_pt; struct gen_multipath generic_mp; }; static inline int marginal_path_check_enabled(const struct multipath *mpp) { return mpp->marginal_path_double_failed_time > 0 && mpp->marginal_path_err_sample_time > 0 && mpp->marginal_path_err_recheck_gap_time > 0 && mpp->marginal_path_err_rate_threshold >= 0; } static inline int san_path_check_enabled(const struct multipath *mpp) { return mpp->san_path_err_threshold > 0 && mpp->san_path_err_forget_rate > 0 && mpp->san_path_err_recovery_time > 0; } struct pathgroup { long id; int status; int priority; int enabled_paths; int marginal; vector paths; struct multipath *mpp; struct gen_pathgroup generic_pg; }; struct adapter_group { char adapter_name[SLOT_NAME_SIZE]; struct pathgroup *pgp; int num_hosts; vector host_groups; int next_host_index; }; struct host_group { int host_no; int num_paths; vector paths; }; struct path * alloc_path (void); struct pathgroup * alloc_pathgroup (void); struct multipath * alloc_multipath (void); void free_path (struct path *); void free_pathvec (vector vec, enum free_path_mode free_paths); void free_pathgroup (struct pathgroup * pgp, enum free_path_mode free_paths); void free_pgvec (vector pgvec, enum free_path_mode free_paths); void free_multipath (struct multipath *, enum free_path_mode free_paths); void free_multipath_attributes (struct multipath *); void drop_multipath (vector mpvec, char * wwid, enum free_path_mode free_paths); void free_multipathvec (vector mpvec, enum free_path_mode free_paths); struct adapter_group * alloc_adaptergroup(void); struct host_group * alloc_hostgroup(void); void free_adaptergroup(vector adapters); void free_hostgroup(vector hostgroups); int store_adaptergroup(vector adapters, struct adapter_group *agp); int store_hostgroup(vector hostgroupvec, struct host_group *hgp); int store_path (vector pathvec, struct path * pp); int add_pathgroup(struct multipath*, struct pathgroup *); struct multipath * find_mp_by_alias (const struct _vector *mp, const char *alias); struct multipath * find_mp_by_wwid (const struct _vector *mp, const char *wwid); struct multipath * find_mp_by_str (const struct _vector *mp, const char *wwid); struct multipath * find_mp_by_minor (const struct _vector *mp, unsigned int minor); struct path * find_path_by_devt (const struct _vector *pathvec, const char *devt); struct path * find_path_by_dev (const struct _vector *pathvec, const char *dev); struct path * first_path (const struct multipath *mpp); int pathcountgr (const struct pathgroup *, int); int pathcount (const struct multipath *, int); int count_active_paths(const struct multipath *); int count_active_pending_paths(const struct multipath *); int pathcmp (const struct pathgroup *, const struct pathgroup *); int add_feature (char **, const char *); int remove_feature (char **, const char *); extern char sysfs_path[PATH_SIZE]; #endif /* _STRUCTS_H */