multipath: Deprecate 'getuid' configuration variable
[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
19
20 #define SCSI_VENDOR_SIZE        9
21 #define SCSI_PRODUCT_SIZE       17
22 #define SCSI_REV_SIZE           5
23 #define SCSI_STATE_SIZE         19
24
25 #define NO_PATH_RETRY_UNDEF     0
26 #define NO_PATH_RETRY_FAIL      -1
27 #define NO_PATH_RETRY_QUEUE     -2
28
29
30 enum free_path_mode {
31         KEEP_PATHS,
32         FREE_PATHS
33 };
34
35 enum rr_weight_mode {
36         RR_WEIGHT_UNDEF,
37         RR_WEIGHT_NONE,
38         RR_WEIGHT_PRIO
39 };
40
41 enum failback_mode {
42         FAILBACK_UNDEF,
43         FAILBACK_MANUAL,
44         FAILBACK_IMMEDIATE,
45         FAILBACK_FOLLOWOVER
46 };
47
48 enum sysfs_buses {
49         SYSFS_BUS_UNDEF,
50         SYSFS_BUS_SCSI,
51         SYSFS_BUS_IDE,
52         SYSFS_BUS_CCW,
53         SYSFS_BUS_CCISS,
54 };
55
56 enum pathstates {
57         PSTATE_UNDEF,
58         PSTATE_FAILED,
59         PSTATE_ACTIVE
60 };
61
62 enum pgstates {
63         PGSTATE_UNDEF,
64         PGSTATE_ENABLED,
65         PGSTATE_DISABLED,
66         PGSTATE_ACTIVE
67 };
68
69 enum queue_without_daemon_states {
70         QUE_NO_DAEMON_OFF,
71         QUE_NO_DAEMON_ON,
72         QUE_NO_DAEMON_FORCE,
73 };
74
75 enum pgtimeouts {
76         PGTIMEOUT_UNDEF,
77         PGTIMEOUT_NONE
78 };
79
80 enum attribute_bits {
81         ATTR_UID,
82         ATTR_GID,
83         ATTR_MODE,
84 };
85
86 enum flush_states {
87         FLUSH_UNDEF,
88         FLUSH_DISABLED,
89         FLUSH_ENABLED,
90         FLUSH_IN_PROGRESS,
91 };
92
93 enum log_checker_err_states {
94         LOG_CHKR_ERR_ALWAYS,
95         LOG_CHKR_ERR_ONCE,
96 };
97
98 enum user_friendly_names_states {
99         USER_FRIENDLY_NAMES_UNDEF,
100         USER_FRIENDLY_NAMES_OFF,
101         USER_FRIENDLY_NAMES_ON,
102 };
103
104 enum retain_hwhandler_states {
105         RETAIN_HWHANDLER_UNDEF,
106         RETAIN_HWHANDLER_OFF,
107         RETAIN_HWHANDLER_ON,
108 };
109
110 enum detect_prio_states {
111         DETECT_PRIO_UNDEF,
112         DETECT_PRIO_OFF,
113         DETECT_PRIO_ON,
114 };
115
116 enum scsi_protocol {
117         SCSI_PROTOCOL_FCP = 0,  /* Fibre Channel */
118         SCSI_PROTOCOL_SPI = 1,  /* parallel SCSI */
119         SCSI_PROTOCOL_SSA = 2,  /* Serial Storage Architecture - Obsolete */
120         SCSI_PROTOCOL_SBP = 3,  /* firewire */
121         SCSI_PROTOCOL_SRP = 4,  /* Infiniband RDMA */
122         SCSI_PROTOCOL_ISCSI = 5,
123         SCSI_PROTOCOL_SAS = 6,
124         SCSI_PROTOCOL_ADT = 7,  /* Media Changers */
125         SCSI_PROTOCOL_ATA = 8,
126         SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */
127 };
128
129 struct sg_id {
130         int host_no;
131         int channel;
132         int scsi_id;
133         int lun;
134         short h_cmd_per_lun;
135         short d_queue_depth;
136         enum scsi_protocol proto_id;
137         int transport_id;
138 };
139
140 # ifndef HDIO_GETGEO
141 #  define HDIO_GETGEO   0x0301  /* get device geometry */
142
143 struct hd_geometry {
144       unsigned char heads;
145       unsigned char sectors;
146       unsigned short cylinders;
147       unsigned long start;
148 };
149 #endif
150
151 struct path {
152         char dev[FILE_NAME_SIZE];
153         char dev_t[BLK_DEV_SIZE];
154         struct udev_device *udev;
155         struct sg_id sg_id;
156         struct hd_geometry geom;
157         char wwid[WWID_SIZE];
158         char vendor_id[SCSI_VENDOR_SIZE];
159         char product_id[SCSI_PRODUCT_SIZE];
160         char rev[SCSI_REV_SIZE];
161         char serial[SERIAL_SIZE];
162         char tgt_node_name[NODE_NAME_SIZE];
163         unsigned long long size;
164         unsigned int checkint;
165         unsigned int tick;
166         int bus;
167         int offline;
168         int state;
169         int dmstate;
170         int chkrstate;
171         int failcount;
172         int priority;
173         int pgindex;
174         int detect_prio;
175         char * uid_attribute;
176         char * getuid;
177         struct prio prio;
178         char * prio_args;
179         struct checker checker;
180         struct multipath * mpp;
181         int fd;
182
183         /* configlet pointers */
184         struct hwentry * hwe;
185 };
186
187 typedef int (pgpolicyfn) (struct multipath *);
188
189 struct multipath {
190         char wwid[WWID_SIZE];
191         char alias_old[WWID_SIZE];
192         int pgpolicy;
193         pgpolicyfn *pgpolicyfn;
194         int nextpg;
195         int bestpg;
196         int queuedio;
197         int action;
198         int pgfailback;
199         int failback_tick;
200         int rr_weight;
201         int nr_active;     /* current available(= not known as failed) paths */
202         int no_path_retry; /* number of retries after all paths are down */
203         int retry_tick;    /* remaining times for retries */
204         int minio;
205         int pg_timeout;
206         int flush_on_last_del;
207         int attribute_flags;
208         int fast_io_fail;
209         int retain_hwhandler;
210         unsigned int dev_loss;
211         uid_t uid;
212         gid_t gid;
213         mode_t mode;
214         unsigned long long size;
215         vector paths;
216         vector pg;
217         struct dm_info * dmi;
218
219         /* configlet pointers */
220         char * alias;
221         char * alias_prefix;
222         char * selector;
223         char * features;
224         char * hwhandler;
225         struct mpentry * mpe;
226         struct hwentry * hwe;
227
228         /* threads */
229         pthread_t waiter;
230
231         /* stats */
232         unsigned int stat_switchgroup;
233         unsigned int stat_path_failures;
234         unsigned int stat_map_loads;
235         unsigned int stat_total_queueing_time;
236         unsigned int stat_queueing_timeouts;
237
238         /* checkers shared data */
239         void * mpcontext;
240         
241         /* persistent management data*/
242         unsigned char * reservation_key;
243         unsigned char prflag;
244 };
245
246 struct pathgroup {
247         long id;
248         int status;
249         int priority;
250         int enabled_paths;
251         vector paths;
252         char * selector;
253 };
254
255 struct path * alloc_path (void);
256 struct pathgroup * alloc_pathgroup (void);
257 struct multipath * alloc_multipath (void);
258 void free_path (struct path *);
259 void free_pathvec (vector vec, enum free_path_mode free_paths);
260 void free_pathgroup (struct pathgroup * pgp, enum free_path_mode free_paths);
261 void free_pgvec (vector pgvec, enum free_path_mode free_paths);
262 void free_multipath (struct multipath *, enum free_path_mode free_paths);
263 void free_multipath_attributes (struct multipath *);
264 void drop_multipath (vector mpvec, char * wwid, enum free_path_mode free_paths);
265 void free_multipathvec (vector mpvec, enum free_path_mode free_paths);
266
267 int store_path (vector pathvec, struct path * pp);
268 int store_pathgroup (vector pgvec, struct pathgroup * pgp);
269
270 struct multipath * find_mp_by_alias (vector mp, char * alias);
271 struct multipath * find_mp_by_wwid (vector mp, char * wwid);
272 struct multipath * find_mp_by_str (vector mp, char * wwid);
273 struct multipath * find_mp_by_minor (vector mp, int minor);
274         
275 struct path * find_path_by_devt (vector pathvec, char * devt);
276 struct path * find_path_by_dev (vector pathvec, char * dev);
277 struct path * first_path (struct multipath * mpp);
278
279 int pathcountgr (struct pathgroup *, int);
280 int pathcount (struct multipath *, int);
281 int pathcmp (struct pathgroup *, struct pathgroup *);
282 void setup_feature(struct multipath *, char *);
283 int add_feature (char **, char *);
284 int remove_feature (char **, char *);
285
286 extern char sysfs_path[PATH_SIZE];
287
288 #endif /* _STRUCTS_H */