xref: /titanic_41/usr/src/uts/common/avs/ns/dsw/dsw.h (revision 37714ae43602c675f9dc59b070bfdf9fa702872c)
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 */
486