1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 #ifndef _DSW_H
27 #define _DSW_H
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 /*
34 * Miscellaneous defines
35 */
36
37 #define DSW_BITS 8 /* # of bits in a byte */
38 #define DSW_SIZE 64 /* fba's in a DSW chunk */
39
40
41 /*
42 * Ioctl definitions
43 */
44
45 #define _D_(x) (('D'<<16)|('W'<<8)|(x))
46
47 #define DSWIOC_ENABLE _D_(1) /* Configure DSW pair */
48 #define DSWIOC_RESUME _D_(2) /* Resume a DSW pair */
49 #define DSWIOC_SUSPEND _D_(3) /* Suspend a DSW pair */
50 #define DSWIOC_COPY _D_(4) /* Copy DSW volume over its pair */
51 #define DSWIOC_BITMAP _D_(5) /* Get bitmap */
52 #define DSWIOC_STAT _D_(6) /* Get state of shadow */
53 #define DSWIOC_DISABLE _D_(7) /* Deconfigure DSW pair */
54 #define DSWIOC_SHUTDOWN _D_(8) /* Suspend all DSW pairs */
55 #define DSWIOC_ABORT _D_(9) /* Abort Copy of DSW pair */
56 #define DSWIOC_VERSION _D_(10) /* DataShadow version */
57 #define DSWIOC_RESET _D_(11) /* Reset DataShadow set */
58 #define DSWIOC_OFFLINE _D_(12) /* Offline volumes */
59 #define DSWIOC_WAIT _D_(13) /* Wait for copy to complete */
60 #define DSWIOC_LIST _D_(14) /* List current kernel shadow groups */
61 #define DSWIOC_ACOPY _D_(15) /* Copy DSW volumes over their pairs */
62 #define DSWIOC_EXPORT _D_(16) /* Export the shadow volume */
63 #define DSWIOC_IMPORT _D_(17) /* Import shadow volume */
64 #define DSWIOC_JOIN _D_(18) /* Rejoin previously exported shadow */
65 #define DSWIOC_COPYP _D_(19) /* Set and get copy parameters */
66 #define DSWIOC_OCREAT _D_(20) /* Create overflow volume */
67 #define DSWIOC_OATTACH _D_(21) /* Attach overflow volume */
68 #define DSWIOC_ODETACH _D_(22) /* Detach overflow volume */
69 #define DSWIOC_OLIST _D_(23) /* List overflow volumes */
70 #define DSWIOC_OSTAT _D_(24) /* Stat overflow volume */
71 #define DSWIOC_SBITSSET _D_(25) /* Get # of bits set in shadow bitmap */
72 #define DSWIOC_CBITSSET _D_(26) /* Get # of bits set in copy bitmap */
73 #define DSWIOC_LISTLEN _D_(27) /* length of DSWIOC_LIST data */
74 #define DSWIOC_OLISTLEN _D_(28) /* length of DSWIOC_OLIST data */
75 #define DSWIOC_SEGMENT _D_(29) /* Get segemented bitmaps */
76 #define DSWIOC_MOVEGRP _D_(30) /* Move set from one group to another */
77 #define DSWIOC_CLIST _D_(31) /* get list of resource groups */
78 #define DSWIOC_GLIST _D_(32) /* get list of groups */
79 #define DSWIOC_CHANGETAG _D_(33) /* change the cluster tag of a set */
80 #define DSWIOC_OSTAT2 _D_(34) /* Stat overflow volume enhanced */
81
82 /*
83 * Config and status flags
84 */
85
86 #define DSW_GOLDEN 0x0001 /* the set is independent */
87
88 #define DSW_COPYINGP 0x0100 /* Copy in progress */
89 #define DSW_COPYINGM 0x0200 /* Copying master to shadow */
90 #define DSW_COPYINGS 0x0400 /* Copying shadow to master */
91 #define DSW_COPYING 0x0600 /* Copying, may be in progress */
92 #define DSW_COPY_FLAGS 0x0700 /* Copy flags */
93 #define DSW_COPYINGX 0x0800 /* Copy exit requested */
94 #define DSW_OFFLINE 0xf000 /* An underlying volume offline */
95 #define DSW_BMPOFFLINE 0x1000 /* Bitmap volume offline */
96 #define DSW_SHDOFFLINE 0x2000 /* Shadow volume offline */
97 #define DSW_MSTOFFLINE 0x4000 /* Master volume offline */
98 #define DSW_OVROFFLINE 0x8000 /* Overflow volume offline */
99 #define DSW_TREEMAP 0x10000 /* Shadow volume accessed by an index */
100 #define DSW_OVERFLOW 0x20000 /* Shadow volume has overflowed */
101 #define DSW_SHDEXPORT 0x40000 /* Shadow volume has been exported */
102 #define DSW_SHDIMPORT 0x80000 /* Shadow volume has been imported */
103 #define DSW_VOVERFLOW 0x100000 /* Shadow volume using overflow vol */
104 #define DSW_HANGING 0x200000 /* Hanging master structure */
105 #define DSW_CFGOFFLINE 0x400000 /* config db is offline */
106 #define DSW_OVRHDRDRTY 0x800000 /* Overflow header dirty */
107 #define DSW_RESIZED 0x1000000 /* mst_size != shd_size */
108 #define DSW_FRECLAIM 0x2000000 /* force the reclaim of an ovr vol */
109
110 /*
111 * used for SNMP trap only.
112 * These flags help distinguish between enable and resume,
113 * suspend and disable.
114 * Note that DSW_HANGING is set for both suspend and disable
115 */
116 #define DSW_SNMP_CLR 0 /* no flag is set */
117 #define DSW_SNMP_DISABLE 1 /* Set is disabled */
118 #define DSW_SNMP_SUSPEND 2 /* Set is suspended */
119 #define DSW_SNMP_ENABLE 3 /* Set is enabled */
120 #define DSW_SNMP_RESUME 4 /* Set is resumed */
121 #define DSW_SNMP_OVER_ATTACH 5 /* overflow attached */
122 #define DSW_SNMP_OVER_DETACH 6 /* overflow detached */
123 #define DSW_SNMP_UPDATE 7 /* update operation */
124 #define DSW_SNMP_COPIED 8 /* copy operation */
125
126 /* Overflow volume flags */
127 #define IIO_OFFLINE 0x0001 /* Volume is offline */
128 #define IIO_HDR_WRTN 0x0002 /* Header written */
129 #define IIO_CNTR_INVLD 0x0004 /* Overflow counters invalid */
130 #define IIO_VOL_UPDATE 0x0008 /* Performing group update */
131
132 #define DSW_NAMELEN 64 /* NSC_MAXPATH - don't change without */
133 /* amending header version number */
134
135 #define DSWDEV "/dev/ii"
136 #define II_IMPORTED_SHADOW "<imported_shadow>"
137
138 /*
139 * Configuration parameter defines
140 * ii_bitmap, ii_throttle_unit, ii_throttle_delay
141 */
142 #define II_KMEM 0 /* Load/store on resume/suspend, in memory */
143 #define II_WTHRU 1 /* Read/write bitmap thru to bitmap volume */
144 #define II_FWC 2 /* Read/write bitmap to FWC, else WTHRU */
145
146 #define MIN_THROTTLE_UNIT 100 /* Min. number of units to transfer */
147 #define MAX_THROTTLE_UNIT 60000 /* Max. number of units to transfer */
148 #define MIN_THROTTLE_DELAY 2 /* Min. delay between unit transfer */
149 #define MAX_THROTTLE_DELAY 10000 /* Max. delay between unit transfer */
150
151 /*
152 * DSW user config structure
153 */
154
155 typedef struct dsw_config_s {
156 spcs_s_info_t status;
157 char master_vol[DSW_NAMELEN];
158 char shadow_vol[DSW_NAMELEN];
159 char bitmap_vol[DSW_NAMELEN];
160 char cluster_tag[DSW_NAMELEN];
161 char group_name[DSW_NAMELEN];
162 int flag;
163 } dsw_config_t;
164
165 /*
166 * DSW segmented bitmap I/O structure
167 */
168 typedef struct dsw_segment_s {
169 spcs_s_info_t status;
170 char shadow_vol[DSW_NAMELEN];
171 unsigned seg_number; /* 32KB Segment number to start at */
172 unsigned char *shd_bitmap; /* pointer to shadow bitmap */
173 int shd_size; /* size of shadow bitmap */
174 unsigned char *cpy_bitmap; /* pointer to copy bitmap */
175 int cpy_size; /* size of copy bitmap */
176 unsigned char *idx_bitmap; /* pointer to index table */
177 int idx_size; /* size of index table */
178 } dsw_segment_t;
179
180 /*
181 * DSW user bitmap structure
182 */
183
184 typedef struct dsw_bitmap_s {
185 spcs_s_info_t status;
186 char shadow_vol[DSW_NAMELEN];
187 unsigned char *shd_bitmap; /* pointer to shadow bitmap */
188 uint64_t shd_size; /* size of shadow bitmap */
189 uint64_t copy_size; /* size of copy bitmap */
190 unsigned char *copy_bitmap; /* pointer to copy bitmap */
191 } dsw_bitmap_t;
192
193
194 /*
195 * DSW general ioctl structure
196 */
197
198 typedef struct dsw_ioctl_s {
199 spcs_s_info_t status;
200 char shadow_vol[DSW_NAMELEN];
201 int flags;
202 pid_t pid;
203 } dsw_ioctl_t;
204
205
206 /*
207 * DSW general atomic ioctl structure operating on several Image sets
208 */
209
210 typedef struct dsw_aioctl_s {
211 spcs_s_info_t status;
212 int flags;
213 int count;
214 pid_t pid;
215 char shadow_vol[DSW_NAMELEN]; /* start of list of image sets */
216 } dsw_aioctl_t;
217
218
219 /*
220 * DSW stat ioctl structure
221 */
222
223 typedef struct dsw_stat_s {
224 spcs_s_info_t status;
225 char shadow_vol[DSW_NAMELEN];
226 int stat;
227 uint64_t size;
228 char overflow_vol[DSW_NAMELEN];
229 uint64_t shdsize;
230 uint64_t shdused;
231 char group_name[DSW_NAMELEN];
232 char cluster_tag[DSW_NAMELEN];
233 uint64_t mtime;
234 } dsw_stat_t;
235
236
237 /*
238 * DSW version ioctl structure
239 */
240
241 typedef struct dsw_version_s {
242 spcs_s_info_t status;
243 int major; /* Major release number */
244 int minor; /* Minor release number */
245 int micro; /* Micro release number */
246 int baseline; /* Baseline revision number */
247 } dsw_version_t;
248
249 /*
250 * DSW get bits set in bitmap structure
251 */
252
253 typedef struct dsw_bitsset_s {
254 spcs_s_info_t status;
255 char shadow_vol[DSW_NAMELEN];
256 uint64_t tot_size; /* total number of bits in map */
257 uint64_t tot_set; /* number of bitmap bits set */
258 } dsw_bitsset_t;
259
260
261 /*
262 * DSW list ioctl structure
263 */
264
265 typedef struct dsw_list_s {
266 spcs_s_info_t status;
267 int list_size; /* number of elements in list */
268 int list_used; /* number of elements returned */
269 dsw_config_t *list;
270 } dsw_list_t;
271
272 /*
273 * DSW copy parameter structure
274 */
275
276 typedef struct dsw_copyp_s {
277 spcs_s_info_t status;
278 char shadow_vol[DSW_NAMELEN];
279 int copy_unit;
280 int copy_delay;
281 } dsw_copyp_t;
282
283 /*
284 * DSW ostat ioctl structure
285 */
286
287 typedef struct dsw_ostat_s {
288 spcs_s_info_t status;
289 char overflow_vol[DSW_NAMELEN];
290 int drefcnt;
291 uint64_t used;
292 uint64_t unused;
293 uint64_t nchunks;
294 int crefcnt;
295 int flags;
296 int hversion;
297 int hmagic;
298 } dsw_ostat_t;
299
300 /*
301 * DSW move group structure
302 */
303
304 typedef struct dsw_movegrp_s {
305 spcs_s_info_t status;
306 char shadow_vol[DSW_NAMELEN];
307 char new_group[DSW_NAMELEN];
308 } dsw_movegrp_t;
309
310 /*
311 * II_PIT_PROPS structure
312 */
313 typedef struct pit_props_s {
314 int iirc;
315 int mstid;
316 int shdid;
317 int bmpid;
318 int ovrid;
319 char group[DSW_NAMELEN];
320 char cluster[DSW_NAMELEN];
321 int has_overflow;
322 int flags;
323 uint64_t size;
324 int64_t shdchks;
325 int64_t copybits;
326 int64_t shdbits;
327 } pit_props_t;
328
329 /*
330 * II_PIT_UPDATE structure
331 */
332 typedef struct pit_update_s {
333 int iirc;
334 char direction;
335 } pit_update_t;
336
337 #ifdef _KERNEL
338 /*
339 * 32 bit versions of ioctl structures
340 */
341
342 typedef struct dsw_config32_s {
343 spcs_s_info32_t status;
344 char master_vol[DSW_NAMELEN];
345 char shadow_vol[DSW_NAMELEN];
346 char bitmap_vol[DSW_NAMELEN];
347 char cluster_tag[DSW_NAMELEN];
348 char group_name[DSW_NAMELEN];
349 int flag;
350 } dsw_config32_t;
351
352 /*
353 * DSW segmented bitmap I/O structure
354 */
355 typedef struct dsw_segment32_s {
356 spcs_s_info32_t status;
357 char shadow_vol[DSW_NAMELEN];
358 uint32_t seg_number;
359 uint32_t shd_bitmap;
360 int shd_size;
361 uint32_t cpy_bitmap;
362 int cpy_size;
363 uint32_t idx_bitmap;
364 int idx_size;
365 } dsw_segment32_t;
366
367 /*
368 * DSW user bitmap structure
369 */
370
371 typedef struct dsw_bitmap32_s {
372 spcs_s_info32_t status;
373 char shadow_vol[DSW_NAMELEN];
374 uint32_t shd_bitmap; /* 32 bit pointer value */
375 uint64_t shd_size;
376 uint64_t copy_size;
377 uint32_t copy_bitmap; /* 32 bit pointer value */
378 } dsw_bitmap32_t;
379
380 typedef struct dsw_ioctl32_s {
381 spcs_s_info32_t status;
382 char shadow_vol[DSW_NAMELEN];
383 int flags;
384 pid_t pid;
385 } dsw_ioctl32_t;
386
387 typedef struct dsw_stat32_s {
388 spcs_s_info32_t status;
389 char shadow_vol[DSW_NAMELEN];
390 int stat;
391 uint64_t size;
392 char overflow_vol[DSW_NAMELEN];
393 uint64_t shdsize;
394 uint64_t shdused;
395 char group_name[DSW_NAMELEN];
396 char cluster_tag[DSW_NAMELEN];
397 uint64_t mtime;
398 } dsw_stat32_t;
399
400 typedef struct dsw_version32_s {
401 spcs_s_info32_t status;
402 int major; /* Major release number */
403 int minor; /* Minor release number */
404 int micro; /* Micro release number */
405 int baseline; /* Baseline revision number */
406 } dsw_version32_t;
407
408 typedef struct dsw_bitsset32_s {
409 spcs_s_info32_t status;
410 char shadow_vol[DSW_NAMELEN];
411 uint64_t tot_size; /* total number of bits in map */
412 uint64_t tot_set; /* number of bitmap bits set */
413 } dsw_bitsset32_t;
414
415 typedef struct dsw_list32_s {
416 spcs_s_info32_t status;
417 int list_size;
418 int list_used;
419 uint32_t list;
420 } dsw_list32_t;
421
422 typedef struct dsw_aioctl32_s {
423 spcs_s_info32_t status;
424 int flags;
425 int count;
426 pid_t pid;
427 char shadow_vol[DSW_NAMELEN]; /* start of list of image sets */
428 } dsw_aioctl32_t;
429
430 typedef struct dsw_copyp32_s {
431 spcs_s_info32_t status;
432 char shadow_vol[DSW_NAMELEN];
433 int copy_unit;
434 int copy_delay;
435 } dsw_copyp32_t;
436
437 typedef struct dsw_ostat32_s {
438 spcs_s_info32_t status;
439 char overflow_vol[DSW_NAMELEN];
440 int drefcnt;
441 uint64_t used;
442 uint64_t unused;
443 uint64_t nchunks;
444 int crefcnt;
445 int flags;
446 int hversion;
447 int hmagic;
448 } dsw_ostat32_t;
449
450 /*
451 * DSW move group structure
452 */
453
454 typedef struct dsw_movegrp32_s {
455 spcs_s_info32_t status;
456 char shadow_vol[DSW_NAMELEN];
457 char new_group[DSW_NAMELEN];
458 } dsw_movegrp32_t;
459
460 #endif /* _KERNEL */
461
462 /* dsw_copy dsw_ioctl_t flag bits */
463 #define CV_BMP_ONLY 0x00000001 /* copy only chunks flagged by bitmap */
464 #define CV_SHD2MST 0x00000002 /* copy shadow to master */
465 #define CV_LOCK_PID 0x00000004 /* On copy/update, lock PIT by PID */
466 #define CV_CLR_BMP 0x00000010 /* clear bits in bit map during copy */
467 #define CV_IS_CLUSTER 0x00000020 /* struct refers to cluster */
468 #define CV_IS_GROUP 0x00000040 /* struct refers to group (cpy/upd) */
469 #define CV_SIBLING 0x00010000 /* internal copy_on_write flag */
470
471 /* nsc_control commands */
472
473 #define II_CONTROL(x) ('I' << 24 | 'I' << 16 | (x)) /* 0x49490000 */
474
475 #define II_PIT_COPY II_CONTROL(1) /* Perform an II Copy */
476 #define II_PIT_UPDATE II_CONTROL(2) /* Perform an II Update */
477 #define II_PIT_ABORT II_CONTROL(3) /* Perform an II Abort */
478 #define II_PIT_WAIT II_CONTROL(4) /* Perform an II Wait */
479 #define II_PIT_PROPS II_CONTROL(5) /* Perform an II Properties */
480
481 #ifdef __cplusplus
482 }
483 #endif
484
485 #endif /* _DSW_H */