xref: /titanic_41/usr/src/uts/common/sys/lvm/mdio.h (revision 8eea8e29cc4374d1ee24c25a07f45af132db3499)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYS__MDIO_H
28 #define	_SYS__MDIO_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #include <sys/debug.h>
33 #include <sys/ioctl.h>
34 #include <sys/types.h>
35 #include <sys/int_types.h>
36 #include <sys/dditypes.h>
37 #ifdef _KERNEL
38 #include <sys/lvm/md_mdiox.h>
39 #else /* !_KERNEL */
40 #include <mdiox.h>
41 #endif
42 #include <sys/ddipropdefs.h>
43 #include <sys/hwconf.h>
44 
45 #ifdef	__cplusplus
46 extern "C" {
47 #endif
48 
49 /*
50  * driver version number
51  */
52 #define	MD_DVERSION	0x00040003	/* major.minor */
53 #define	MD_SET_SHIFT	(NBITSMINOR32 - MD_BITSSET)
54 #define	MD_MAXUNITS	(1 << MD_SET_SHIFT)
55 #define	MD_UNIT_MASK	(MD_MAXUNITS - 1)
56 
57 #define	MD_MIN2UNIT(m)	((m) & MD_UNIT_MASK)
58 #define	MD_MIN2SET(m)	((m) >> MD_SET_SHIFT)
59 #define	MD_SID(u)	((u)->c.un_self_id)
60 #define	MD_RECID(u)	((u)->c.un_record_id)
61 #define	MD_STATUS(u)	((u)->c.un_status)
62 #define	MD_PARENT(u)	((u)->c.un_parent)
63 #define	MD_CAPAB(u)	((u)->c.un_capabilities)
64 #define	MD_UN2SET(u)	MD_MIN2SET(MD_SID(u))
65 #define	MD_UL2SET(l)	MD_MIN2SET(MAXMIN32 & ((l)->un_dev))
66 
67 #define	MD_MKMIN(s, u)	((((s) & MD_SETMASK) << MD_SET_SHIFT) | \
68 			((u) & MD_UNIT_MASK))
69 
70 #define	HSP_BITSID	31
71 #define	HSP_SET_SHIFT	(HSP_BITSID - MD_BITSSET)
72 #define	HSP_SET_MASK	(MD_SETMASK << HSP_SET_SHIFT)
73 #define	HSP_SET(hspid)	(((hspid) & HSP_SET_MASK) >> HSP_SET_SHIFT)
74 #define	HSP_ID(hspid)	((hspid) & ~HSP_SET_MASK)
75 #define	MAKE_HSP_ID(setno, id)  (((setno) << HSP_SET_SHIFT) | (id))
76 
77 /*
78  * for did stat ioctl
79  */
80 #define	MD_FIND_INVDID	0x01
81 #define	MD_GET_INVDID	0x02
82 
83 /*
84  * for setting the un_revision
85  */
86 #define	MD_32BIT_META_DEV	0
87 #define	MD_64BIT_META_DEV	1
88 
89 /*
90  * for trans EOF error messages
91  */
92 #define	MD_EOF_TRANS_MSG	"Trans logging has been replaced by UFS" \
93 	" Logging.\nSee mount_ufs(1M). Operation failed.\n"
94 
95 #define	MD_SHORT_EOF_TRANS_MSG	"#Trans logging has been replaced by UFS" \
96 	" Logging.\n#See mount_ufs(1M). Operation failed.\n"
97 
98 #define	MD_EOF_TRANS_WARNING	"Existing Trans devices are not logging; they" \
99 	"\npass data directly to the underlying device.\n"
100 
101 #define	MD_SHORT_EOF_TRANS_WARNING	"#Existing Trans devices are not " \
102 	"logging; they\n#pass data directly to the underlying device.\n"
103 
104 /*
105  * miscname stuff
106  */
107 
108 #define	MD_DRIVERNAMELEN	16
109 #define	MD_SETDRIVERNAME(to, from, setno) \
110 	if ((from) != NULL) \
111 		(void) strcpy((to)->md_driver.md_drivername, (from)); \
112 	(to)->md_driver.md_setno = (setno);
113 
114 
115 #define	MD_GETDRIVERNAME(to, from) \
116 	(void) strcpy((to), (from)->md_driver.md_drivername);
117 
118 #define	MD_PNTDRIVERNAME(from) \
119 	((from)->md_driver.md_drivername)
120 
121 /*
122  * ioctl parameter structures
123  */
124 
125 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
126 #pragma pack(4)
127 #endif
128 typedef struct md_i_driverinfo {
129 	MD_DRIVER
130 	md_error_t	mde;
131 	minor_t		mnum;
132 } md_i_driverinfo_t;
133 
134 typedef struct md_i_getnext {
135 	MD_DRIVER
136 	md_error_t	mde;
137 	minor_or_hsp_t	id;
138 } md_i_getnext_t;
139 
140 typedef struct md_i_getnum {
141 	MD_DRIVER
142 	md_error_t	mde;
143 	int		start;
144 	int		size;
145 	uint64_t	minors;	/* Pointer to minor #'s */
146 } md_i_getnum_t;
147 
148 typedef struct md_i_get {
149 	MD_DRIVER
150 	md_error_t	mde;
151 	minor_or_hsp_t	id;
152 	int		size;
153 	uint64_t	mdp;	/* Contains pointer */
154 } md_i_get_t;
155 
156 typedef struct md_i_reset {
157 	MD_DRIVER
158 	md_error_t	mde;
159 	minor_t		mnum;		/* Unit to clear */
160 	int		force;
161 } md_i_reset_t;
162 
163 /* soft partition reset parameters */
164 typedef struct md_sp_reset {
165 	MD_DRIVER
166 	md_error_t	mde;		/* Error return */
167 	minor_t		mnum;		/* Unit to clear */
168 	int		force;		/* Force reset */
169 	md_parent_t	new_parent;	/* New parent for child component */
170 } md_sp_reset_t;
171 
172 /* soft partition status change parameters */
173 typedef struct md_sp_statusset {
174 	MD_DRIVER
175 	md_error_t	mde;		/* Error return */
176 	int		num_units;	/* Number of units */
177 	int		new_status;	/* New status */
178 	int		size;		/* Array size */
179 	uint64_t	minors;		/* Pointer to array of minor numbers */
180 } md_sp_statusset_t;
181 
182 typedef struct md_sp_update_wm {
183 	MD_DRIVER
184 	md_error_t	mde;		/* Error return */
185 	minor_t		mnum;		/* Unit to update */
186 	uint_t		count;		/* Number of watermarks */
187 	uint64_t	wmp;		/* Pointer to array of watermarks */
188 	uint64_t	osp;		/* Pointer to array of offsets */
189 } md_sp_update_wm_t;
190 
191 typedef struct md_sp_read_wm {
192 	MD_DRIVER
193 	md_error_t	mde;		/* Error return */
194 	md_dev64_t	rdev;		/* Device from which to read */
195 	uint64_t	wmp;		/* Pointer to wm buffer */
196 	xsp_offset_t	offset;		/* Offset of wm */
197 } md_sp_read_wm_t;
198 
199 typedef struct md_set_userflags {
200 	MD_DRIVER
201 	md_error_t	mde;
202 	minor_t		mnum;
203 	uint_t		userflags;
204 } md_set_userflags_t;
205 
206 typedef struct md_stripe_params {
207 	MD_DRIVER
208 	md_error_t	mde;		/* Error return */
209 	minor_t		mnum;
210 	ms_params_t	params;
211 } md_stripe_params_t;
212 
213 typedef struct md_raid_params {
214 	MD_DRIVER
215 	md_error_t	mde;		/* Error return */
216 	minor_t		mnum;
217 	mr_params_t	params;
218 } md_raid_params_t;
219 
220 typedef struct md_mirror_params {
221 	MD_DRIVER
222 	md_error_t	mde;		/* Error return */
223 	minor_t		mnum;
224 	mm_params_t	params;
225 } md_mirror_params_t;
226 
227 typedef struct md_grow_params {
228 	MD_DRIVER
229 	md_error_t	mde;	/* Error return */
230 	minor_t		mnum;	/* Unit to grow */
231 	int		options; /* create a 64 or 32 bit device */
232 	uint64_t	mdp;	/* Optional - pointer to new unit struct */
233 	int		size;	/* Optional - size of new unit struct */
234 	int		nrows;	/* Optional - original number of rows */
235 	int		npar;	/* Optional - number of parents to lock */
236 	uint64_t	par;	/* Optional - pointer to parent units */
237 } md_grow_params_t;
238 
239 /* if the didstat struct changes you will need to change the following macro */
240 typedef struct md_i_didstat {
241 	md_error_t	mde;	/* Error return */
242 	set_t		setno;	/* which set to use */
243 	side_t		side;	/* which side to use */
244 	int		mode;	/* find or get ? */
245 	int		cnt;	/* return number of invalid devid's found */
246 	int		maxsz;	/* return max size of invalid device id */
247 	uint64_t	ctdp;	/* pointer to structure to fill with ctds */
248 } md_i_didstat_t;
249 
250 typedef struct mdnm_params {
251 	md_error_t	mde;		/* Error return */
252 	char		drvnm[MD_MAXDRVNM];  /* drvnm for get/set/rem nm */
253 	major_t		major;		/* major #, (alternative) for get nm */
254 	minor_t		mnum;		/* minor #, for get/set/rem nm */
255 	uint_t		devname_len;	/* Length of device name, for set nm */
256 	uint64_t	devname;	/* Address of device name for set/get */
257 	set_t		setno;		/* Which namespace set to use */
258 	side_t		side;		/* -1 == current side, >0 specified */
259 	mdkey_t		key;		/* 0 == alloc one, else use this key */
260 	mdkey_t		retkey;		/* return key here! */
261 	ushort_t	devid_size;	/* 0 == ret size, else use this one */
262 	uint64_t	devid;		/* pointer to devid, supplied by user */
263 	uint_t		pathname_len;	/* length of pathname */
264 	uint64_t	pathname;	/* address of pathname for update */
265 	md_dev64_t	devt;		/* devt for updating namespace */
266 	ushort_t	minorname_len;	/* length of minor name */
267 	uint64_t	minorname;	/* address of minor name */
268 	uint_t		ref_count;	/* returned n_count */
269 } mdnm_params_t;
270 
271 typedef struct md_getdevs_params {
272 	MD_DRIVER
273 	md_error_t	mde;
274 	minor_t		mnum;
275 	int		cnt;
276 	uint64_t	devs;	/* Pointer to devs */
277 } md_getdevs_params_t;
278 
279 
280 typedef struct md_i_get_tstate {
281 	minor_or_hsp_t	id;
282 	uint_t		tstate;		/* Transient state */
283 	md_error_t	mde;
284 } md_i_get_tstate_t;
285 
286 typedef struct md_set_state_params {
287 	MD_DRIVER
288 	md_error_t	mde;
289 	minor_t		mnum;
290 	uint_t		sm;
291 	uint_t		comp;
292 	uint_t		state;
293 	mddb_recid_t	hs_id;
294 } md_set_state_params_t;
295 
296 typedef struct md_alloc_hotsp_params {
297 	MD_DRIVER
298 	md_error_t	mde;
299 	minor_t		mnum;
300 	uint_t		sm;
301 	uint_t		comp;
302 	mddb_recid_t	hs_id;
303 } md_alloc_hotsp_params_t;
304 
305 typedef struct md_suspend_wr_params {
306 	MD_DRIVER
307 	md_error_t	mde;
308 	minor_t		mnum;
309 } md_suspend_wr_params_t;
310 
311 typedef struct md_mn_req_owner {
312 	minor_t		mnum;		/* Mirror metadevice */
313 	uint_t		flags;		/* Flags (see below) */
314 	md_mn_nodeid_t	owner;		/* New owner of Mirror  */
315 } md_mn_req_owner_t;
316 
317 #define	MD_MN_MM_PREVENT_CHANGE	0x0001	/* Disallow further ownership change */
318 #define	MD_MN_MM_ALLOW_CHANGE	0x0002	/* Allow ownership change */
319 #define	MD_MN_MM_SPAWN_THREAD	0x0004
320 #define	MD_MN_MM_CHOOSE_OWNER	0x0008	/* Choose a resync owner */
321 
322 #define	MD_MN_MM_RESULT		0x80000000	/* Result contained in LSB */
323 #define	MD_MN_MM_RESULT_MASK	0xFFFF		/* Mask for result code	   */
324 #define	MD_MN_MM_RES_OK		0		/* Success */
325 #define	MD_MN_MM_RES_FAIL	1		/* Failure */
326 
327 typedef struct md_set_mmown_params {
328 	MD_DRIVER
329 	md_error_t		mde;
330 	md_mn_req_owner_t	d;	/* New owner */
331 } md_set_mmown_params_t;
332 
333 typedef struct md_mn_own_status {
334 	MD_DRIVER
335 	md_error_t		mde;
336 	minor_t			mnum;
337 	uint_t			flags;	/* See above *_MM_RESULT flags */
338 } md_mn_own_status_t;
339 
340 typedef struct md_mn_poke_hotspares {
341 	MD_DRIVER
342 	md_error_t		mde;
343 } md_mn_poke_hotspares_t;
344 
345 typedef struct md_mn_rs_params {
346 	MD_DRIVER
347 	md_error_t	mde;
348 	int		msg_type;	/* Type of message */
349 	minor_t		mnum;		/* Mirror metadevice */
350 	uint_t		rs_type;	/* Type of resync */
351 	diskaddr_t	rs_start;	/* 1st block of resync range */
352 	diskaddr_t	rs_size;	/* size of resync range */
353 	diskaddr_t	rs_done;	/* amount of resync done so far */
354 	diskaddr_t	rs_2_do;	/* amount still to be done */
355 	md_mn_nodeid_t	rs_originator;	/* Originator of resync message */
356 	char		rs_flags;	/* flags */
357 	char		rs_first_time;	/* set if first resync-next message */
358 	sm_state_t	rs_sm_state[NMIRROR];	/* Submirror state */
359 	sm_flags_t	rs_sm_flags[NMIRROR];	/* Submirror flags */
360 } md_mn_rs_params_t;
361 
362 /* flag values for rs_flags */
363 #define	MD_MN_RS_ERR			0x01 /* Resync err */
364 #define	MD_MN_RS_CLEAR_OPT_NOT_DONE	0x02 /* Optimized resync done */
365 #define	MD_MN_RS_FIRST_RESYNC_NEXT	0x04 /* First RESYNC_NEXT message */
366 
367 typedef struct md_mn_setcap_params {
368 	MD_DRIVER
369 	md_error_t	mde;
370 	minor_t		mnum;
371 	uint_t		sc_set;		/* Capability settings */
372 } md_mn_setcap_params_t;
373 
374 typedef struct md_mkdev_params {
375 	MD_DRIVER
376 	md_error_t	mde;		/* Error return */
377 	minor_t		mnum;
378 } md_mkdev_params_t;
379 
380 /*
381  * Flags to coordinate sending device id between kernel and user space.
382  * To get devid from kernel:
383  *   User calls ioctl with l_devid_flags set to GETSZ flag to get size of
384  *   devid which is returned in the l_devid_sz field if the SZ flag is set.
385  *   Then user allocs that size and sends same ioctl with SPACE flag set
386  *   and l_devid_sz set to alloc'd size.  Kernel either sets the NOSPACE
387  *   flag (if alloc'd space is not big enough) or sets the VALID flag and
388  *   fills in the devid.
389  *
390  * To send devid to kernel:
391  *   User alloc's space for devid, fills in devid, sets (SPACE|VALID|SZ) flags
392  *   and sets size of devid into l_devid_sz field.
393  *
394  * If MDDB_DEVID_SPACE is set, MDDB_DEVID_GETSZ is ignored.
395  * If no flags are set, devid information is ignored.
396  */
397 #define	MDDB_DEVID_SPACE	0x0001	/* l_devid_sz bytes of space alloc'd */
398 #define	MDDB_DEVID_VALID	0x0002	/* kernel has filled in devid */
399 #define	MDDB_DEVID_NOSPACE	0x0004	/* not enough alloc'd space for devid */
400 #define	MDDB_DEVID_GETSZ	0x0008	/* fill in l_devid_sz with devid size */
401 #define	MDDB_DEVID_SZ		0x0010	/* l_devid_sz filled in with devid sz */
402 
403 
404 
405 /*
406  * Maximum number of replicas (or number of locator blocks) in set.
407  */
408 #define	MDDB_NLB		50
409 
410 /*
411  * maximum size of allowable bootlist property string - only used to
412  * read in and write out boolist property strings to conf files.
413  */
414 #define	MDDB_BOOTLIST_MAX_LEN	MAX_HWC_LINESIZE
415 
416 /*
417  * Percentage of free space left in replica during conversion of non-devid
418  * style replica to devid style replica.
419  */
420 #define	MDDB_DEVID_CONV_PERC	5
421 
422 typedef struct mddb_cfg_loc {
423 	dev32_t		l_dev;
424 	daddr32_t	l_blkno;
425 	int		l_flags;
426 	char		l_driver[MD_MAXDRVNM];
427 	minor_t		l_mnum;
428 	int		l_devid_flags;
429 	uint64_t	l_devid;	/* pointer to devid */
430 	int		l_devid_sz;
431 	uint64_t	l_old_devid;
432 	int		l_old_devid_sz;
433 	char		l_minor_name[MDDB_MINOR_NAME_MAX];
434 	char		l_devname[MAXPATHLEN];	/* device name */
435 } mddb_cfg_loc_t;
436 
437 typedef struct mddb_dtag {
438 	md_timeval32_t	dt_tv;
439 	int		dt_id;
440 	set_t		dt_setno;
441 	char		dt_sn[MDDB_SN_LEN];
442 	char		dt_hn[MD_MAX_NODENAME_PLUS_1];
443 } mddb_dtag_t;
444 
445 typedef struct mddb_dtag_lst {
446 	struct mddb_dtag_lst	*dtl_nx;
447 	mddb_dtag_t		dtl_dt;
448 } mddb_dtag_lst_t;
449 
450 typedef struct mddb_dtag_get_parm {
451 	set_t		dtgp_setno;
452 	mddb_dtag_t	dtgp_dt;
453 	md_error_t	dtgp_mde;
454 } mddb_dtag_get_parm_t;
455 
456 typedef struct mddb_dtag_use_parm {
457 	int		dtup_id;
458 	set_t		dtup_setno;
459 	md_error_t	dtup_mde;
460 } mddb_dtag_use_parm_t;
461 
462 typedef struct mddb_accept_parm {
463 	set_t		accp_setno;
464 	md_error_t	accp_mde;
465 } mddb_accept_parm_t;
466 
467 typedef struct mddb_med_parm {
468 	set_t		med_setno;
469 	md_hi_arr_t	med;
470 	md_error_t	med_mde;		/* error return */
471 } mddb_med_parm_t;
472 
473 typedef struct mddb_med_upd_parm {
474 	set_t		med_setno;
475 	md_error_t	med_mde;		/* error return */
476 } mddb_med_upd_parm_t;
477 
478 #define	MED_TE_NM_LEN	64
479 
480 typedef struct mddb_med_t_ent {
481 	char		med_te_nm[MED_TE_NM_LEN];
482 	md_dev64_t	med_te_dev;		/* fixed size dev_t */
483 } mddb_med_t_ent_t;
484 
485 typedef struct mddb_med_t_parm {
486 	md_error_t		med_tp_mde;		/* error return */
487 	int			med_tp_nents;		/* number of entries */
488 	int			med_tp_setup;		/* setup flag */
489 	mddb_med_t_ent_t	med_tp_ents[1];		/* Var. sized array */
490 } mddb_med_t_parm_t;
491 
492 #define	MDDB_SETMASTER_MAGIC	0x53544d41	/* Ascii for STMA */
493 typedef struct mddb_setmaster_config {
494 	md_error_t	c_mde;
495 	set_t		c_setno;
496 	int		c_magic;		/* used to verify ioctl */
497 	int		c_current_host_master;
498 } mddb_setmaster_config_t;
499 
500 /*
501  * Structure used to set/reset/get flags in set structure.
502  */
503 #define	MDDB_SETFLAGS_MAGIC	0x5354464c	/* ascii for STFL */
504 typedef struct mddb_setflags_config {
505 	md_error_t	sf_mde;
506 	set_t		sf_setno;
507 	int		sf_magic;	/* used to verify ioctl */
508 	int		sf_flags;	/* Control flags set/reset/get */
509 	int		sf_setflags;	/* Flag values */
510 } mddb_setflags_config_t;
511 
512 typedef struct mddb_set_node_params {
513 	md_error_t	sn_mde;
514 	set_t		sn_setno;
515 	md_mn_nodeid_t	sn_nodeid;
516 } mddb_set_node_params_t;
517 
518 typedef struct mddb_block_parm {
519 	md_error_t	c_mde;
520 	set_t		c_setno;
521 	int		c_blk_flags;
522 } mddb_block_parm_t;
523 
524 typedef struct mddb_parse_parm {
525 	md_error_t	c_mde;
526 	set_t		c_setno;
527 	int		c_parse_flags;
528 	int		c_lb_flags[MDDB_NLB];
529 } mddb_parse_parm_t;
530 
531 typedef struct mddb_optrec_parm {
532 	md_error_t		c_mde;
533 	set_t			c_setno;
534 	md_replica_recerr_t	c_recerr[2];
535 } mddb_optrec_parm_t;
536 
537 typedef struct mddb_config {
538 	md_error_t	c_mde;			/* error return */
539 	int		c_id;			/* used with getnext locator */
540 	md_splitname	c_devname;		/* contains name or keys */
541 	int		c_dbcnt;		/* number of dbs */
542 	int		c_dbmax;		/* maximum number of dbs */
543 	int		c_flags;
544 	int		c_dbend;		/* size of database */
545 	set_t		c_setno;		/* set number of replica */
546 	int		c_multi_node;		/* set if multi_node set */
547 	side_t		c_sideno;		/* side number of replica */
548 	md_timeval32_t	c_timestamp;		/* creation of set */
549 						/* setname */
550 	char		c_setname[MD_MAX_SETNAME_PLUS_1];
551 	md_hi_arr_t	c_med;			/* Mediator host information */
552 	int		c_spare[14];		/* unused must be zero */
553 	md_dev64_t	c_devt;			/* devt to get/set */
554 	mddb_cfg_loc_t	c_locator;		/* device specific info */
555 } mddb_config_t;
556 
557 #define	c_subcmd	c_spare[0]
558 /*
559  * Subcommands.
560  */
561 #define	MDDB_CONFIG_ABS	1		/* treat c_id as abs index */
562 
563 typedef	struct mddb_optloc {
564 	int	recid;	/* really mddb_recid_t */
565 	int	li[2];
566 } mddb_optloc_t;
567 
568 typedef struct md_gs_stat_parm {
569 	set_t		gs_setno;
570 	uint_t		gs_status;
571 	md_error_t	gs_mde;
572 } md_gs_stat_parm_t;
573 
574 typedef struct {
575 	int	setno;
576 	int	owns_set;
577 } mddb_ownset_t;
578 
579 typedef enum md_rename_operation_t {
580 	MDRNOP_UNK = 0, MDRNOP_RENAME, MDRNOP_EXCHANGE
581 } md_renop_t;
582 
583 typedef struct md_rename {
584 	md_error_t	mde;
585 	md_renop_t	op;
586 	int		revision;
587 	uint_t		flags;
588 	struct {
589 		minor_t	mnum;
590 		key_t	key;
591 	} from, to;
592 } md_rename_t;
593 
594 typedef struct md_regen_param {
595 	MD_DRIVER
596 	md_error_t	mde;
597 	minor_t		mnum;   /* Unit to regenerate parity for */
598 } md_regen_param_t;
599 
600 /* Base ioctl's defined here */
601 #define	MDIOC		('V' << 8)
602 #define	ISMDIOC(c)	(((c) >> 8) == 'V')
603 
604 #define	MD_IOCSET	(MDIOC|0)	/* set config    (metainit) */
605 #define	MD_IOCRESET	(MDIOC|1)	/* reset config  (metaclear) */
606 #define	MD_IOCGET	(MDIOC|2)	/* get config    (metastat) */
607 #define	MD_IOCGROW	(MDIOC|3)	/* grow config   (dyn concat) */
608 #define	MD_IOCCHANGE	(MDIOC|4)	/* change config (metaparam) */
609 #define	MD_IOCSET_NM	(MDIOC|5)	/* set device name */
610 #define	MD_IOCGET_NM	(MDIOC|6)	/* get device name */
611 #define	MD_IOCREM_NM	(MDIOC|7)	/* remove device name */
612 #define	MD_IOCGET_DRVNM	(MDIOC|8)	/* get driver name */
613 #define	MD_IOCGET_NEXT	(MDIOC|9)	/* get next unit id */
614 #define	MD_IOCGET_DEVS	(MDIOC|10)	/* get device list */
615 #define	MD_DB_NEWDEV	(MDIOC|11)	/* add a db replica */
616 #define	MD_DB_USEDEV	(MDIOC|12)	/* patch in a db location */
617 #define	MD_DB_GETDEV	(MDIOC|13)	/* get a db replica */
618 #define	MD_DB_DELDEV	(MDIOC|14)	/* remove a db replica */
619 #define	MD_DB_ENDDEV	(MDIOC|15)	/* get db replica and size */
620 #define	MD_DB_GETDRVNM	(MDIOC|16)	/* get db replica driver name */
621 #define	MD_HALT		(MDIOC|17)	/* halt driver   (metahalt) */
622 #define	MD_GRAB_SET	(MDIOC|18)
623 #define	MD_RELEASE_SET	(MDIOC|20)	/* release a set */
624 #define	MD_IOCSETSYNC	(MDIOC|21)
625 #define	MD_IOCGETSYNC	(MDIOC|22)
626 #define	MD_IOCOFFLINE	(MDIOC|23)
627 #define	MD_IOCONLINE	(MDIOC|24)
628 #define	MD_IOCATTACH	(MDIOC|25)
629 #define	MD_IOCDETACH	(MDIOC|26)
630 #define	MD_IOCREPLACE	(MDIOC|27)
631 #define	MD_DB_USERREQ	(MDIOC|28)
632 #define	MD_DB_GETOPTLOC	(MDIOC|29)	/* get locators for opt resync rec. */
633 #define	MD_DB_OWNSET	(MDIOC|30)	/* Does caller own the set */
634 #define	MD_IOCGETNSET	(MDIOC|31)	/* Get the config'd number sets */
635 #define	MD_IOCNXTKEY_NM	(MDIOC|32)	/* get next key from namespace */
636 #define	MD_DB_NEWSIDE	(MDIOC|33)	/* add another side to the db replica */
637 #define	MD_DB_DELSIDE	(MDIOC|34)	/* delete a side from the db replica */
638 #define	MD_IOCGVERSION	(MDIOC|35)	/* get the driver version */
639 #define	MD_IOCSET_FLAGS	(MDIOC|36)	/* set the userflags of a metadevice */
640 #define	MD_IOCGETNUNITS	(MDIOC|37)	/* Get the config'd number units */
641 #define	MD_IOCNOTIFY	(MDIOC|38)	/* notification */
642 #define	MD_IOCRENAME	(MDIOC|39)	/* (Ex)Change/Rename unit identities */
643 #define	MD_IOCISOPEN	(MDIOC|40)	/* Is metadevice open? */
644 #define	MD_IOCSETREGEN	(MDIOC|41)	/* regen ioctl for raid */
645 #define	MD_MED_GET_LST	(MDIOC|42)	/* Get the mediator list */
646 #define	MD_MED_SET_LST	(MDIOC|43)	/* Set the mediator list */
647 #define	MD_MED_UPD_MED	(MDIOC|44)	/* Have the kernel push mediator data */
648 #define	MD_MED_GET_NMED	(MDIOC|45)	/* Get the max number of mediators */
649 #define	MD_MED_GET_TLEN	(MDIOC|46)	/* Get the mediator transport tbl len */
650 #define	MD_MED_GET_T	(MDIOC|47)	/* Get the mediator transport tbl */
651 #define	MD_MED_SET_T	(MDIOC|48)	/* Set the mediator transport tbl */
652 #define	MD_MED_GET_TAG	(MDIOC|49)	/* Get the list of data tags */
653 #define	MD_MED_USE_TAG	(MDIOC|50)	/* Use one of the data tags */
654 #define	MD_MED_ACCEPT	(MDIOC|51)	/* Accept 1/2 n 1/2 */
655 #define	MD_GET_SETSTAT	(MDIOC|52)	/* Get the s_status for a set */
656 #define	MD_SET_SETSTAT	(MDIOC|53)	/* Set the s_status for a set */
657 #define	MD_IOCPROBE_DEV (MDIOC|54)	/* Force pseudo opens for metadevices */
658 #define	MD_IOCGET_DID	(MDIOC|55)	/* Get device id */
659 #define	MD_IOCUPD_NM	(MDIOC|56)	/* Update namespace */
660 #define	MD_DB_SETDID	(MDIOC|57)	/* Set device id for a locator block */
661 #define	MD_IOCUPD_LOCNM	(MDIOC|58)	/* update locator namespace */
662 #define	MD_SETNMDID	(MDIOC|59)	/* update namespace devid */
663 #define	MD_IOCDID_STAT	(MDIOC|60)	/* get invalid device id's */
664 #define	MD_UPGRADE_STAT	(MDIOC|61)	/* get upgrade status information */
665 #define	MD_IOCGET_NUM	(MDIOC|62)	/* get number of devs and devs */
666 #define	MD_IOCGET_TSTATE (MDIOC|63)	/* get ui_tstate for metastat */
667 #define	MD_SETMASTER	(MDIOC|64)
668 #define	MD_MN_SET_DOORH		(MDIOC|65) /* MN: set the doorhandle */
669 #define	MD_MN_OPEN_TEST		(MDIOC|66) /* MN: check / (un)lock a md */
670 #define	MD_MN_SET_MM_OWNER	(MDIOC|67) /* Set mirror owner */
671 #define	MD_MN_SET_NODEID	(MDIOC|68) /* Set this node's id */
672 #define	MD_MN_SET_STATE		(MDIOC|69) /* Set mirror state */
673 #define	MD_MN_SUSPEND_WRITES	(MDIOC|70) /* Blocks writes */
674 #define	MD_MN_GET_MM_OWNER	(MDIOC|71) /* Get mirror owner */
675 #define	MD_IOCGUNIQMSGID	(MDIOC|72) /* create a unique message ID */
676 #define	MD_MN_MM_OWNER_STATUS 	(MDIOC|73) /* Return status of SET_MM_OWNER */
677 #define	MD_MN_ALLOCATE_HOTSPARE (MDIOC|74) /* Allocate hotspare */
678 #define	MD_MN_SUBMIRROR_STATE 	(MDIOC|75) /* Submirror state change */
679 #define	MD_MN_RESYNC		(MDIOC|76) /* Resync ioctl */
680 #define	MD_MN_SUSPEND_SET	(MDIOC|77) /* suspend IO's for a MN diskset */
681 #define	MD_MN_RESUME_SET	(MDIOC|78) /* resume IO's for a MN diskset */
682 #define	MD_MN_MDDB_PARSE	(MDIOC|79) /* Re-parse portion of MNset mddb */
683 #define	MD_MN_MDDB_BLOCK	(MDIOC|80) /* Block parse or record changes */
684 #define	MD_MN_MDDB_OPTRECFIX	(MDIOC|81) /* Fix optimized record failure */
685 #define	MD_MN_SET_CAP		(MDIOC|82) /* set capability, eg ABR, DMR */
686 #define	MD_MN_CHK_WRT_MDDB	(MDIOC|83) /* New master checks/writes mddb */
687 #define	MD_MN_SET_SETFLAGS	(MDIOC|84) /* Set/reset set flags */
688 #define	MD_MN_GET_SETFLAGS	(MDIOC|85) /* Gets set flags */
689 #define	MD_IOCGET_DIDMIN	(MDIOC|94) /* get the minor name for a devid */
690 #define	MD_IOCIMP_LOAD		(MDIOC|95) /* load the import replicas */
691 #define	MD_IOCSET_DID		(MDIOC|96) /* set the devid of a disk */
692 #define	MD_MN_GET_MIRROR_STATE	(MDIOC|97) /* Get the mirror state MN only */
693 #define	MD_MN_DB_USERREQ	(MDIOC|98) /* MN MT-version of USERREQ */
694 #define	MD_IOCMAKE_DEV		(MDIOC|99) /* create device node for unit */
695 #define	MD_MN_SET_COMMD_RUNNING	(MDIOC|100) /* Commd running or exiting */
696 #define	MD_MN_COMMD_ERR		(MDIOC|101) /* get a message out */
697 #define	MD_MN_SETSYNC		(MDIOC|102) /* multi-threaded MD_IOCSETSYNC */
698 #define	MD_MN_POKE_HOTSPARES	(MDIOC|103) /* poke hotspares */
699 #define	MD_DB_LBINITTIME	(MDIOC|104) /* get the lb_inittime */
700 
701 #define	MDIOC_MISC	(MDIOC|128)	/* misc module base */
702 /* Used in DEBUG_TEST code */
703 #define	MD_MN_CHECK_DOOR1 (MDIOC|126)	/* MN: test door to master */
704 #define	MD_MN_CHECK_DOOR2 (MDIOC|127)	/* MN: test door master-broadcast */
705 
706 #define	NODBNEEDED(c)	((c) == MD_IOCNOTIFY)
707 
708 typedef struct md_resync_ioctl {
709 	MD_DRIVER
710 	md_error_t	mde;
711 	minor_t		ri_mnum;	    /* mirror to sync */
712 	diskaddr_t	ri_copysize;	    /* The size of the copy buffer */
713 	int		ri_zerofill;	    /* Zerofill on lec read error */
714 	int		ri_percent_done;    /* percent done current phase */
715 	int		ri_percent_dirty;
716 	md_riflags_t	ri_flags;
717 } md_resync_ioctl_t;
718 
719 typedef struct md_rrsize {
720 	MD_DRIVER
721 	md_error_t	mde;		/* error return */
722 	minor_t		mnum;		/* unit # to get */
723 	ulong_t		rr_num;		/* Number of resync regions */
724 	ulong_t		rr_blksize;	/* Blocksize of regions */
725 } md_rrsize_t;
726 
727 typedef	enum replace_cmd {
728 	REPLACE_COMP, ENABLE_COMP, FORCE_REPLACE_COMP, FORCE_ENABLE_COMP
729 } replace_cmd_t;
730 
731 typedef struct replace_params {
732 	MD_DRIVER
733 	md_error_t	mde;
734 	replace_cmd_t	cmd;		/* what to do */
735 	minor_t		mnum;		/* mirror to act upon */
736 	md_dev64_t	old_dev;	/* enable/replace use this */
737 	md_dev64_t	new_dev;	/* replace only uses this */
738 	mdkey_t		new_key;	/* replace only uses this */
739 	diskaddr_t	start_blk;	/* start block of new device */
740 	int		has_label;	/* has label flag of new device */
741 	diskaddr_t	number_blks;	/* # of blocks of new device */
742 	uint_t		options;	/* misc options, see MDIOCTL_* below */
743 } replace_params_t;
744 
745 typedef struct md_i_off_on {
746 	MD_DRIVER
747 	md_error_t	mde;
748 	minor_t		mnum;
749 	md_dev64_t	submirror;
750 	int		force_offline;
751 } md_i_off_on_t;
752 
753 typedef struct md_att_struct {
754 	MD_DRIVER
755 	md_error_t	mde;		/* Normal error */
756 	minor_t		mnum;
757 	mdkey_t		key;		/* namespace key of sm */
758 	md_dev64_t	submirror;	/* The device  to attach */
759 	uint_t		options;	/* passed in from the command */
760 } md_att_struct_t;
761 
762 /* possible values for options above */
763 #define	MDIOCTL_DRYRUN		0x0001	/* Only check if operation possible */
764 #define	MDIOCTL_NO_RESYNC_RAID	0x0002	/* if cluster replace we don't */
765 					/*    want to resync */
766 
767 typedef struct md_detach_params {
768 	MD_DRIVER
769 	md_error_t	mde;
770 	minor_t		mnum;		/* mirror to act upon */
771 	md_dev64_t	submirror;
772 	int		force_detach;
773 } md_detach_params_t;
774 
775 /*
776  * Structure for accessing the DB from user land.
777  */
778 typedef struct mddb_userreq {
779 	md_error_t		ur_mde;
780 	mddb_usercmd_t		ur_cmd;
781 	set_t			ur_setno;
782 	mddb_type_t		ur_type;
783 	uint_t			ur_type2;
784 	mddb_recid_t		ur_recid;
785 	mddb_recstatus_t	ur_recstat;
786 	int			ur_size;
787 	uint64_t		ur_data;	/* Pointer to user data */
788 } mddb_userreq_t;
789 
790 /*
791  * Ioctl structure for MD_IOCISOPEN
792  */
793 typedef struct md_isopen {
794 	md_error_t	mde;
795 	md_dev64_t	dev;
796 	int		isopen;
797 } md_isopen_t;
798 
799 /*
800  * Ioctl structure for MD_MN_OPEN_TEST
801  * md_clu_open stands for md check/lock/unlock
802  * Can't use MD_IOCISOPEN, because it's a contracted inteface.
803  */
804 typedef struct md_clu_open {
805 	md_error_t	clu_mde;
806 	md_dev64_t	clu_dev;
807 	enum {	MD_MN_LCU_CHECK = 0,
808 		MD_MN_LCU_LOCK,
809 		MD_MN_LCU_UNLOCK } clu_cmd;
810 	int		clu_isopen;
811 } md_clu_open_t;
812 
813 /*
814  * Structure to push the message out from commd
815  * MAXPATHLEN macro is being overloaded to represent
816  * the line size of 1024 characters. i.e. no path
817  * is being passed.
818  */
819 typedef struct md_mn_commd_err {
820 	int size;
821 	uint64_t md_message; /* pointer to array of chars */
822 } md_mn_commd_err_t;
823 
824 /*
825  * Ioctl structure for MD_IOCPROBE_DEV
826  */
827 
828 #define	TESTNAME_LEN 32
829 
830 #define	PROBE_SEMA(p)	p->probe_sema
831 #define	PROBE_MX(p)	p->probe_mx
832 
833 /*
834  * To categorize user/kernel structures md_probedev is split into two,
835  * one used by user and the other by kernel, thereby hiding the semaphore
836  * /mutex pointer members from user, which should be the appropriate one.
837  */
838 
839 typedef struct md_probedev {
840 	MD_DRIVER
841 	md_error_t	mde;		/* return error status */
842 	int		nmdevs;		/* number of metadevices */
843 	char		test_name[TESTNAME_LEN];
844 	uint64_t	mnum_list;	/* pointer to array of minor numbers */
845 } md_probedev_t;
846 
847 typedef struct md_probedev_impl {
848 	ksema_t		*probe_sema;
849 	kmutex_t	*probe_mx;
850 	md_probedev_t	probe;
851 } md_probedev_impl_t;
852 
853 /*
854  * Ioctl structure for MD_MN_GET_MIRROR_STATE
855  */
856 typedef struct md_mn_get_mir_state {
857 	MD_DRIVER
858 	minor_t		mnum;		/* Unit to obtain submirror info from */
859 } md_mn_get_mir_state_t;
860 
861 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
862 #pragma pack()
863 #endif
864 /*
865  * Per set flags, stored in md_set[n].s_status
866  */
867 #define	MD_SET_HALTED		0x00000001  /* Set is shut down */
868 #define	MD_SET_SNARFED		0x00000002  /* incores built for set db recs */
869 #define	MD_SET_SNARFING		0x00000004  /* incores being built for set */
870 #define	MD_SET_STALE		0x00000008  /* set database not correct */
871 #define	MD_SET_NM_LOADED	0x00000010  /* set namespace is loaded */
872 #define	MD_SET_TAGDATA		0x00000020  /* tagged data detected */
873 #define	MD_SET_ACCOK		0x00000040  /* Accept data is possible */
874 #define	MD_SET_TOOFEW		0x00000080  /* not enough replicas */
875 #define	MD_SET_USETAG		0x00000100  /* A tag is selected, use it */
876 #define	MD_SET_ACCEPT		0x00000200  /* User chose accept 50/50 mode */
877 #define	MD_SET_OWNERSHIP	0x00000400  /* Set is owned */
878 #define	MD_SET_BADTAG		0x00000800  /* DT is not valid */
879 #define	MD_SET_CLRTAG		0x00001000  /* Clear the tags */
880 #define	MD_SET_KEEPTAG		0x00002000  /* Keep the tag */
881 #define	MD_SET_PUSHLB		0x00004000  /* Indicate a LB push is needed */
882 #define	MD_SET_MNSET		0x00008000  /* Set is a multinode diskset */
883 #define	MD_SET_DIDCLUP		0x00010000  /* Set has cleaned up devids */
884 #define	MD_SET_MNPARSE_BLK	0x00020000  /* Do not send parse msgs */
885 #define	MD_SET_MN_NEWMAS_RC	0x00040000  /* Is new master during reconfig */
886 #define	MD_SET_MN_START_RC	0x00080000  /* Start step executed for set */
887 #define	MD_SET_IMPORT		0x00100000  /* Indicate set is importing */
888 #define	MD_SET_MN_MIR_STATE_RC	0x00200000  /* Mirror state gotten for set */
889 #define	MD_SET_HOLD		0x00400000  /* Hold set during release */
890 #define	MD_SET_REPLICATED_IMPORT	0x00800000  /* Set importing RC disk */
891 
892 #define	MD_MNSET_SETNO(setno)	(md_set[setno].s_status & MD_SET_MNSET)
893 
894 /*
895  * See meta_prbits() in SUNWmd/lib/libmeta/meta_print.c for a description of
896  * the way this is used
897  */
898 #define	MD_SET_STAT_BITS "\020\001HALTED\002SNARFED\003SNARFING\004STALE" \
899 			    "\005NM_LOADED\006TAGDATA\007ACCOK\010TOOFEW" \
900 			    "\011USETAG\012ACCEPT\013OWNERSHIP\014BADTAG" \
901 			    "\015CLRTAG\016KEEPTAG\017PUSHLB\020MNSET" \
902 			    "\021DIDCLUP\022MNPARSE_BLK\023MN_NEWMAS_RC" \
903 			    "\024MN_START_RC\025IMPORT\026MIR_STATE_RC" \
904 			    "\027HOLD\030REPLICATED_IMPORT"
905 
906 
907 #ifdef	__cplusplus
908 }
909 #endif
910 
911 #endif	/* _SYS__MDIO_H */
912