6edd927e73b20fe35923096b682fcd42775e0677
[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 max_sectors_kb_states {
138         MAX_SECTORS_KB_UNDEF = 0,
139         MAX_SECTORS_KB_MIN = 4,  /* can't be smaller than page size */
140 };
141
142 enum scsi_protocol {
143         SCSI_PROTOCOL_FCP = 0,  /* Fibre Channel */
144         SCSI_PROTOCOL_SPI = 1,  /* parallel SCSI */
145         SCSI_PROTOCOL_SSA = 2,  /* Serial Storage Architecture - Obsolete */
146         SCSI_PROTOCOL_SBP = 3,  /* firewire */
147         SCSI_PROTOCOL_SRP = 4,  /* Infiniband RDMA */
148         SCSI_PROTOCOL_ISCSI = 5,
149         SCSI_PROTOCOL_SAS = 6,
150         SCSI_PROTOCOL_ADT = 7,  /* Media Changers */
151         SCSI_PROTOCOL_ATA = 8,
152         SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */
153 };
154
155 enum no_undef_states {
156         NU_NO = -1,
157         NU_UNDEF = 0,
158 };
159
160 enum initialized_states {
161         INIT_FAILED,
162         INIT_MISSING_UDEV,
163         INIT_REQUESTED_UDEV,
164         INIT_OK,
165 };
166
167 struct sg_id {
168         int host_no;
169         int channel;
170         int scsi_id;
171         int lun;
172         short h_cmd_per_lun;
173         short d_queue_depth;
174         enum scsi_protocol proto_id;
175         int transport_id;
176 };
177
178 # ifndef HDIO_GETGEO
179 #  define HDIO_GETGEO   0x0301  /* get device geometry */
180
181 struct hd_geometry {
182         unsigned char heads;
183         unsigned char sectors;
184         unsigned short cylinders;
185         unsigned long start;
186 };
187 #endif
188
189 struct path {
190         char dev[FILE_NAME_SIZE];
191         char dev_t[BLK_DEV_SIZE];
192         struct udev_device *udev;
193         struct sg_id sg_id;
194         struct hd_geometry geom;
195         char wwid[WWID_SIZE];
196         char vendor_id[SCSI_VENDOR_SIZE];
197         char product_id[SCSI_PRODUCT_SIZE];
198         char rev[SCSI_REV_SIZE];
199         char serial[SERIAL_SIZE];
200         char tgt_node_name[NODE_NAME_SIZE];
201         unsigned long long size;
202         unsigned int checkint;
203         unsigned int tick;
204         int bus;
205         int offline;
206         int state;
207         int dmstate;
208         int chkrstate;
209         int failcount;
210         int priority;
211         int pgindex;
212         int detect_prio;
213         int watch_checks;
214         int wait_checks;
215         int tpgs;
216         char * uid_attribute;
217         char * getuid;
218         struct prio prio;
219         char * prio_args;
220         struct checker checker;
221         struct multipath * mpp;
222         int fd;
223         int initialized;
224         int retriggers;
225         int wwid_changed;
226         unsigned int path_failures;
227         time_t dis_reinstate_time;
228         int disable_reinstate;
229         int san_path_err_forget_rate;
230         /* configlet pointers */
231         struct hwentry * hwe;
232 };
233
234 typedef int (pgpolicyfn) (struct multipath *);
235
236 struct multipath {
237         char wwid[WWID_SIZE];
238         char alias_old[WWID_SIZE];
239         int pgpolicy;
240         pgpolicyfn *pgpolicyfn;
241         int nextpg;
242         int bestpg;
243         int queuedio;
244         int action;
245         int wait_for_udev;
246         int uev_wait_tick;
247         int pgfailback;
248         int failback_tick;
249         int rr_weight;
250         int nr_active;     /* current available(= not known as failed) paths */
251         int no_path_retry; /* number of retries after all paths are down */
252         int retry_tick;    /* remaining times for retries */
253         int minio;
254         int flush_on_last_del;
255         int attribute_flags;
256         int fast_io_fail;
257         int retain_hwhandler;
258         int deferred_remove;
259         int delay_watch_checks;
260         int delay_wait_checks;
261         int san_path_err_threshold;
262         int san_path_err_forget_rate;
263         int san_path_err_recovery_time;
264         int skip_kpartx;
265         int max_sectors_kb;
266         unsigned int dev_loss;
267         uid_t uid;
268         gid_t gid;
269         mode_t mode;
270         unsigned long long size;
271         vector paths;
272         vector pg;
273         struct dm_info * dmi;
274
275         /* configlet pointers */
276         char * alias;
277         char * alias_prefix;
278         char * selector;
279         char * features;
280         char * hwhandler;
281         struct mpentry * mpe;
282         struct hwentry * hwe;
283
284         /* threads */
285         pthread_t waiter;
286
287         /* stats */
288         unsigned int stat_switchgroup;
289         unsigned int stat_path_failures;
290         unsigned int stat_map_loads;
291         unsigned int stat_total_queueing_time;
292         unsigned int stat_queueing_timeouts;
293         unsigned int stat_map_failures;
294
295         /* checkers shared data */
296         void * mpcontext;
297
298         /* persistent management data*/
299         unsigned char * reservation_key;
300         unsigned char prflag;
301 };
302
303 struct pathgroup {
304         long id;
305         int status;
306         int priority;
307         int enabled_paths;
308         vector paths;
309         char * selector;
310 };
311
312 struct adapter_group {
313         char adapter_name[SLOT_NAME_SIZE];
314         struct pathgroup *pgp;
315         int num_hosts;
316         vector host_groups;
317         int next_host_index;
318 };
319
320 struct host_group {
321         int host_no;
322         int num_paths;
323         vector paths;
324 };
325
326 struct path * alloc_path (void);
327 struct pathgroup * alloc_pathgroup (void);
328 struct multipath * alloc_multipath (void);
329 void free_path (struct path *);
330 void free_pathvec (vector vec, enum free_path_mode free_paths);
331 void free_pathgroup (struct pathgroup * pgp, enum free_path_mode free_paths);
332 void free_pgvec (vector pgvec, enum free_path_mode free_paths);
333 void free_multipath (struct multipath *, enum free_path_mode free_paths);
334 void free_multipath_attributes (struct multipath *);
335 void drop_multipath (vector mpvec, char * wwid, enum free_path_mode free_paths);
336 void free_multipathvec (vector mpvec, enum free_path_mode free_paths);
337
338 struct adapter_group * alloc_adaptergroup(void);
339 struct host_group * alloc_hostgroup(void);
340 void free_adaptergroup(vector adapters);
341 void free_hostgroup(vector hostgroups);
342
343 int store_adaptergroup(vector adapters, struct adapter_group *agp);
344 int store_hostgroup(vector hostgroupvec, struct host_group *hgp);
345
346 int store_path (vector pathvec, struct path * pp);
347 int store_pathgroup (vector pgvec, struct pathgroup * pgp);
348
349 struct multipath * find_mp_by_alias (vector mp, char * alias);
350 struct multipath * find_mp_by_wwid (vector mp, char * wwid);
351 struct multipath * find_mp_by_str (vector mp, char * wwid);
352 struct multipath * find_mp_by_minor (vector mp, int minor);
353
354 struct path * find_path_by_devt (vector pathvec, char * devt);
355 struct path * find_path_by_dev (vector pathvec, char * dev);
356 struct path * first_path (struct multipath * mpp);
357
358 int pathcountgr (struct pathgroup *, int);
359 int pathcount (struct multipath *, int);
360 int pathcmp (struct pathgroup *, struct pathgroup *);
361 void setup_feature(struct multipath *, char *);
362 int add_feature (char **, char *);
363 int remove_feature (char **, char *);
364
365 extern char sysfs_path[PATH_SIZE];
366
367 #endif /* _STRUCTS_H */