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