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