fc6413bed29f709363a2114fb3fdafe1ff53fb90
[multipath-tools/.git] / libmultipath / structs.h
1 #ifndef _STRUCTS_H
2 #define _STRUCTS_H
3
4 #include <sys/types.h>
5
6 #define WWID_SIZE               128
7 #define SERIAL_SIZE             64
8 #define NODE_NAME_SIZE          19
9 #define PATH_STR_SIZE           16
10 #define PARAMS_SIZE             1024
11 #define FILE_NAME_SIZE          256
12 #define CALLOUT_MAX_SIZE        128
13 #define BLK_DEV_SIZE            33
14 #define PATH_SIZE               512
15 #define NAME_SIZE               512
16
17
18 #define SCSI_VENDOR_SIZE        9
19 #define SCSI_PRODUCT_SIZE       17
20 #define SCSI_REV_SIZE           5
21 #define SCSI_STATE_SIZE         9
22
23 #define NO_PATH_RETRY_UNDEF     0
24 #define NO_PATH_RETRY_FAIL      -1
25 #define NO_PATH_RETRY_QUEUE     -2
26
27
28 enum free_path_switch {
29         KEEP_PATHS,
30         FREE_PATHS
31 };
32
33 enum rr_weight_mode {
34         RR_WEIGHT_UNDEF,
35         RR_WEIGHT_NONE,
36         RR_WEIGHT_PRIO
37 };
38
39 enum failback_mode {
40         FAILBACK_UNDEF,
41         FAILBACK_MANUAL,
42         FAILBACK_IMMEDIATE
43 };
44
45 enum sysfs_buses {
46         SYSFS_BUS_UNDEF,
47         SYSFS_BUS_SCSI,
48         SYSFS_BUS_IDE,
49         SYSFS_BUS_CCW,
50         SYSFS_BUS_CCISS,
51 };
52
53 enum pathstates {
54         PSTATE_UNDEF,
55         PSTATE_FAILED,
56         PSTATE_ACTIVE
57 };
58
59 enum pgstates {
60         PGSTATE_UNDEF,
61         PGSTATE_ENABLED,
62         PGSTATE_DISABLED,
63         PGSTATE_ACTIVE
64 };
65
66 enum queue_without_daemon_states {
67         QUE_NO_DAEMON_UNDEF,
68         QUE_NO_DAEMON_OFF,
69         QUE_NO_DAEMON_ON,
70 };
71
72 enum pgtimeouts {
73         PGTIMEOUT_UNDEF,
74         PGTIMEOUT_NONE
75 };
76
77 enum attribute_bits {
78         ATTR_UID,
79         ATTR_GID,
80         ATTR_MODE,
81 };
82
83 enum flush_states {
84         FLUSH_UNDEF,
85         FLUSH_DISABLED,
86         FLUSH_ENABLED,
87         FLUSH_IN_PROGRESS,
88 };
89
90 struct scsi_idlun {
91         int dev_id;
92         int host_unique_id;
93         int host_no;
94 };
95
96 struct sg_id {
97         int host_no;
98         int channel;
99         int scsi_id;
100         int lun;
101         short h_cmd_per_lun;
102         short d_queue_depth;
103         int unused1;
104         int unused2;
105 };
106
107 struct scsi_dev {
108         char dev[FILE_NAME_SIZE];
109         struct scsi_idlun scsi_id;
110         int host_no;
111 };
112
113 struct sysfs_device {
114         struct sysfs_device *parent;            /* parent device */
115         char devpath[PATH_SIZE];
116         char subsystem[NAME_SIZE];              /* $class, $bus, drivers, module */
117         char kernel[NAME_SIZE];                 /* device instance name */
118         char kernel_number[NAME_SIZE];
119         char driver[NAME_SIZE];                 /* device driver name */
120 };
121
122 struct path {
123         char dev[FILE_NAME_SIZE];
124         char dev_t[BLK_DEV_SIZE];
125         struct sysfs_device *sysdev;
126         struct scsi_idlun scsi_id;
127         struct sg_id sg_id;
128         char wwid[WWID_SIZE];
129         char vendor_id[SCSI_VENDOR_SIZE];
130         char product_id[SCSI_PRODUCT_SIZE];
131         char rev[SCSI_REV_SIZE];
132         char serial[SERIAL_SIZE];
133         char tgt_node_name[NODE_NAME_SIZE];
134         unsigned long long size;
135         unsigned int checkint;
136         unsigned int tick;
137         int bus;
138         int offline;
139         int state;
140         int dmstate;
141         int failcount;
142         int priority;
143         int pgindex;
144         char * getuid;
145         struct prio * prio;
146         struct checker checker;
147         struct multipath * mpp;
148         int fd;
149         
150         /* configlet pointers */
151         struct hwentry * hwe;
152 };
153
154 typedef int (pgpolicyfn) (struct multipath *);
155
156 struct multipath {
157         char wwid[WWID_SIZE];
158         char alias_old[WWID_SIZE];
159         int pgpolicy;
160         pgpolicyfn *pgpolicyfn;
161         int nextpg;
162         int bestpg;
163         int queuedio;
164         int action;
165         int pgfailback;
166         int failback_tick;
167         int rr_weight;
168         int nr_active;     /* current available(= not known as failed) paths */
169         int no_path_retry; /* number of retries after all paths are down */
170         int retry_tick;    /* remaining times for retries */
171         int minio;
172         int pg_timeout;
173         int flush_on_last_del;
174         int attribute_flags;
175         int fast_io_fail;
176         unsigned int dev_loss;
177         uid_t uid;
178         gid_t gid;
179         mode_t mode;
180         unsigned long long size;
181         vector paths;
182         vector pg;
183         char params[PARAMS_SIZE];
184         char status[PARAMS_SIZE];
185         struct dm_info * dmi;
186
187         /* configlet pointers */
188         char * alias;
189         char * alias_prefix;
190         char * selector;
191         char * features;
192         char * hwhandler;
193         struct mpentry * mpe;
194         struct hwentry * hwe;
195
196         /* threads */
197         void * waiter;
198
199         /* stats */
200         unsigned int stat_switchgroup;
201         unsigned int stat_path_failures;
202         unsigned int stat_map_loads;
203         unsigned int stat_total_queueing_time;
204         unsigned int stat_queueing_timeouts;
205
206         /* checkers shared data */
207         void * mpcontext;
208 };
209
210 struct pathgroup {
211         long id;
212         int status;
213         int priority;
214         int enabled_paths;
215         vector paths;
216         char * selector;
217 };
218
219 struct path * alloc_path (void);
220 struct pathgroup * alloc_pathgroup (void);
221 struct multipath * alloc_multipath (void);
222 void free_path (struct path *);
223 void free_pathvec (vector vec, int free_paths);
224 void free_pathgroup (struct pathgroup * pgp, int free_paths);
225 void free_pgvec (vector pgvec, int free_paths);
226 void free_multipath (struct multipath *, int free_paths);
227 void free_multipath_attributes (struct multipath *);
228 void drop_multipath (vector mpvec, char * wwid, int free_paths);
229 void free_multipathvec (vector mpvec, int free_paths);
230
231 int store_path (vector pathvec, struct path * pp);
232 int store_pathgroup (vector pgvec, struct pathgroup * pgp);
233
234 struct multipath * find_mp_by_alias (vector mp, char * alias);
235 struct multipath * find_mp_by_wwid (vector mp, char * wwid);
236 struct multipath * find_mp_by_str (vector mp, char * wwid);
237 struct multipath * find_mp_by_minor (vector mp, int minor);
238         
239 struct path * find_path_by_devt (vector pathvec, char * devt);
240 struct path * find_path_by_dev (vector pathvec, char * dev);
241 struct path * first_path (struct multipath * mpp);
242
243 int pathcountgr (struct pathgroup *, int);
244 int pathcount (struct multipath *, int);
245 void setup_feature(struct multipath *, char *);
246
247 extern char sysfs_path[PATH_SIZE];
248
249 #endif /* _STRUCTS_H */