3a716d883b487949923e3e8629326fe7b69e4dfc
[multipath-tools/.git] / libmultipath / structs.h
1 #ifndef _STRUCTS_H
2 #define _STRUCTS_H
3
4 #include <sys/types.h>
5
6 #include "prio.h"
7
8 #define WWID_SIZE               128
9 #define SERIAL_SIZE             65
10 #define NODE_NAME_SIZE          224
11 #define PATH_STR_SIZE           16
12 #define PARAMS_SIZE             4096
13 #define FILE_NAME_SIZE          256
14 #define CALLOUT_MAX_SIZE        256
15 #define BLK_DEV_SIZE            33
16 #define PATH_SIZE               512
17 #define NAME_SIZE               512
18 #define HOST_NAME_LEN           16
19 #define SLOT_NAME_SIZE          40
20
21 #define SCSI_VENDOR_SIZE        9
22 #define SCSI_PRODUCT_SIZE       17
23 #define SCSI_REV_SIZE           5
24 #define SCSI_STATE_SIZE         19
25
26 #define NO_PATH_RETRY_UNDEF     0
27 #define NO_PATH_RETRY_FAIL      -1
28 #define NO_PATH_RETRY_QUEUE     -2
29
30
31 enum free_path_mode {
32         KEEP_PATHS,
33         FREE_PATHS
34 };
35
36 enum rr_weight_mode {
37         RR_WEIGHT_UNDEF,
38         RR_WEIGHT_NONE,
39         RR_WEIGHT_PRIO
40 };
41
42 enum failback_mode {
43         FAILBACK_UNDEF,
44         FAILBACK_MANUAL,
45         FAILBACK_IMMEDIATE,
46         FAILBACK_FOLLOWOVER
47 };
48
49 enum sysfs_buses {
50         SYSFS_BUS_UNDEF,
51         SYSFS_BUS_SCSI,
52         SYSFS_BUS_IDE,
53         SYSFS_BUS_CCW,
54         SYSFS_BUS_CCISS,
55         SYSFS_BUS_RBD,
56 };
57
58 enum pathstates {
59         PSTATE_UNDEF,
60         PSTATE_FAILED,
61         PSTATE_ACTIVE
62 };
63
64 enum pgstates {
65         PGSTATE_UNDEF,
66         PGSTATE_ENABLED,
67         PGSTATE_DISABLED,
68         PGSTATE_ACTIVE
69 };
70
71 enum yes_no_states {
72         YN_NO,
73         YN_YES,
74 };
75
76 enum queue_without_daemon_states {
77         QUE_NO_DAEMON_OFF = YN_NO,
78         QUE_NO_DAEMON_ON = YN_YES,
79         QUE_NO_DAEMON_FORCE,
80 };
81
82 enum attribute_bits {
83         ATTR_UID,
84         ATTR_GID,
85         ATTR_MODE,
86 };
87
88 enum yes_no_undef_states {
89         YNU_UNDEF,
90         YNU_NO,
91         YNU_YES,
92 };
93
94 enum flush_states {
95         FLUSH_UNDEF = YNU_UNDEF,
96         FLUSH_DISABLED = YNU_NO,
97         FLUSH_ENABLED = YNU_YES,
98         FLUSH_IN_PROGRESS,
99 };
100
101 enum log_checker_err_states {
102         LOG_CHKR_ERR_ALWAYS,
103         LOG_CHKR_ERR_ONCE,
104 };
105
106 enum user_friendly_names_states {
107         USER_FRIENDLY_NAMES_UNDEF = YNU_UNDEF,
108         USER_FRIENDLY_NAMES_OFF = YNU_NO,
109         USER_FRIENDLY_NAMES_ON = YNU_YES,
110 };
111
112 enum retain_hwhandler_states {
113         RETAIN_HWHANDLER_UNDEF = YNU_UNDEF,
114         RETAIN_HWHANDLER_OFF = YNU_NO,
115         RETAIN_HWHANDLER_ON = YNU_YES,
116 };
117
118 enum detect_prio_states {
119         DETECT_PRIO_UNDEF = YNU_UNDEF,
120         DETECT_PRIO_OFF = YNU_NO,
121         DETECT_PRIO_ON = YNU_YES,
122 };
123
124 enum deferred_remove_states {
125         DEFERRED_REMOVE_UNDEF = YNU_UNDEF,
126         DEFERRED_REMOVE_OFF = YNU_NO,
127         DEFERRED_REMOVE_ON = YNU_YES,
128         DEFERRED_REMOVE_IN_PROGRESS,
129 };
130
131 enum skip_kpartx_states {
132         SKIP_KPARTX_UNDEF = YNU_UNDEF,
133         SKIP_KPARTX_OFF = YNU_NO,
134         SKIP_KPARTX_ON = YNU_YES,
135 };
136
137 enum scsi_protocol {
138         SCSI_PROTOCOL_FCP = 0,  /* Fibre Channel */
139         SCSI_PROTOCOL_SPI = 1,  /* parallel SCSI */
140         SCSI_PROTOCOL_SSA = 2,  /* Serial Storage Architecture - Obsolete */
141         SCSI_PROTOCOL_SBP = 3,  /* firewire */
142         SCSI_PROTOCOL_SRP = 4,  /* Infiniband RDMA */
143         SCSI_PROTOCOL_ISCSI = 5,
144         SCSI_PROTOCOL_SAS = 6,
145         SCSI_PROTOCOL_ADT = 7,  /* Media Changers */
146         SCSI_PROTOCOL_ATA = 8,
147         SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */
148 };
149
150 enum delay_checks_states {
151         DELAY_CHECKS_OFF = -1,
152         DELAY_CHECKS_UNDEF = 0,
153 };
154
155 enum initialized_states {
156         INIT_FAILED,
157         INIT_MISSING_UDEV,
158         INIT_REQUESTED_UDEV,
159         INIT_OK,
160 };
161
162 struct sg_id {
163         int host_no;
164         int channel;
165         int scsi_id;
166         int lun;
167         short h_cmd_per_lun;
168         short d_queue_depth;
169         enum scsi_protocol proto_id;
170         int transport_id;
171 };
172
173 # ifndef HDIO_GETGEO
174 #  define HDIO_GETGEO   0x0301  /* get device geometry */
175
176 struct hd_geometry {
177         unsigned char heads;
178         unsigned char sectors;
179         unsigned short cylinders;
180         unsigned long start;
181 };
182 #endif
183
184 struct path {
185         char dev[FILE_NAME_SIZE];
186         char dev_t[BLK_DEV_SIZE];
187         struct udev_device *udev;
188         struct sg_id sg_id;
189         struct hd_geometry geom;
190         char wwid[WWID_SIZE];
191         char vendor_id[SCSI_VENDOR_SIZE];
192         char product_id[SCSI_PRODUCT_SIZE];
193         char rev[SCSI_REV_SIZE];
194         char serial[SERIAL_SIZE];
195         char tgt_node_name[NODE_NAME_SIZE];
196         unsigned long long size;
197         unsigned int checkint;
198         unsigned int tick;
199         int bus;
200         int offline;
201         int state;
202         int dmstate;
203         int chkrstate;
204         int failcount;
205         int priority;
206         int pgindex;
207         int detect_prio;
208         int watch_checks;
209         int wait_checks;
210         int tpgs;
211         char * uid_attribute;
212         char * getuid;
213         struct prio prio;
214         char * prio_args;
215         struct checker checker;
216         struct multipath * mpp;
217         int fd;
218         int initialized;
219         int retriggers;
220
221         /* configlet pointers */
222         struct hwentry * hwe;
223 };
224
225 typedef int (pgpolicyfn) (struct multipath *);
226
227 struct multipath {
228         char wwid[WWID_SIZE];
229         char alias_old[WWID_SIZE];
230         int pgpolicy;
231         pgpolicyfn *pgpolicyfn;
232         int nextpg;
233         int bestpg;
234         int queuedio;
235         int action;
236         int wait_for_udev;
237         int uev_wait_tick;
238         int pgfailback;
239         int failback_tick;
240         int rr_weight;
241         int nr_active;     /* current available(= not known as failed) paths */
242         int no_path_retry; /* number of retries after all paths are down */
243         int retry_tick;    /* remaining times for retries */
244         int minio;
245         int flush_on_last_del;
246         int attribute_flags;
247         int fast_io_fail;
248         int retain_hwhandler;
249         int deferred_remove;
250         int delay_watch_checks;
251         int delay_wait_checks;
252         int skip_kpartx;
253         unsigned int dev_loss;
254         uid_t uid;
255         gid_t gid;
256         mode_t mode;
257         unsigned long long size;
258         vector paths;
259         vector pg;
260         struct dm_info * dmi;
261
262         /* configlet pointers */
263         char * alias;
264         char * alias_prefix;
265         char * selector;
266         char * features;
267         char * hwhandler;
268         struct mpentry * mpe;
269         struct hwentry * hwe;
270
271         /* threads */
272         pthread_t waiter;
273
274         /* stats */
275         unsigned int stat_switchgroup;
276         unsigned int stat_path_failures;
277         unsigned int stat_map_loads;
278         unsigned int stat_total_queueing_time;
279         unsigned int stat_queueing_timeouts;
280         unsigned int stat_map_failures;
281
282         /* checkers shared data */
283         void * mpcontext;
284
285         /* persistent management data*/
286         unsigned char * reservation_key;
287         unsigned char prflag;
288 };
289
290 struct pathgroup {
291         long id;
292         int status;
293         int priority;
294         int enabled_paths;
295         vector paths;
296         char * selector;
297 };
298
299 struct adapter_group {
300         char adapter_name[SLOT_NAME_SIZE];
301         struct pathgroup *pgp;
302         int num_hosts;
303         vector host_groups;
304         int next_host_index;
305 };
306
307 struct host_group {
308         int host_no;
309         int num_paths;
310         vector paths;
311 };
312
313 struct path * alloc_path (void);
314 struct pathgroup * alloc_pathgroup (void);
315 struct multipath * alloc_multipath (void);
316 void free_path (struct path *);
317 void free_pathvec (vector vec, enum free_path_mode free_paths);
318 void free_pathgroup (struct pathgroup * pgp, enum free_path_mode free_paths);
319 void free_pgvec (vector pgvec, enum free_path_mode free_paths);
320 void free_multipath (struct multipath *, enum free_path_mode free_paths);
321 void free_multipath_attributes (struct multipath *);
322 void drop_multipath (vector mpvec, char * wwid, enum free_path_mode free_paths);
323 void free_multipathvec (vector mpvec, enum free_path_mode free_paths);
324
325 struct adapter_group * alloc_adaptergroup(void);
326 struct host_group * alloc_hostgroup(void);
327 void free_adaptergroup(vector adapters);
328 void free_hostgroup(vector hostgroups);
329
330 int store_adaptergroup(vector adapters, struct adapter_group *agp);
331 int store_hostgroup(vector hostgroupvec, struct host_group *hgp);
332
333 int store_path (vector pathvec, struct path * pp);
334 int store_pathgroup (vector pgvec, struct pathgroup * pgp);
335
336 struct multipath * find_mp_by_alias (vector mp, char * alias);
337 struct multipath * find_mp_by_wwid (vector mp, char * wwid);
338 struct multipath * find_mp_by_str (vector mp, char * wwid);
339 struct multipath * find_mp_by_minor (vector mp, int minor);
340
341 struct path * find_path_by_devt (vector pathvec, char * devt);
342 struct path * find_path_by_dev (vector pathvec, char * dev);
343 struct path * first_path (struct multipath * mpp);
344
345 int pathcountgr (struct pathgroup *, int);
346 int pathcount (struct multipath *, int);
347 int pathcmp (struct pathgroup *, struct pathgroup *);
348 void setup_feature(struct multipath *, char *);
349 int add_feature (char **, char *);
350 int remove_feature (char **, char *);
351
352 extern char sysfs_path[PATH_SIZE];
353
354 #endif /* _STRUCTS_H */