multipathd: add deferred_remove support
[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           8
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 struct sg_id {
144         int host_no;
145         int channel;
146         int scsi_id;
147         int lun;
148         short h_cmd_per_lun;
149         short d_queue_depth;
150         enum scsi_protocol proto_id;
151         int transport_id;
152 };
153
154 # ifndef HDIO_GETGEO
155 #  define HDIO_GETGEO   0x0301  /* get device geometry */
156
157 struct hd_geometry {
158       unsigned char heads;
159       unsigned char sectors;
160       unsigned short cylinders;
161       unsigned long start;
162 };
163 #endif
164
165 struct path {
166         char dev[FILE_NAME_SIZE];
167         char dev_t[BLK_DEV_SIZE];
168         struct udev_device *udev;
169         struct sg_id sg_id;
170         struct hd_geometry geom;
171         char wwid[WWID_SIZE];
172         char vendor_id[SCSI_VENDOR_SIZE];
173         char product_id[SCSI_PRODUCT_SIZE];
174         char rev[SCSI_REV_SIZE];
175         char serial[SERIAL_SIZE];
176         char tgt_node_name[NODE_NAME_SIZE];
177         unsigned long long size;
178         unsigned int checkint;
179         unsigned int tick;
180         int bus;
181         int offline;
182         int state;
183         int dmstate;
184         int chkrstate;
185         int failcount;
186         int priority;
187         int pgindex;
188         int detect_prio;
189         char * uid_attribute;
190         char * getuid;
191         struct prio prio;
192         char * prio_args;
193         struct checker checker;
194         struct multipath * mpp;
195         int fd;
196
197         /* configlet pointers */
198         struct hwentry * hwe;
199 };
200
201 typedef int (pgpolicyfn) (struct multipath *);
202
203 struct multipath {
204         char wwid[WWID_SIZE];
205         char alias_old[WWID_SIZE];
206         int pgpolicy;
207         pgpolicyfn *pgpolicyfn;
208         int nextpg;
209         int bestpg;
210         int queuedio;
211         int action;
212         int pgfailback;
213         int failback_tick;
214         int rr_weight;
215         int nr_active;     /* current available(= not known as failed) paths */
216         int no_path_retry; /* number of retries after all paths are down */
217         int retry_tick;    /* remaining times for retries */
218         int minio;
219         int flush_on_last_del;
220         int attribute_flags;
221         int fast_io_fail;
222         int retain_hwhandler;
223         int deferred_remove;
224         unsigned int dev_loss;
225         uid_t uid;
226         gid_t gid;
227         mode_t mode;
228         unsigned long long size;
229         vector paths;
230         vector pg;
231         struct dm_info * dmi;
232
233         /* configlet pointers */
234         char * alias;
235         char * alias_prefix;
236         char * selector;
237         char * features;
238         char * hwhandler;
239         struct mpentry * mpe;
240         struct hwentry * hwe;
241
242         /* threads */
243         pthread_t waiter;
244
245         /* stats */
246         unsigned int stat_switchgroup;
247         unsigned int stat_path_failures;
248         unsigned int stat_map_loads;
249         unsigned int stat_total_queueing_time;
250         unsigned int stat_queueing_timeouts;
251
252         /* checkers shared data */
253         void * mpcontext;
254         
255         /* persistent management data*/
256         unsigned char * reservation_key;
257         unsigned char prflag;
258 };
259
260 struct pathgroup {
261         long id;
262         int status;
263         int priority;
264         int enabled_paths;
265         vector paths;
266         char * selector;
267 };
268
269 struct adapter_group {
270         char adapter_name[SLOT_NAME_SIZE];
271         struct pathgroup *pgp;
272         int num_hosts;
273         vector host_groups;
274         int next_host_index;
275 };
276
277 struct host_group {
278         int host_no;
279         int num_paths;
280         vector paths;
281 };
282
283 struct path * alloc_path (void);
284 struct pathgroup * alloc_pathgroup (void);
285 struct multipath * alloc_multipath (void);
286 void free_path (struct path *);
287 void free_pathvec (vector vec, enum free_path_mode free_paths);
288 void free_pathgroup (struct pathgroup * pgp, enum free_path_mode free_paths);
289 void free_pgvec (vector pgvec, enum free_path_mode free_paths);
290 void free_multipath (struct multipath *, enum free_path_mode free_paths);
291 void free_multipath_attributes (struct multipath *);
292 void drop_multipath (vector mpvec, char * wwid, enum free_path_mode free_paths);
293 void free_multipathvec (vector mpvec, enum free_path_mode free_paths);
294
295 struct adapter_group * alloc_adaptergroup(void);
296 struct host_group * alloc_hostgroup(void);
297 void free_adaptergroup(vector adapters);
298 void free_hostgroup(vector hostgroups);
299
300 int store_adaptergroup(vector adapters, struct adapter_group *agp);
301 int store_hostgroup(vector hostgroupvec, struct host_group *hgp);
302
303 int store_path (vector pathvec, struct path * pp);
304 int store_pathgroup (vector pgvec, struct pathgroup * pgp);
305
306 struct multipath * find_mp_by_alias (vector mp, char * alias);
307 struct multipath * find_mp_by_wwid (vector mp, char * wwid);
308 struct multipath * find_mp_by_str (vector mp, char * wwid);
309 struct multipath * find_mp_by_minor (vector mp, int minor);
310         
311 struct path * find_path_by_devt (vector pathvec, char * devt);
312 struct path * find_path_by_dev (vector pathvec, char * dev);
313 struct path * first_path (struct multipath * mpp);
314
315 int pathcountgr (struct pathgroup *, int);
316 int pathcount (struct multipath *, int);
317 int pathcmp (struct pathgroup *, struct pathgroup *);
318 void setup_feature(struct multipath *, char *);
319 int add_feature (char **, char *);
320 int remove_feature (char **, char *);
321
322 extern char sysfs_path[PATH_SIZE];
323
324 #endif /* _STRUCTS_H */