xref: /titanic_41/usr/src/head/meta.h (revision 391647d5ee9b25dc5307abb55f583388e08b2dd7)
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	_META_H
27 #define	_META_H
28 
29 #include <limits.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <fcntl.h>
33 #include <errno.h>
34 #include <string.h>
35 #include <unistd.h>
36 #include <libgen.h>
37 #include <locale.h>
38 #include <time.h>
39 #include <assert.h>
40 #include <stdarg.h>
41 #include <signal.h>
42 #include <devid.h>
43 #include <sys/types.h>
44 #include <sys/stat.h>
45 #include <sys/sysmacros.h>
46 #include <sys/mkdev.h>
47 #include <sys/time.h>
48 #include <sys/dkio.h>
49 #include <sys/vtoc.h>
50 #include <sys/efi_partition.h>
51 #include <meta_basic.h>
52 #include <mdiox.h>
53 #include <metamed.h>
54 #include <sys/lvm/mdio.h>
55 #include <sys/lvm/md_mddb.h>
56 #include <sys/lvm/md_sp.h>
57 #include <sys/lvm/mdmn_commd.h>
58 
59 #ifdef	__cplusplus
60 extern "C" {
61 #endif
62 
63 /* debug malloc include */
64 #ifdef	DEBUG_MALLOC
65 #ifdef	_REENTRANT
66 die right now
67 #endif
68 #include <../lib/malloclib/malloc.h>
69 #endif
70 
71 /*
72  * useful macros
73  */
74 #ifndef	min
75 #define	min(x, y)	(((x) < (y)) ? (x) : (y))
76 #endif
77 #ifndef	max
78 #define	max(x, y)	(((x) > (y)) ? (x) : (y))
79 #endif
80 #ifndef	rounddown
81 #define	rounddown(x, y)	(((x) / (y)) * (y))
82 #endif
83 
84 /*
85  * external names
86  */
87 
88 #define	METATAB			"/etc/lvm/md.tab"
89 #define	METACONF		"/etc/lvm/md.cf"
90 #define	METACONFTMP		"/etc/lvm/md.cf.new"
91 #define	META_DBCONF		"/etc/lvm/mddb.cf"
92 #define	META_DBCONFTMP		"/etc/lvm/mddb.cf.new"
93 #define	META_MNSET_NODELIST	"/var/run/nodelist"
94 #define	METALOG			"/etc/lvm/md.log"
95 #define	METALOCK		"/etc/lvm/lock"
96 #define	METADEVPATH		"/etc/lvm/devpath"
97 #define	METALOGENV		"MD_LOG"
98 #define	METAPKGROOT		"/usr"
99 #define	ADMSPECIAL		"/dev/md/admin"
100 
101 #define	MDB_STR			"metadevice state database"
102 #define	META_LONGDISKNAME_STR	"<long disk name>"
103 
104 /* default database size (4MB) */
105 #define	MD_DBSIZE	(8192)
106 
107 /* default Multinode database size (16MB) */
108 #define	MD_MN_DBSIZE	(32768)
109 
110 /* disk label size */
111 #define	VTOC_SIZE	(16)
112 
113 /* EFI geometry data */
114 #define	MD_EFI_FG_HEADS		128
115 #define	MD_EFI_FG_SECTORS	256
116 #define	MD_EFI_FG_RPM		7200
117 #define	MD_EFI_FG_WRI		1
118 #define	MD_EFI_FG_RRI		1
119 
120 /* maximum ctd name size (in # of digits) for printing out */
121 #define	CTD_FORMAT_LEN	6
122 
123 /* Recommend timeout in seconds for RPC client creation. */
124 #define	MD_CLNT_CREATE_TOUT	(60)
125 
126 /*
127  * If event needs to be checked during wait of MD_CLNT_CREATE_TOUT,
128  * spin checking for event and then waiting for MD_CLNT_CREATE_SUBTIMEOUT
129  * seconds until MD_CLNT_CREATE_TOUT seconds are used.
130  */
131 #define	MD_CLNT_CREATE_SUBTIMEOUT	(5)
132 
133 /*
134  * metaclust verbosity levels and what they are for. Messages upto MC_LOG2
135  * will also be logged in syslog.
136  */
137 #define	MC_LOG0		0	/* special class. log messages regardless of */
138 				/* debug level */
139 #define	MC_LOG1		1	/* log standard error messages */
140 #define	MC_LOG2		2	/* log metaclust step level timing messages */
141 #define	MC_LOG3		3	/* log per set level timing messages */
142 				/* intended for use in loops walking mn sets */
143 #define	MC_LOG4		4	/* log per device level timing messages */
144 				/* intended for use in loops walking devices */
145 #define	MC_LOG5		5	/* typically for use in deep nested loops */
146 				/* or in libmeta routines */
147 
148 /*
149  * for meta_print* options
150  */
151 typedef	uint_t	mdprtopts_t;
152 #define	PRINT_SHORT		0x00000001
153 #define	PRINT_SUBDEVS		0x00000002
154 #define	PRINT_HEADER		0x00000004
155 #define	PRINT_DEBUG		0x00000008
156 #define	PRINT_TIMES		0x00000010
157 #define	PRINT_SETSTAT		0x00000020
158 #define	PRINT_SETSTAT_ONLY	0x00000040
159 #define	PRINT_FAST		0x00000080
160 #define	PRINT_DEVID		0x00000100
161 #define	PRINT_LARGEDEVICES	0x00000200
162 #define	PRINT_FN		0x00000400
163 
164 /*
165  * for meta_devadm options
166  */
167 typedef	uint_t  mddevopts_t;
168 #define	DEV_VERBOSE		0x00000001
169 #define	DEV_NOACTION		0x00000002
170 #define	DEV_LOG			0x00000004
171 #define	DEV_RELOAD		0x00000008
172 #define	DEV_UPDATE		0x00000010
173 #define	DEV_LOCAL_SET		0x00000020	/* update only MD_LOCAL_SET */
174 
175 /*
176  * return values for meta_devadm operations
177  */
178 #define	METADEVADM_SUCCESS	0
179 #define	METADEVADM_ERR		1
180 #define	METADEVADM_DEVIDINVALID	2
181 #define	METADEVADM_DSKNAME_ERR	3
182 #define	METADEVADM_DISKMOVE	4
183 
184 /*
185  * return values for the splitname function
186  */
187 #define	METASPLIT_SUCCESS		0
188 #define	METASPLIT_LONGPREFIX		1
189 #define	METASPLIT_LONGDISKNAME		2
190 
191 /*
192  * meta_check* options
193  */
194 typedef	uint_t	mdchkopts_t;
195 #define	MDCHK_ALLOW_MDDB	0x01	/* allows repliica in md's (metainit) */
196 #define	MDCHK_ALLOW_HS		0x02	/* allows hs in multiple hsp's (hs) */
197 #define	MDCHK_ALLOW_LOG		0x04	/* allows sharing of logs (trans) */
198 #define	MDCHK_ALLOW_REPSLICE	0x08	/* allow replica slice to be used */
199 #define	MDCHK_ALLOW_NODBS	0x10	/* no db replicas allowed (metadb) */
200 #define	MDCHK_DRVINSET		0x20	/* drive is in set (metaset) */
201 #define	MDCHK_SET_LOCKED	0x40	/* The set is locked */
202 #define	MDCHK_SET_FORCE		0x80	/* This is a forced operation */
203 
204 /*
205  * meta_check_inuse options
206  */
207 typedef uint_t	mdinuseopts_t;
208 #define	MDCHK_SWAP	0x01		/* check swap & overlap w/swap */
209 #define	MDCHK_DUMP	0x02		/* check dump & overlap w/dump */
210 #define	MDCHK_MOUNTED	0x04		/* check mounted & overlap w/mounted */
211 #define	MDCHK_INUSE	0xff		/* check all */
212 
213 /*
214  * meta* force options
215  */
216 typedef	uint_t	mdforceopts_t;
217 #define	MDFORCE_NONE		0x01	/* no extra force used */
218 #define	MDFORCE_LOCAL		0x02	/* force from metadb command line */
219 #define	MDFORCE_DS		0x04	/* force from metaset library */
220 #define	MDFORCE_SET_LOCKED	0x10	/* The set is locked */
221 
222 
223 /*
224  * meta* options
225  */
226 typedef	uint_t	mdcmdopts_t;
227 #define	MDCMD_DOIT		0x0001	/* really do operation */
228 #define	MDCMD_FORCE		0x0002	/* force operation */
229 #define	MDCMD_PRINT		0x0004	/* print success messages to stdout */
230 #define	MDCMD_RECURSE		0x0008	/* recursive operation */
231 #define	MDCMD_INIT		0x0010	/* init operation */
232 #define	MDCMD_UPDATE		0x0020	/* update sizes used w/o DOIT mostly */
233 #define	MDCMD_NOLOCK		0x0040	/* lock already held, DONT acquire */
234 #define	MDCMD_VERBOSE		0x0100	/* be verbose */
235 #define	MDCMD_USE_WHOLE_DISK	0x0200	/* repartition disk */
236 #define	MDCMD_DIRECT		0x0400	/* extents specified directly */
237 #define	MDCMD_ALLOPTION		0x0800	/* the all option is being used */
238 #define	MDCMD_MN_OPEN_CHECK	0x1000	/* Perform open check on all nodes */
239 
240 /*
241  * meta_tab* definitions
242  */
243 #define	TAB_ARG_ALLOC	5
244 #define	TAB_LINE_ALLOC	10
245 
246 typedef uint_t mdinittypes_t;
247 #define	TAB_UNKNOWN		0x0000
248 #define	TAB_MDDB		0x0001
249 #define	TAB_HSP			0x0002
250 #define	TAB_STRIPE		0x0004
251 #define	TAB_MIRROR		0x0008
252 #define	TAB_RAID		0x0010
253 #define	TAB_TRANS		0x0020
254 #define	TAB_SP			0x0040
255 #define	TAB_MD			(TAB_STRIPE | TAB_MIRROR | TAB_RAID |\
256 					TAB_TRANS | TAB_SP)
257 #define	TAB_MD_HSP		(TAB_MD | TAB_HSP)
258 
259 typedef	struct {
260 	mdinittypes_t	type;
261 	char		*context;
262 	char		*cname;
263 	int		argc;
264 	char		**argv;
265 	size_t		alloc;
266 	uint_t		flags;	/* for application use */
267 } md_tab_line_t;
268 
269 typedef	struct {
270 	char		*filename;
271 	char		*data;
272 	size_t		total;
273 	size_t		nlines;
274 	md_tab_line_t	*lines;
275 	size_t		alloc;
276 } md_tab_t;
277 
278 /*
279  * disk status definitions
280  */
281 typedef struct md_disk_status_list {
282 	struct md_disk_status_list	*next;
283 	mddrivename_t			*drivenamep;
284 	md_error_t			status;
285 } md_disk_status_list_t;
286 
287 /*
288  * module name list used by meta_patch_root & meta_systemfile
289  */
290 struct modname {
291 	char		*name;
292 	struct modname	*next;
293 };
294 
295 /*
296  * list to be used for printing Device Relocation Information
297  */
298 typedef struct mddevid_t {
299 	struct mddevid_t *next;
300 	char *ctdname;
301 	mdkey_t key;
302 } mddevid_t;
303 
304 /*
305  * Multi-Node Diskset List
306  *
307  * we either store the IP address of the private interconnect or its name
308  * in the msl_node_addr member
309  */
310 typedef struct mndiskset_membershiplist {
311 	uint_t				msl_node_id;
312 	md_mnnode_nm_t			msl_node_name;
313 	md_mnnode_nm_t			msl_node_addr;
314 	struct mndiskset_membershiplist	*next;
315 } mndiskset_membershiplist_t;
316 
317 /*
318  * client pool for rpc calls to mdcommd
319  */
320 typedef struct md_mn_client_list {
321 	CLIENT *mcl_clnt;
322 	struct md_mn_client_list *mcl_next;
323 } md_mn_client_list_t;
324 
325 /*
326  * Resync thread manipulation commands.
327  *
328  * The resync thread can now be started, blocked, unblocked or killed.
329  * This typedef specifies the action to be taken by meta_resync.c
330  * routines.
331  */
332 typedef enum {
333 	MD_RESYNC_START = 1,
334 	MD_RESYNC_BLOCK,
335 	MD_RESYNC_UNBLOCK,
336 	MD_RESYNC_KILL,
337 	MD_RESYNC_KILL_NO_WAIT,
338 	MD_RESYNC_FORCE_MNSTART
339 } md_resync_cmd_t;
340 
341 
342 /*
343  * rpc.metad macro definitions.
344  */
345 #define	METAD_SETUP_DR(cmd, id)	\
346 	{				\
347 	req.ur_cmd = cmd;		\
348 	req.ur_setno = MD_LOCAL_SET;	\
349 	req.ur_type = MDDB_USER;	\
350 	req.ur_type2 = MDDB_UR_DR;	\
351 	req.ur_recid = id;		\
352 	}
353 
354 #define	METAD_SETUP_NR(cmd, id)	\
355 	{				\
356 	req.ur_cmd = cmd;		\
357 	req.ur_setno = MD_LOCAL_SET;	\
358 	req.ur_type = MDDB_USER;	\
359 	req.ur_type2 = MDDB_UR_NR;	\
360 	req.ur_recid = id;		\
361 	}
362 
363 #define	METAD_SETUP_SR(cmd, id)	\
364 	{				\
365 	req.ur_cmd = cmd;		\
366 	req.ur_setno = MD_LOCAL_SET;	\
367 	req.ur_type = MDDB_USER;	\
368 	req.ur_type2 = MDDB_UR_SR;	\
369 	req.ur_recid = id;		\
370 	}
371 
372 #define	METAD_SETUP_UR(cmd, type2, id)	\
373 	{				\
374 	req.ur_cmd = cmd;		\
375 	req.ur_setno = MD_LOCAL_SET;	\
376 	req.ur_type = MDDB_USER;	\
377 	req.ur_type2 = type2;		\
378 	req.ur_recid = id;		\
379 	}
380 
381 #define	METAD_SETUP_LR(cmd, setno, id)	\
382 	{				\
383 	req.ur_cmd = cmd;		\
384 	req.ur_setno = setno;	\
385 	req.ur_type = MDDB_USER;	\
386 	req.ur_type2 = MDDB_UR_LR;	\
387 	req.ur_recid = id;		\
388 	}
389 
390 /*
391  * This typedef specifies the signature of a function that
392  * meta_client_create_retry can use to establish an rpc connection.
393  * private is used to pass data from the caller of meta_client_create_retry
394  * to clnt_create_func.
395  */
396 typedef CLIENT *(*clnt_create_func_t)(char *hostname,
397 	void *private,
398 	struct timeval *time_out);
399 
400 /* definition of the table for the different message types */
401 typedef struct md_mn_msg_tbl_entry {
402 	md_mn_msgclass_t	mte_class;
403 	void (*mte_handler)
404 	    (md_mn_msg_t *msg, uint_t flags, md_mn_result_t *res);
405 	int (*mte_smgen)
406 	    (md_mn_msg_t *msg, md_mn_msg_t **msglist);
407 	time_t		mte_timeout; /* seconds before msg times out */
408 	uint_t		mte_retry1; /* nretries in case of class busy */
409 	uint_t		mte_ticks1; /* sleep nticks before retry */
410 	uint_t		mte_retry2; /* nretries in case of comm fail */
411 	uint_t		mte_ticks2; /* sleep nticks before retry */
412 } md_mn_msg_tbl_entry_t;
413 
414 /*
415  * Flags for the take command
416  */
417 #define	TAKE_FORCE	0x0001
418 #define	TAKE_USETAG	0x0002
419 #define	TAKE_USEIT	0x0004
420 #define	TAKE_IMP	0x0008
421 #define	TAKE_RETAKE	0x0010
422 
423 /*
424  * ignore gettext for lint so we check printf args
425  */
426 #ifdef __lint
427 #define	dgettext(d, s)	s
428 #define	gettext(s)	s
429 #endif
430 
431 /*
432  * Defines for enabling/disabling SVM services in SMF.
433  */
434 #define	META_SMF_CORE		0x01
435 #define	META_SMF_DISKSET	0x02
436 #define	META_SMF_MN_DISKSET	0x04
437 #define	META_SMF_ALL		0xFF
438 
439 /*
440  * Defines to send/not_send addition of mddb sidenames to
441  * rpc.mdcommd for MN disksets.
442  */
443 #define	DB_ADDSIDENMS_NO_BCAST	0
444 #define	DB_ADDSIDENMS_BCAST	1
445 
446 /*
447  * Defines and structures to support rpc.mdcommd.
448  * RPC routines in rpc.metad will be used to suspend, resume
449  * and reinitialize the rpc.mdcommd running on that node.
450  * These actions are needed when the nodelist is changing.
451  */
452 #define	COMMDCTL_SUSPEND	1
453 #define	COMMDCTL_RESUME		2
454 #define	COMMDCTL_REINIT		3
455 
456 /*
457  * Defines used when joining a node to a MN diskset.
458  * A MN diskset is stale if < 50% mddbs are available when the first node
459  * joins the set.  A MN diskset is stale when 50% mddbs are available when
460  * the first node joins the set if the mediator is unable to provide an
461  * extra vote.
462  * Once a MN set is marked stale, it stays in the stale state (even if > 50%
463  * mddbs are available) until all nodes are withdrawn from the diskset.
464  * Any new nodes joining a stale MN diskset are marked stale regardless of
465  * the availability of mddbs in order to keep the diskset consistent across
466  * all nodes.
467  *
468  * If a reconfig cycle is underway, set the reconfig flag so that rpc.metad
469  * clnt_locks are not enforced.  Since the reconfig cycle has locked out the
470  * meta* commands, this is safe to do.
471  */
472 #define	MNSET_IS_STALE		1	/* Is MN set stale? */
473 #define	MNSET_IN_RECONFIG	2	/* Is MN set in reconfig? */
474 
475 /*
476  * Structure used during reconfig step2 to aid in sychronization
477  * of the drives in a diskset.
478  */
479 typedef struct md_mnsr_node {
480 	md_mnset_record		*mmn_mnsr;
481 	md_mnnode_nm_t		mmn_nodename;
482 	int			mmn_numdrives;
483 	md_drive_desc		*mmn_dd;
484 	struct md_mnsr_node	*mmn_next;
485 } md_mnsr_node_t;
486 
487 
488 /*
489  * meta events definitions ("meta_notify.h")
490  */
491 
492 /*
493  * event flags
494  * meta_notify_createq(),	(EXISTERR, PERMANENT)
495  * meta_notify_getev(),		(WAIT)
496  * meta_notify_getevlist()	(WAIT)
497  */
498 #define	EVFLG_WAIT	0x00000001	/* block until events are pending */
499 #define	EVFLG_EXISTERR	0x00000002	/* if q exists, return an error */
500 #define	EVFLG_PERMANENT	0x00000004	/* queue persists after process exit */
501 
502 /*
503  * events are always associated with an underlying object
504  * This object is of one of the following types.
505  */
506 typedef enum md_ev_objtype_t {
507 	EVO_EMPTY	= 0,
508 	EVO_METADEV,
509 	EVO_MIRROR,
510 	EVO_STRIPE,
511 	EVO_RAID5,
512 	EVO_TRANS,
513 	EVO_REPLICA,
514 	EVO_HSP,
515 	EVO_HS,
516 	EVO_SET,
517 	EVO_DRIVE,
518 	EVO_HOST,
519 	EVO_MEDIATOR,
520 	EVO_UNSPECIFIED,
521 	EVO_LAST
522 } ev_obj_t;
523 
524 /*
525  * Specific events are sent upon state changes
526  * in the underlying devices or when sent by
527  * user applications. These events have a unique
528  * type. These types map to kernel event types (sys/md_notify.h)
529  *
530  * When updating these UPDATE THE TABLE in lib/config/config.c
531  */
532 typedef enum md_ev_id_t {
533 	EV_UNK = 0,
534 	EV_EMPTY,
535 	EV_CREATE,
536 	EV_DELETE,
537 	EV_ADD,
538 	EV_REMOVE,
539 	EV_REPLACE,
540 	EV_GROW,
541 	EV_RENAME_SRC,
542 	EV_RENAME_DST,
543 	EV_MEDIATOR_ADD,
544 	EV_MEDIATOR_DELETE,
545 	EV_HOST_ADD,
546 	EV_HOST_DELETE,
547 	EV_DRIVE_ADD,
548 	EV_DRIVE_DELETE,
549 	EV_INIT_START,
550 	EV_INIT_FAILED,
551 	EV_INIT_FATAL,
552 	EV_INIT_SUCCESS,
553 	EV_IOERR,
554 	EV_ERRED,
555 	EV_LASTERRED,
556 	EV_OK,
557 	EV_ENABLE,
558 	EV_RESYNC_START,
559 	EV_RESYNC_FAILED,
560 	EV_RESYNC_SUCCESS,
561 	EV_RESYNC_DONE,
562 	EV_HOTSPARED,
563 	EV_HS_FREED,
564 	EV_HS_CHANGED,
565 	EV_TAKEOVER,
566 	EV_RELEASE,
567 	EV_OPEN_FAIL,
568 	EV_OFFLINE,
569 	EV_ONLINE,
570 	EV_GROW_PENDING,
571 	EV_DETACH,
572 	EV_DETACHING,
573 	EV_ATTACH,
574 	EV_ATTACHING,
575 	EV_CHANGE,
576 	EV_EXCHANGE,
577 	EV_REGEN_START,
578 	EV_REGEN_DONE,
579 	EV_REGEN_FAILED,
580 	EV_USER,
581 	EV_NOTIFY_LOST,
582 	EV_LAST
583 } evid_t;
584 
585 #define	EV_ALLOBJS	(~0ULL)
586 #define	EV_ALLSETS	((set_t)(~0))
587 
588 #if !defined(_KERNEL)
589 
590 #define	NOTIFY_MD(tag, set, dev, ev)					\
591 	(void) meta_notify_sendev((tag), (set), (dev), (ev))
592 
593 #define	SE_NOTIFY(se_class, se_subclass, tag, set, dev)			\
594 	meta_svm_sysevent((se_class), (se_subclass), (tag), (set), (dev))
595 
596 #endif /* _KERNEL */
597 
598 typedef struct md_ev {
599 	ev_obj_t	obj_type;
600 	set_t		setno;
601 	evid_t		ev;
602 	u_longlong_t	obj;	/* usually md_dev64_t or hsp id */
603 	u_longlong_t	uev;	/* for (EV_USER) user-defined events */
604 } md_ev_t;
605 
606 typedef struct md_evlist {
607 	struct md_evlist	*next;
608 	md_ev_t			*evp;
609 } md_evlist_t;
610 
611 /* end of meta event definitions ("meta_notify.h") */
612 
613 typedef struct md_im_names {
614 	int	min_count;
615 	char	**min_names;
616 } md_im_names_t;
617 
618 /* Values for replica info status */
619 #define	MD_IM_REPLICA_SCANNED	(0x01)
620 #define	MD_IM_REPLICA_VALID	(0x02)
621 
622 typedef struct md_im_replica_info {
623 	struct md_im_replica_info	*mir_next;
624 	int				mir_status;
625 	int				mir_flags;
626 	daddr32_t			mir_offset;
627 	daddr32_t			mir_length;
628 	md_timeval32_t			mir_timestamp;
629 } md_im_replica_info_t;
630 
631 typedef struct md_im_drive_info {
632 	struct md_im_drive_info		*mid_next; /* next drive in this set */
633 	mddrivename_t			*mid_dnp;
634 	void 				*mid_devid;
635 	void				*mid_o_devid;
636 	int				mid_devid_sz;
637 	int				mid_o_devid_sz;
638 	char				mid_minor_name[MDDB_MINOR_NAME_MAX];
639 	minor_t				mid_mnum;
640 	int				mid_available;
641 	md_timeval32_t			mid_setcreatetimestamp;
642 	char				*mid_driver_name;
643 	char				*mid_devname;
644 	md_im_replica_info_t		*mid_replicas;
645 	int				overlapped_disk;
646 	struct md_im_drive_info		*overlap; /* chain of overlap disks */
647 } md_im_drive_info_t;
648 
649 /* Values for mid_available */
650 #define	MD_IM_DISK_AVAILABLE		0x00
651 #define	MD_IM_DISK_NOT_AVAILABLE	0x01
652 
653 /* Values for set descriptor flags */
654 #define	MD_IM_SET_INVALID	0x10
655 #define	MD_IM_SET_REPLICATED	0x20
656 
657 /* Values for mis_partial */
658 #define	MD_IM_COMPLETE_DISKSET	0x04
659 #define	MD_IM_PARTIAL_DISKSET	0x08
660 
661 typedef struct md_im_set_desc {
662 	struct md_im_set_desc		*mis_next;
663 	int				mis_flags;
664 	int				mis_oldsetno;
665 	md_im_drive_info_t		*mis_drives;
666 	int				mis_active_replicas;
667 	int				mis_partial;
668 } md_im_set_desc_t;
669 
670 /* meta_admin.c */
671 extern	int		open_admin(md_error_t *ep);
672 extern	int		close_admin(md_error_t *ep);
673 extern	int		meta_dev_ismeta(md_dev64_t dev);
674 extern	int		meta_get_nunits(md_error_t *ep);
675 extern	md_dev64_t	metamakedev(minor_t mnum);
676 
677 /* meta_attach.c */
678 extern	int		meta_concat_generic(mdsetname_t *sp, mdname_t *namep,
679 			    u_longlong_t big_or_little, md_error_t *ep);
680 extern	int		meta_concat_parent(mdsetname_t *sp, mdname_t *childnp,
681 			    md_error_t *ep);
682 
683 /* meta_check.c */
684 extern	int		meta_check_inuse(mdsetname_t *sp, mdname_t *np,
685 			    mdinuseopts_t inuse_flag, md_error_t *ep);
686 extern	int		meta_check_driveinset(mdsetname_t *sp,
687 			    mddrivename_t *dnp, md_error_t *ep);
688 extern	int		meta_check_drivemounted(mdsetname_t *sp,
689 			    mddrivename_t *dnp, md_error_t *ep);
690 extern	int		meta_check_driveswapped(mdsetname_t *sp,
691 			    mddrivename_t *dnp, md_error_t *ep);
692 extern	int		meta_check_samedrive(mdname_t *np1, mdname_t *np2,
693 			    md_error_t *ep);
694 extern	int		meta_check_overlap(char *uname, mdname_t *np1,
695 			    diskaddr_t slblk1, diskaddr_t nblks1, mdname_t *np2,
696 			    diskaddr_t slblk2, diskaddr_t nblks2,
697 			    md_error_t *ep);
698 extern	int		meta_check_inmeta(mdsetname_t *sp, mdname_t *np,
699 			    mdchkopts_t options, diskaddr_t slblk,
700 			    diskaddr_t nblks,
701 			    md_error_t *ep);
702 extern	int		meta_check_inset(mdsetname_t *sp, mdname_t *np,
703 			    md_error_t *ep);
704 extern  int		meta_check_root(md_error_t *ep);
705 
706 
707 /* meta_db.c */
708 extern	char		*meta_devid_encode_str(ddi_devid_t devid,
709 			    char *minor_name);
710 extern	void		meta_devid_encode_str_free(char *devidstr);
711 extern	int		meta_devid_decode_str(char *devidstr,
712 			    ddi_devid_t *devidp, char **minor_namep);
713 extern	int		meta_check_inreplica(mdsetname_t *sp, mdname_t *np,
714 			    diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep);
715 extern	int		meta_check_replica(mdsetname_t *sp, mdname_t *np,
716 			    mdchkopts_t options, diskaddr_t slblk,
717 			    diskaddr_t nblks, md_error_t *ep);
718 extern	int		meta_db_addsidenms(mdsetname_t *sp, mdname_t *np,
719 			    daddr_t blkno, int bcast, md_error_t *ep);
720 extern	int		meta_db_delsidenm(mdsetname_t *sp, side_t sideno,
721 			    mdname_t *np, daddr_t blkno, md_error_t *ep);
722 extern	int		meta_db_patch(char *sname, char *cname, int patch,
723 			    md_error_t *ep);
724 extern	int		meta_db_attach(mdsetname_t *sp, mdnamelist_t *db_nlp,
725 			    mdchkopts_t options, md_timeval32_t *timeval,
726 			    int dbcnt, int dbsize, char *sysfilename,
727 			    md_error_t *ep);
728 extern	int		meta_db_detach(mdsetname_t *sp, mdnamelist_t *db_nlp,
729 			    mdforceopts_t force, char *sysfilename,
730 			    md_error_t *ep);
731 extern	void		metafreereplicalist(md_replicalist_t *rlp);
732 extern	int		metareplicalist(mdsetname_t *sp, int flags,
733 			    md_replicalist_t **rlpp, md_error_t *ep);
734 extern	void		meta_sync_db_locations(mdsetname_t *sp,
735 			    md_error_t *ep);
736 extern	int		meta_setup_db_locations(md_error_t *ep);
737 extern	daddr_t		meta_db_minreplica(mdsetname_t *sp, md_error_t *ep);
738 extern	int		meta_get_replica_names(mdsetname_t *,
739 			    mdnamelist_t **, int options, md_error_t *);
740 extern	void		meta_mkdummymaster(mdsetname_t *sp, int fd,
741 			    daddr_t firstblk);
742 extern md_timeval32_t	meta_get_lb_inittime(mdsetname_t *sp, md_error_t *ep);
743 
744 /* meta_db_balance.c */
745 extern	int		meta_db_balance(mdsetname_t *sp, md_drive_desc *opdd,
746 			    md_drive_desc *curdd, daddr_t dbsize,
747 			    md_error_t *ep);
748 
749 /* metadevstamp.c */
750 extern 	int		getdevstamp(mddrivename_t *dnp, time_t *stamp,
751 			    md_error_t *ep);
752 extern 	int		setdevstamp(mddrivename_t *dnp, time_t *stamp,
753 			    md_error_t *ep);
754 
755 /* meta_error.c */
756 extern	int		metaioctl(int cmd, void *data, md_error_t *ep,
757 			    char *name);
758 extern	void		md_logpfx(FILE *fp);
759 /* PRINTFLIKE2 */
760 extern	char		*mde_sperror(md_error_t *mdep, const char *fmt, ...);
761 /* PRINTFLIKE2 */
762 extern	void		mde_perror(md_error_t *mdep, const char *fmt, ...);
763 /* PRINTFLIKE1 */
764 extern	void		md_perror(const char *fmt, ...);
765 /* PRINTFLIKE1 */
766 extern	void		md_eprintf(const char *fmt, ...);
767 extern	void		meta_mc_log(int level, const char *fmt, ...);
768 
769 /* meta_getdevs.c */
770 extern	minor_t		meta_getminor(md_dev64_t dev64);
771 extern	major_t		meta_getmajor(md_dev64_t dev64);
772 extern	md_dev64_t	meta_expldev(md_dev64_t dev);
773 extern	dev32_t		meta_cmpldev(md_dev64_t dev64);
774 
775 extern	int		meta_fix_compnames(mdsetname_t *sp,
776 			    mdname_t *namep, md_dev64_t dev, md_error_t *ep);
777 extern	int		meta_getdevs(mdsetname_t *sp, mdname_t *namep,
778 			    mdnamelist_t **nlpp, md_error_t *ep);
779 extern	int		meta_getalldevs(mdsetname_t *sp, mdnamelist_t **nlpp,
780 			    int check_db, md_error_t *ep);
781 extern	int		meta_getvtoc(int fd, char *devname,
782 			    struct vtoc *vtocbufp, int *partno,
783 			    md_error_t *ep);
784 extern	int		meta_setvtoc(int fd, char *devname,
785 			    struct vtoc *vtocbufp, md_error_t *ep);
786 extern	int		meta_setmdvtoc(int fd, char *devname,
787 			    mdvtoc_t *mdvtocbufp, md_error_t *ep);
788 extern	int		meta_get_names(char *drivername, mdsetname_t *sp,
789 			    mdnamelist_t **nlpp, mdprtopts_t options,
790 			    md_error_t *ep);
791 extern	int		meta_deviceid_to_nmlist(char *search_path,
792 			    ddi_devid_t devid, char *minor_name,
793 			    devid_nmlist_t **retlist);
794 
795 /* meta_hotspares.c */
796 extern	int		meta_get_hsp_names(mdsetname_t *sp,
797 			    mdhspnamelist_t **hspnlpp, int options,
798 			    md_error_t *ep);
799 extern	void		meta_free_hsp(md_hsp_t *hspp);
800 extern	void		meta_invalidate_hsp(mdhspname_t *hspnp);
801 extern	md_hsp_t	*meta_get_hsp(mdsetname_t *sp, mdhspname_t *hspnp,
802 			    md_error_t *ep);
803 extern	md_hsp_t	*meta_get_hsp_common(mdsetname_t *sp,
804 			    mdhspname_t *hspnp, int fast, md_error_t *ep);
805 extern	int		meta_check_inhsp(mdsetname_t *sp, mdname_t *np,
806 			    diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep);
807 extern	int		meta_check_hotspare(mdsetname_t *sp, mdname_t *np,
808 			    md_error_t *ep);
809 extern	char		*hs_state_to_name(md_hs_t *hsp,
810 			    md_timeval32_t *tvp);
811 extern	int		meta_hsp_print(mdsetname_t *sp, mdhspname_t *hspnp,
812 			    mdnamelist_t **nlpp, char *fname, FILE *fp,
813 			    mdprtopts_t options, md_error_t *ep);
814 extern	int		metachkhsp(mdsetname_t *sp, mdhspname_t *hspnp,
815 			    md_error_t *ep);
816 extern	int		meta_hs_add(mdsetname_t *sp, mdhspname_t *hspnp,
817 			    mdnamelist_t *nlp, mdcmdopts_t options,
818 			    md_error_t *ep);
819 extern	int		meta_hs_delete(mdsetname_t *sp, mdhspname_t *hspnp,
820 			    mdnamelist_t *nlp, mdcmdopts_t options,
821 			    md_error_t *ep);
822 extern	int		meta_hs_replace(mdsetname_t *sp, mdhspname_t *hspnp,
823 			    mdname_t *oldnp, mdname_t *newnp,
824 			    mdcmdopts_t options, md_error_t *ep);
825 extern	int		meta_hs_enable(mdsetname_t *sp, mdnamelist_t *nlp,
826 			    mdcmdopts_t options, md_error_t *ep);
827 extern	int		meta_check_hsp(mdsetname_t *sp, md_hsp_t *hspp,
828 			    mdcmdopts_t options, md_error_t *ep);
829 extern	int		meta_create_hsp(mdsetname_t *sp, md_hsp_t *hspp,
830 			    mdcmdopts_t options, md_error_t *ep);
831 extern	int		meta_init_hsp(mdsetname_t **spp,
832 			    int argc, char *argv[], mdcmdopts_t options,
833 			    md_error_t *ep);
834 extern	int		meta_hsp_reset(mdsetname_t *sp, mdhspname_t *hspnp,
835 			    mdcmdopts_t options, md_error_t *ep);
836 
837 /* meta_init.c */
838 extern	int		parse_interlace(char *uname, char *name,
839 			    diskaddr_t *interlacep, md_error_t *ep);
840 extern	int		meta_cook_syntax(md_error_t *ep,
841 			    md_void_errno_t errcode, char *uname,
842 			    int argc, char *argv[]);
843 extern	int		meta_setup_geom(md_unit_t *md, mdname_t *np,
844 			    mdgeom_t *geomp, uint_t write_reinstruct,
845 			    uint_t read_reinstruct, uint_t round_cyl,
846 			    md_error_t *ep);
847 extern	int		meta_adjust_geom(md_unit_t *md, mdname_t *np,
848 			    uint_t write_reinstruct, uint_t read_reinstruct,
849 			    uint_t round_cyl, md_error_t *ep);
850 extern	int		meta_init_name(mdsetname_t **spp, int argc,
851 			    char *argv[], char *cname, mdcmdopts_t options,
852 			    md_error_t *ep);
853 extern	int		meta_check_devicesize(diskaddr_t total_blocks);
854 extern	int		meta_init_make_device(mdsetname_t **spp, char *uname,
855 			    md_error_t *ep);
856 extern mdinittypes_t	meta_get_init_type(int argc, char *argv[]);
857 
858 /* meta_mdcf.c */
859 extern	int		meta_update_md_cf(mdsetname_t *sp, md_error_t *ep);
860 
861 /* meta_med.c */
862 extern	int		meddstealerror(md_error_t *ep, med_err_t *medep);
863 extern	int		clnt_med_null(char *hostname, md_error_t *ep);
864 extern	int		clnt_med_upd_data(md_h_t *mdhp, mdsetname_t *sp,
865 			    med_data_t *meddp, md_error_t *ep);
866 extern	int		clnt_med_get_data(md_h_t *mdhp, mdsetname_t *sp,
867 			    med_data_t *meddp, md_error_t *ep);
868 extern	int		clnt_med_get_rec(md_h_t *mdhp, mdsetname_t *sp,
869 			    med_rec_t *medrp, md_error_t *ep);
870 extern	int		clnt_med_upd_rec(md_h_t *mdhp, mdsetname_t *sp,
871 			    med_rec_t *medrp, md_error_t *ep);
872 extern	int		clnt_med_hostname(char *hostname, char **ret_hostname,
873 			    md_error_t *ep);
874 extern	int		clnt_user_med_upd_data(md_h_t *mdhp, bool_t obandiskset,
875 			    char *setname, uint_t setnum, med_data_t *meddp,
876 			    md_error_t *ep);
877 extern	int		clnt_user_med_get_data(md_h_t *mdhp, bool_t obandiskset,
878 			    char *setname, uint_t setnum, med_data_t  *meddp,
879 			    md_error_t *ep);
880 
881 extern	int		meta_med_hnm2ip(md_hi_arr_t *mp, md_error_t *ep);
882 extern	int		meta_h2hi(md_h_arr_t *mdhp, md_hi_arr_t *mdhip,
883 			    md_error_t *ep);
884 extern	int		meta_hi2h(md_hi_arr_t *mdhip, md_h_arr_t *mdhp,
885 			    md_error_t *ep);
886 extern	int		setup_med_cfg(mdsetname_t *sp, mddb_config_t *cp,
887 			    int force, md_error_t *ep);
888 extern	int		meta_mediator_info_from_file(char *sname, int verbose,
889 			    md_error_t *ep);
890 
891 /* meta_mem.c */
892 #ifdef	_DEBUG_MALLOC_INC
893 extern	void		*_Malloc(char *file, int line, size_t s);
894 extern	void		*_Zalloc(char *file, int line, size_t s);
895 extern	void		*_Realloc(char *file, int line, void *p, size_t s);
896 extern	void		*_Calloc(char *file, int line, size_t n, size_t s);
897 extern	char		*_Strdup(char *file, int line, char *p);
898 extern	void		_Free(char *file, int line, void *p);
899 #define	Malloc(s)	_Malloc(__FILE__, __LINE__, (s))
900 #define	Zalloc(s)	_Zalloc(__FILE__, __LINE__, (s))
901 #define	Realloc(p, s)	_Realloc(__FILE__, __LINE__, (p), (s))
902 #define	Calloc(n, s)	_Calloc(__FILE__, __LINE__, (n), (s))
903 #define	Strdup(p)	_Strdup(__FILE__, __LINE__, (p))
904 #define	Free(p)		_Free(__FILE__, __LINE__, (p))
905 #else	/* ! _DEBUG_MALLOC_INC */
906 extern	void		*Malloc(size_t s);
907 extern	void		*Zalloc(size_t s);
908 extern	void		*Realloc(void *p, size_t s);
909 extern	void		*Calloc(size_t n, size_t s);
910 extern	char		*Strdup(char *p);
911 extern	void		Free(void *p);
912 #endif	/* ! _DEBUG_MALLOC_INC */
913 
914 /* meta_metad.c */
915 extern	int		clnt_adddrvs(char *hostname, mdsetname_t *sp,
916 			    md_drive_desc *dd, md_timeval32_t timestamp,
917 			    ulong_t genid, md_error_t *ep);
918 extern	int		clnt_addhosts(char *hostname, mdsetname_t *sp,
919 			    int node_c, char **node_v, md_error_t *ep);
920 extern	int		clnt_update_namespace(char *hostname, mdsetname_t *sp,
921 			    side_t side, mddrivename_t *dnp, char *newname,
922 			    md_error_t *ep);
923 extern	int		clnt_add_drv_sidenms(char *hostname, char *this_host,
924 			    mdsetname_t *sp, md_set_desc *sd, int node_c,
925 			    char **node_v, md_error_t *ep);
926 extern	int		clnt_createset(char *hostname, mdsetname_t *sp,
927 			    md_node_nm_arr_t nodes, md_timeval32_t timestamp,
928 			    ulong_t genid, md_error_t *ep);
929 extern	int		clnt_mncreateset(char *hostname, mdsetname_t *sp,
930 			    md_mnnode_desc *nodelist, md_timeval32_t timestamp,
931 			    ulong_t genid, md_node_nm_t master_nodenm,
932 			    int master_nodeid, md_error_t *ep);
933 extern	int		clnt_joinset(char *hostname, mdsetname_t *sp,
934 			    int flags, md_error_t *ep);
935 extern	int		clnt_withdrawset(char *hostname, mdsetname_t *sp,
936 			    md_error_t *ep);
937 extern	int		clnt_deldrvs_by_devid(char *hostname, mdsetname_t *sp,
938 			    md_drive_desc *dd, md_error_t *ep);
939 extern	int		clnt_deldrvs(char *hostname, mdsetname_t *sp,
940 			    md_drive_desc *dd, md_error_t *ep);
941 extern	int		clnt_delhosts(char *hostname, mdsetname_t *sp,
942 			    int node_c, char **node_v, md_error_t *ep);
943 extern	int		clnt_delset(char *hostname, mdsetname_t *sp,
944 			    md_error_t *ep);
945 extern	int		clnt_del_drv_sidenms(char *hostname, mdsetname_t *sp,
946 			    md_error_t *ep);
947 extern	int		clnt_devinfo(char *hostname, mdsetname_t *sp,
948 			    mddrivename_t *dp, md_dev64_t *ret_dev,
949 			    time_t *ret_timestamp, md_error_t *ep);
950 extern	int		clnt_devid(char *hostname, mdsetname_t *sp,
951 			    mddrivename_t *dp, char **ret_encdevid,
952 			    md_error_t *ep);
953 extern	int		clnt_devinfo_by_devid(char *hostname, mdsetname_t *sp,
954 			    char *devidstr, md_dev64_t *retdev,
955 			    char *orig_devname, char **ret_devname,
956 			    char **ret_driver, md_error_t *ep);
957 extern	int		clnt_drvused(char *hostname, mdsetname_t *sp,
958 			    mddrivename_t *dp, md_error_t *ep);
959 extern	void		free_sr(md_set_record *sr);
960 extern	int		clnt_getset(char *hostname, char *setname, set_t setno,
961 			    md_set_record **sr, md_error_t *ep);
962 extern	int		clnt_mngetset(char *hostname, char *setname,
963 			    set_t setno, md_mnset_record **mnsr,
964 			    md_error_t *ep);
965 extern	int		clnt_hostname(char *hostname, char **ret_hostname,
966 			    md_error_t *ep);
967 extern	int		clnt_nullproc(char *hostname, md_error_t *ep);
968 extern	int		clnt_ownset(char *hostname, mdsetname_t *sp,
969 			    int *ret_bool, md_error_t *ep);
970 extern	int		clnt_setnameok(char *hostname, mdsetname_t *sp,
971 			    int *ret_bool, md_error_t *ep);
972 extern	int		clnt_setnumbusy(char *hostname, set_t setno,
973 			    int *ret_bool, md_error_t *ep);
974 extern	int		clnt_upd_dr_dbinfo(char *hostname, mdsetname_t *sp,
975 			    md_drive_desc *dd, md_error_t *ep);
976 extern	int		clnt_stimeout(char *hostname, mdsetname_t *sp,
977 			    mhd_mhiargs_t *mhiargsp, md_error_t *ep);
978 extern	int		clnt_gtimeout(char *hostname, mdsetname_t *sp,
979 			    mhd_mhiargs_t *ret_mhiargs, md_error_t *ep);
980 extern	int		clnt_upd_dr_flags(char *hostname, mdsetname_t *sp,
981 			    md_drive_desc *dd, uint_t new_flags,
982 			    md_error_t *ep);
983 extern	int		clnt_enable_sr_flags(char *hostname, mdsetname_t *sp,
984 			    uint_t new_flags, md_error_t *ep);
985 extern	int		clnt_disable_sr_flags(char *hostname, mdsetname_t *sp,
986 			    uint_t new_flags, md_error_t *ep);
987 extern	int		clnt_upd_sr_flags(char *hostname, mdsetname_t *sp,
988 			    uint_t new_flags, md_error_t *ep);
989 extern	int		clnt_upd_nr_flags(char *hostname, mdsetname_t *sp,
990 			    md_mnnode_desc *nd, uint_t flag_action,
991 			    uint_t flags, md_error_t *ep);
992 extern	int		clnt_unlock_set(char *hostname, md_setkey_t *cl_sk,
993 			    md_error_t *ep);
994 extern	int		clnt_lock_set(char *hostname, mdsetname_t *sp,
995 			    md_error_t *ep);
996 extern	int		clnt_updmeds(char *hostname, mdsetname_t *sp,
997 			    md_h_arr_t *meddp, md_error_t *ep);
998 extern  int		clnt_resnarf_set(char *hostname, set_t setno,
999 			    md_error_t *ep);
1000 extern	md_setkey_t	*cl_get_setkey(set_t setno, char *setname);
1001 extern	void		cl_set_setkey(md_setkey_t *cl_sk);
1002 extern	void		meta_conv_drvname_new2old(o_mddrivename_t *,
1003 			    mddrivename_t *);
1004 extern	void		meta_conv_drvname_old2new(o_mddrivename_t *,
1005 			    mddrivename_t *);
1006 extern	void		meta_conv_drvdesc_new2old(o_md_drive_desc *,
1007 			    md_drive_desc *);
1008 extern	void		meta_conv_drvdesc_old2new(o_md_drive_desc *,
1009 			    md_drive_desc *);
1010 extern  void 		alloc_olddrvdesc(o_md_drive_desc **, md_drive_desc *);
1011 extern  void 		alloc_newdrvdesc(o_md_drive_desc *, md_drive_desc **);
1012 extern  void		free_olddrvdesc(o_md_drive_desc *);
1013 extern  void		free_newdrvdesc(md_drive_desc *);
1014 extern	char		*meta_get_devid(char *);
1015 extern	int		clnt_mnsetmaster(char *hostname, mdsetname_t *sp,
1016 			    md_node_nm_t master_nodenm, int master_nodeid,
1017 			    md_error_t *ep);
1018 extern	int		clnt_clr_mnsetlock(char *hostname, md_error_t *ep);
1019 extern	int		clnt_mdcommdctl(char *hostname, int flag_action,
1020 			    mdsetname_t *sp, md_mn_msgclass_t class,
1021 			    uint_t flags, md_error_t *ep);
1022 extern	int		clnt_mn_is_stale(char *hostname, mdsetname_t *sp,
1023 			    int *ret_bool, md_error_t *ep);
1024 extern	int		clnt_getdrivedesc(char *hostname, mdsetname_t *sp,
1025 			    md_drive_desc **dd, md_error_t *ep);
1026 extern	void		free_rem_dd(md_drive_desc *dd);
1027 extern	int		clnt_upd_dr_reconfig(char *hostname, mdsetname_t *sp,
1028 			    md_drive_desc *dd, md_error_t *ep);
1029 extern	int		clnt_reset_mirror_owner(char *hostname, mdsetname_t *sp,
1030 			    int node_c, int *node_id, md_error_t *ep);
1031 extern	int		clnt_mn_susp_res_io(char *hostname, set_t setno,
1032 			    int flag, md_error_t *ep);
1033 extern	int		clnt_mn_mirror_resync_all(char *hostname, set_t setno,
1034 			    md_error_t *ep);
1035 extern	int		clnt_mn_sp_update_abr(char *hostname, set_t setno,
1036 			    md_error_t *ep);
1037 
1038 /* meta_metad_subr.c */
1039 extern	mddb_userreq_t	*get_db_rec(md_ur_get_cmd_t cmd, set_t setno,
1040 			    mddb_type_t type, uint_t type2, mddb_recid_t *idp,
1041 			    md_error_t *ep);
1042 extern	void		*get_ur_rec(set_t setno, md_ur_get_cmd_t cmd,
1043 			    uint_t type2, mddb_recid_t *idp, md_error_t *ep);
1044 extern	void		sr_validate(void);
1045 extern	void		sr_del_drv(md_set_record *sr, mddb_recid_t recid);
1046 extern	int		set_snarf(md_error_t *ep);
1047 extern	void		sr_cache_add(md_set_record *sr);
1048 extern	void		sr_cache_del(mddb_recid_t recid);
1049 extern	void		dr_cache_add(md_set_record *sr, md_drive_record *dr);
1050 extern	void		dr_cache_del(md_set_record *sr, mddb_recid_t recid);
1051 extern	void		mnnr_cache_add(md_mnset_record *sr,
1052 			    md_mnnode_record *nr);
1053 extern	void		mnnr_cache_del(md_mnset_record *sr, mddb_recid_t recid);
1054 extern	int		metad_isautotakebyname(char *setname);
1055 extern	int		metad_isautotakebynum(set_t setno);
1056 extern	md_set_record	*metad_getsetbyname(char *setname, md_error_t *ep);
1057 extern	md_set_record	*metad_getsetbynum(set_t setno, md_error_t *ep);
1058 extern	void		commitset(md_set_record *sr, int inc_genid,
1059 			    md_error_t *ep);
1060 extern	md_set_record	*setdup(md_set_record *sr);
1061 extern	md_mnset_record	*mnsetdup(md_mnset_record *mnsr);
1062 extern	md_drive_record	*drdup(md_drive_record *dr);
1063 extern	md_mnnode_record *nrdup(md_mnnode_record *nr);
1064 extern	md_drive_desc	*dd_list_dup(md_drive_desc *dd);
1065 extern	void		sr_cache_flush(int flushnames);
1066 extern	void		sr_cache_flush_setno(set_t setno);
1067 extern	void		s_delset(char *setname, md_error_t *ep);
1068 extern	void		s_delrec(mddb_recid_t recid, md_error_t *ep);
1069 extern	int		s_ownset(set_t setno, md_error_t *ep);
1070 extern	int		resnarf_set(set_t setno, md_error_t *ep);
1071 
1072 /* meta_mh.c */
1073 extern	mhd_mhiargs_t	defmhiargs;
1074 extern	int		meta_take_own(char *sname, mddrivenamelist_t *dnlp,
1075 			    mhd_mhiargs_t *mhiargsp, int partial_set,
1076 			    md_error_t *ep);
1077 extern	int		tk_own_bydd(mdsetname_t *sp, md_drive_desc *dd,
1078 			    mhd_mhiargs_t *mhiargsp, int partial_set,
1079 			    md_error_t *ep);
1080 extern	int		meta_rel_own(char *sname, mddrivenamelist_t *dnlp,
1081 			    int partial_set, md_error_t *ep);
1082 extern	int		rel_own_bydd(mdsetname_t *sp, md_drive_desc *dd,
1083 			    int partial_set, md_error_t *ep);
1084 extern	int		meta_status_own(char *sname,
1085 			    md_disk_status_list_t *dslp, int partial_set,
1086 			    md_error_t *ep);
1087 extern	md_disk_status_list_t *meta_drive_to_disk_status_list(
1088 			    mddrivenamelist_t *dnlp);
1089 extern	void		meta_free_disk_status_list(md_disk_status_list_t *dslp);
1090 extern	void		meta_free_drive_info_list(mhd_drive_info_list_t *listp);
1091 extern	int		meta_list_drives(char *hostname, char *path,
1092 			    mhd_did_flags_t flags,
1093 			    mhd_drive_info_list_t *listp, md_error_t *ep);
1094 extern	int		meta_get_drive_names(mdsetname_t *sp,
1095 			    mddrivenamelist_t **dnlpp, int options,
1096 			    md_error_t *ep);
1097 
1098 /* meta_mirror.c */
1099 extern	int		meta_get_mirror_names(mdsetname_t *sp,
1100 			    mdnamelist_t **nlpp, int options, md_error_t *ep);
1101 extern	void		meta_free_mirror(md_mirror_t *mirrorp);
1102 extern	md_mirror_t	*meta_get_mirror(mdsetname_t *sp, mdname_t *mirnp,
1103 			    md_error_t *ep);
1104 extern	int		meta_check_inmirror(mdsetname_t *sp, mdname_t *np,
1105 			    diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep);
1106 extern	int		meta_check_submirror(mdsetname_t *sp, mdname_t *np,
1107 			    mdname_t *mirnp, int force, md_error_t *ep);
1108 extern	char		*rd_opt_to_name(mm_rd_opt_t opt);
1109 extern	int		name_to_rd_opt(char *uname, char *name,
1110 			    mm_rd_opt_t *optp, md_error_t *ep);
1111 extern	char		*wr_opt_to_name(mm_wr_opt_t opt);
1112 extern	int		name_to_wr_opt(char *uname, char *name,
1113 			    mm_wr_opt_t *optp, md_error_t *ep);
1114 extern	int		name_to_pass_num(char *uname, char *name,
1115 			    mm_pass_num_t *passp, md_error_t *ep);
1116 extern	char		*sm_state_to_name(md_submirror_t *mdsp,
1117 			    md_status_t mirror_status, md_timeval32_t *tvp,
1118 			    uint_t tstate);
1119 extern	int		sm_state_to_action(mdsetname_t *sp,
1120 			    md_submirror_t *mdsp, md_status_t mirror_status,
1121 			    md_mirror_t *mirrorp, char **actionp,
1122 			    md_error_t *ep);
1123 extern	int		meta_print_mirror_options(mm_rd_opt_t read_options,
1124 			    mm_wr_opt_t write_option, mm_pass_num_t pass_num,
1125 			    uint_t tstate, char *fname,
1126 			    mdsetname_t *sp, FILE *fp, md_error_t *ep);
1127 extern	int		meta_mirror_print(mdsetname_t *sp, mdname_t *mirnp,
1128 			    mdnamelist_t **nlpp, char *fname, FILE *fp,
1129 			    mdprtopts_t options, md_error_t *ep);
1130 extern	int		meta_mirror_online(mdsetname_t *sp, mdname_t *mirnp,
1131 			    mdname_t *submirnp, mdcmdopts_t options,
1132 			    md_error_t *ep);
1133 extern	int		meta_mirror_offline(mdsetname_t *sp, mdname_t *mirnp,
1134 			    mdname_t *submirnp, mdcmdopts_t options,
1135 			    md_error_t *ep);
1136 extern	int		meta_mirror_attach(mdsetname_t *sp, mdname_t *mirnp,
1137 			    mdname_t *submirnp, mdcmdopts_t options,
1138 			    md_error_t *ep);
1139 extern	int		meta_mirror_detach(mdsetname_t *sp, mdname_t *mirnp,
1140 			    mdname_t *submirnp, mdcmdopts_t options,
1141 			    md_error_t *ep);
1142 extern	int		meta_mirror_get_params(mdsetname_t *sp,
1143 			    mdname_t *mirnp, mm_params_t *paramsp,
1144 			    md_error_t *ep);
1145 extern	int		meta_mirror_set_params(mdsetname_t *sp,
1146 			    mdname_t *mirnp, mm_params_t *paramsp,
1147 			    md_error_t *ep);
1148 extern	int		meta_mirror_replace(mdsetname_t *sp, mdname_t *mirnp,
1149 			    mdname_t *oldnp, mdname_t *newnp,
1150 			    mdcmdopts_t options, md_error_t *ep);
1151 extern	int		meta_mirror_enable(mdsetname_t *sp, mdname_t *mirnp,
1152 			    mdname_t *compnp, mdcmdopts_t options,
1153 			    md_error_t *ep);
1154 extern	int		meta_check_mirror(mdsetname_t *sp,
1155 			    md_mirror_t *mirrorp, mdcmdopts_t options,
1156 			    md_error_t *ep);
1157 extern	int		meta_create_mirror(mdsetname_t *sp,
1158 			    md_mirror_t *mirrorp, mdcmdopts_t options,
1159 			    md_error_t *ep);
1160 extern	int		meta_init_mirror(mdsetname_t **spp,
1161 			    int argc, char *argv[], mdcmdopts_t options,
1162 			    md_error_t *ep);
1163 extern	int		meta_mirror_reset(mdsetname_t *sp, mdname_t *mirnp,
1164 			    mdcmdopts_t options, md_error_t *ep);
1165 extern	int		meta_mirror_anycomp_is_err(mdsetname_t *,
1166 			    mdnamelist_t *);
1167 
1168 /* meta_mirror_resync.c */
1169 extern	int		meta_mirror_resync(mdsetname_t *sp, mdname_t *mirnp,
1170 			    daddr_t size, md_error_t *ep, md_resync_cmd_t cmd);
1171 extern	int		meta_mirror_resync_all(mdsetname_t *sp, daddr_t size,
1172 			    md_error_t *ep);
1173 extern	void		*meta_mn_mirror_resync_all(void *arg);
1174 extern	void		meta_mirror_resync_kill_all(void);
1175 extern	void		meta_mirror_resync_block_all(void);
1176 extern	void		meta_mirror_resync_unblock_all(void);
1177 extern	void		meta_mirror_resync_unblock(mdsetname_t *sp);
1178 extern	void		meta_mirror_resync_kill(mdsetname_t *sp);
1179 
1180 /* meta_mount.c */
1181 extern	char		*meta_get_mountp(mdsetname_t *, mdname_t *,
1182 			    md_error_t *);
1183 
1184 /* meta_name.c */
1185 extern  char		*meta_name_getname(mdsetname_t **spp, char *uname,
1186 			    meta_device_type_t uname_type, md_error_t *ep);
1187 extern	char		*meta_canonicalize(mdsetname_t *sp, char *uname);
1188 extern	char		*meta_canonicalize_check_set(mdsetname_t **sp,
1189 			    char *uname, md_error_t *ep);
1190 extern	int		meta_is_all(char *uname);
1191 extern	int		is_existing_metadevice(mdsetname_t *sp, char *uname);
1192 extern	int		is_existing_hsp(mdsetname_t *sp, char *uname);
1193 extern	int		is_existing_meta_hsp(mdsetname_t *sp, char *uname);
1194 extern	int		is_metaname(char *uname);
1195 extern	int		meta_is_none(char *uname);
1196 extern	int		is_hspname(char *uname);
1197 extern	int		parse_ctd(char *uname, uint_t *slice);
1198 extern	void		parse_device(mdsetname_t *, char *, char **, char **);
1199 extern	md_set_desc	*sr2setdesc(md_set_record *sr);
1200 extern	mdsetname_t	*metasetname(char *sname, md_error_t *ep);
1201 extern	mdsetname_t	*metasetnosetname(set_t setno, md_error_t *ep);
1202 extern	mdsetname_t	*metafakesetname(set_t setno, char *sname);
1203 extern	md_set_desc	*metaget_setdesc(mdsetname_t *sp, md_error_t *ep);
1204 extern	void		metaflushsetname(mdsetname_t *sp);
1205 extern	void		metaflushdrivenames(void);
1206 extern	int		metaislocalset(mdsetname_t *sp);
1207 extern	int		metaissameset(mdsetname_t *sp1, mdsetname_t *sp2);
1208 extern	void		metaflushsidenames(mddrivename_t *dnp);
1209 extern	char		*metadiskname(char *name);
1210 extern	mddrivename_t	*metadrivename(mdsetname_t **spp, char *uname,
1211 			    md_error_t *ep);
1212 extern	mddrivename_t	*metadrivenamebydevid(mdsetname_t **spp, char *devid,
1213 			    char *uname, md_error_t *ep);
1214 extern	mdname_t	*metaslicename(mddrivename_t *dnp, uint_t sliceno,
1215 			    md_error_t *ep);
1216 extern	void		metafreedrivename(mddrivename_t *dnp);
1217 extern	void		metafreedrivenamelist(mddrivenamelist_t *dnlp);
1218 extern	int		metadrivenamelist(mdsetname_t **spp,
1219 			    mddrivenamelist_t **dnlpp,
1220 			    int argc, char *argv[], md_error_t *ep);
1221 extern	mddrivename_t	*metadrivenamelist_append(mddrivenamelist_t **dnlpp,
1222 			    mddrivename_t *dnp);
1223 extern  mddrivenamelist_t	**meta_drivenamelist_append_wrapper(
1224 				    mddrivenamelist_t **dnlpp,
1225 				    mddrivename_t *dnp);
1226 extern	int		meta_getdev(mdsetname_t *sp, mdname_t *np,
1227 			    md_error_t *ep);
1228 extern	mdname_t	*metaname_fast(mdsetname_t **spp, char *uname,
1229 			    meta_device_type_t uname_type, md_error_t *ep);
1230 extern	mdname_t	*metaname(mdsetname_t **spp, char *uname,
1231 			    meta_device_type_t uname_type, md_error_t *ep);
1232 extern	mdname_t	*metamnumname(mdsetname_t **spp, minor_t mnum,
1233 			    int fast, md_error_t *ep);
1234 extern	char		*get_mdname(mdsetname_t *sp, minor_t mnum);
1235 extern	int		metaismeta(mdname_t *np);
1236 extern	int		metachkmeta(mdname_t *np, md_error_t *ep);
1237 extern	int		metachkdisk(mdname_t *np, md_error_t *ep);
1238 extern	int		metachkcomp(mdname_t *np, md_error_t *ep);
1239 extern	void		metafreenamelist(mdnamelist_t *nlp);
1240 extern	int		metanamelist(mdsetname_t **spp, mdnamelist_t **nlpp,
1241 			    int argc, char *argv[], meta_device_type_t type,
1242 			    md_error_t *ep);
1243 extern	mdname_t	*metanamelist_append(mdnamelist_t **nlpp,
1244 			    mdname_t *np);
1245 extern  mdnamelist_t	**meta_namelist_append_wrapper(mdnamelist_t **nlpp,
1246 			    mdname_t *np);
1247 extern	mdhspname_t	*metahspname(mdsetname_t **spp,
1248 			    char *uname, md_error_t *ep);
1249 extern	mdhspname_t	*metahsphspname(mdsetname_t **spp,
1250 			    hsp_t hsp, md_error_t *ep);
1251 extern	char		*get_hspname(mdsetname_t *sp, hsp_t mnum);
1252 extern	void		metafreehspnamelist(mdhspnamelist_t *hspnlp);
1253 extern	int		metahspnamelist(mdsetname_t **spp,
1254 			    mdhspnamelist_t **hspnlpp,
1255 			    int argc, char *argv[], md_error_t *ep);
1256 extern	mdhspname_t	*metahspnamelist_append(mdhspnamelist_t **hspnlp,
1257 			    mdhspname_t *hspnp);
1258 extern	mdname_t	*metadevname(mdsetname_t **spp,
1259 			    md_dev64_t dev, md_error_t *ep);
1260 extern	char		*get_devname(set_t setno, md_dev64_t dev);
1261 extern	mdname_t	*metakeyname(mdsetname_t **spp,
1262 			    mdkey_t key, int fast, md_error_t *ep);
1263 extern	void		metaflushmetanames(void);
1264 extern	void		metaflushnames(int flush_sr_cache);
1265 extern	int		meta_get_hotspare_names(mdsetname_t *sp,
1266 			    mdnamelist_t **nlpp, int options, md_error_t *ep);
1267 extern	void		meta_create_non_dup_list(mdname_t *mdnp,
1268 			    mddevid_t **ldevidpp);
1269 extern	mddrivename_t	*meta_getdnp_bydevid(mdsetname_t *sp, side_t sideno,
1270 			    ddi_devid_t devidp, mdkey_t key, md_error_t *ep);
1271 
1272 
1273 /* meta_nameinfo.c */
1274 extern	mdsetname_t	*metagetset(mdname_t *np, int bypass_daemon,
1275 			    md_error_t *ep);
1276 extern	void		metafreevtoc(mdvtoc_t *vtocp);
1277 extern	int		meta_match_enclosure(mdname_t *, mdcinfo_t *,
1278 			    md_error_t *);
1279 extern	mdvtoc_t	*metagetvtoc(mdname_t *np, int nocache, uint_t *partnop,
1280 			    md_error_t *ep);
1281 extern	int		metasetvtoc(mdname_t *np, md_error_t *ep);
1282 extern	void		metaflushctlrcache(void);
1283 extern	mdgeom_t	*metagetgeom(mdname_t *np, md_error_t *ep);
1284 extern	mdcinfo_t	*metagetcinfo(mdname_t *np, md_error_t *ep);
1285 extern	int		metagetpartno(mdname_t *np, md_error_t *ep);
1286 extern	diskaddr_t	metagetsize(mdname_t *np, md_error_t *ep);
1287 extern	diskaddr_t	metagetlabel(mdname_t *np, md_error_t *ep);
1288 extern	diskaddr_t	metagetstart(mdsetname_t *sp, mdname_t *np,
1289 			    md_error_t *ep);
1290 extern	int		metahasmddb(mdsetname_t *sp, mdname_t *np,
1291 			    md_error_t *ep);
1292 extern	char		*metagetdevicesname(mdname_t *np, md_error_t *ep);
1293 extern	char		*metagetmiscname(mdname_t *np, md_error_t *ep);
1294 extern	md_unit_t	*meta_get_mdunit(mdsetname_t *sp, mdname_t *np,
1295 			    md_error_t *ep);
1296 extern	void		meta_free_unit(mddrivename_t *dnp);
1297 extern	void		meta_invalidate_name(mdname_t *np);
1298 extern	md_common_t	*meta_get_unit(mdsetname_t *sp, mdname_t *np,
1299 			    md_error_t *ep);
1300 extern	int		meta_isopen(mdsetname_t *sp, mdname_t *np,
1301 			    md_error_t *ep, mdcmdopts_t options);
1302 
1303 /* meta_namespace.c */
1304 extern	char		*meta_getnmbykey(set_t setno, side_t sideno,
1305 			    mdkey_t key, md_error_t *ep);
1306 extern	char		*meta_getnmentbykey(set_t setno, side_t sideno,
1307 			    mdkey_t key, char **drvnm, minor_t *mnum,
1308 			    md_dev64_t *dev, md_error_t *ep);
1309 extern	char		*meta_getnmentbydev(set_t setno, side_t sideno,
1310 			    md_dev64_t dev, char **drvnm, minor_t *mnum,
1311 			    mdkey_t *key, md_error_t *ep);
1312 extern	char		*meta_gethspnmentbyid(set_t setno, side_t sideno,
1313 			    hsp_t hspid, md_error_t *ep);
1314 extern	hsp_t		meta_gethspnmentbyname(set_t setno, side_t sideno,
1315 			    char *hspname, md_error_t *ep);
1316 extern	char		*meta_getdidminorbykey(set_t setno, side_t sideno,
1317 			    mdkey_t key, md_error_t *ep);
1318 extern	ddi_devid_t	meta_getdidbykey(set_t setno, side_t sideno,
1319 			    mdkey_t key, md_error_t *ep);
1320 extern	int		meta_setdid(set_t setno, side_t sideno, mdkey_t key,
1321 			    md_error_t *ep);
1322 extern	int		add_name(mdsetname_t *sp, side_t sideno, mdkey_t key,
1323 			    char *dname, minor_t mnum, char *bname,
1324 			    char *minorname, ddi_devid_t devid, md_error_t *ep);
1325 extern	int		del_name(mdsetname_t *sp, side_t sideno, mdkey_t key,
1326 			    md_error_t *ep);
1327 extern	int		add_key_name(mdsetname_t *sp, mdname_t *np,
1328 			    mdnamelist_t **nlpp, md_error_t *ep);
1329 extern	int		del_key_name(mdsetname_t *sp, mdname_t *np,
1330 			    md_error_t *ep);
1331 extern	int		del_key_names(mdsetname_t *sp, mdnamelist_t *nlp,
1332 			    md_error_t *ep);
1333 extern	mdkey_t		add_self_name(mdsetname_t *, char *,
1334 			    md_mkdev_params_t *, md_error_t *);
1335 extern	int		del_self_name(mdsetname_t *, mdkey_t,
1336 			    md_error_t *);
1337 
1338 /* meta_patch.c */
1339 extern	int		meta_patch_vfstab(char *cmpname, mdname_t *fsnp,
1340 			    char *vname, char *old_bdevname, int doit,
1341 			    int verbose, char **tname, md_error_t *ep);
1342 extern	int		meta_patch_fsdev(char *fsname, mdname_t *fsnp,
1343 			    char *vname, md_error_t *ep);
1344 extern	int		meta_patch_swapdev(mdname_t *fsnp,
1345 			    char *vname, char *old_bdevname, md_error_t *ep);
1346 extern	int		meta_patch_mddb(char *sname, char *cname, int patch,
1347 			    md_error_t *ep);
1348 
1349 /* meta_patch_root.c */
1350 extern	int		meta_patch_rootdev(mdname_t *np, char *sname,
1351 			    char *vname, char *cname, char *dbname, int doit,
1352 			    int verbose, md_error_t *ep);
1353 
1354 /* meta_print.c */
1355 extern	int		meta_print_name(mdsetname_t *sp, mdname_t *namep,
1356 			    mdnamelist_t **nlpp, char *fname, FILE *fp,
1357 			    mdprtopts_t options, mdnamelist_t **lognlpp,
1358 			    md_error_t *ep);
1359 extern	int		meta_print_all(mdsetname_t *sp, char *fname,
1360 			    mdnamelist_t **nlpp, FILE *fp,
1361 			    mdprtopts_t options, int *meta_print_trans_msgp,
1362 			    md_error_t *ep);
1363 extern	char		*meta_print_time(md_timeval32_t *timep);
1364 extern	char		*meta_print_hrtime(hrtime_t secs);
1365 extern	int		meta_prbits(FILE *fp, const char *fmt, ...);
1366 extern	char 		*meta_number_to_string(diskaddr_t number,
1367 			    u_longlong_t blk_sz);
1368 extern	int		meta_get_tstate(md_dev64_t dev64, uint_t *tstatep,
1369 			    md_error_t *ep);
1370 extern	int		meta_print_devid(mdsetname_t *sp, FILE *fp,
1371 			    mddevid_t *mddevidp, md_error_t *ep);
1372 
1373 /* meta_raid.c */
1374 extern	int		meta_raid_check_component(mdsetname_t *sp,
1375 			    mdname_t *np, md_dev64_t dev, md_error_t *ep);
1376 extern	int		meta_get_raid_names(mdsetname_t *sp,
1377 			    mdnamelist_t **nlpp, int options, md_error_t *ep);
1378 extern	void		meta_free_raid(md_raid_t *raidp);
1379 extern	md_raid_t	*meta_get_raid_common(mdsetname_t *sp, mdname_t *raidnp,
1380 			    int fast, md_error_t *ep);
1381 extern	md_raid_t	*meta_get_raid(mdsetname_t *sp, mdname_t *raidnp,
1382 			    md_error_t *ep);
1383 extern	int		meta_check_inraid(mdsetname_t *sp, mdname_t *np,
1384 			    diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep);
1385 extern	int		meta_check_column(mdsetname_t *sp, mdname_t *np,
1386 			    md_error_t *ep);
1387 extern	char		*raid_state_to_name(md_raid_t *raidp,
1388 			    md_timeval32_t *tvp, uint_t tstate);
1389 extern	char		*raid_state_to_action(md_raid_t *raidp);
1390 extern	char		*raid_col_state_to_name(md_raidcol_t *colp,
1391 			    md_timeval32_t *tvp, uint_t tstate);
1392 extern	int		meta_print_raid_options(mdhspname_t *hspnamep,
1393 			    char *fname, FILE *fp, md_error_t *ep);
1394 extern	int		meta_raid_print(mdsetname_t *sp, mdname_t *raidnp,
1395 			    mdnamelist_t **nlpp, char *fname, FILE *fp,
1396 			    mdprtopts_t options, md_error_t *ep);
1397 extern	int		meta_raid_attach(mdsetname_t *sp, mdname_t *raidnp,
1398 			    mdnamelist_t *nlp, mdcmdopts_t options,
1399 			    md_error_t *ep);
1400 extern	int		meta_raid_get_params(mdsetname_t *sp, mdname_t *raidnp,
1401 			    mr_params_t *paramsp, md_error_t *ep);
1402 extern	int		meta_raid_set_params(mdsetname_t *sp, mdname_t *raidnp,
1403 			    mr_params_t *paramsp, md_error_t *ep);
1404 extern	int		meta_raid_replace(mdsetname_t *sp, mdname_t *raidnp,
1405 			    mdname_t *oldnp, mdname_t *newnp,
1406 			    mdcmdopts_t options, md_error_t *ep);
1407 extern	int		meta_raid_enable(mdsetname_t *sp, mdname_t *raidnp,
1408 			    mdname_t *compnp, mdcmdopts_t options,
1409 			    md_error_t *ep);
1410 extern	diskaddr_t		meta_default_raid_interlace(void);
1411 extern	int		meta_raid_check_interlace(diskaddr_t interlace,
1412 			    char *uname, md_error_t *ep);
1413 extern	int		meta_check_raid(mdsetname_t *sp, md_raid_t *raidp,
1414 			    mdcmdopts_t options, md_error_t *ep);
1415 extern	int		meta_create_raid(mdsetname_t *sp, md_raid_t *raidp,
1416 			    mdcmdopts_t options, md_error_t *ep);
1417 extern	int		meta_init_raid(mdsetname_t **spp,
1418 			    int argc, char *argv[], mdcmdopts_t options,
1419 			    md_error_t *ep);
1420 extern	int		meta_raid_reset(mdsetname_t *sp, mdname_t *np,
1421 			    mdcmdopts_t options, md_error_t *ep);
1422 extern	int		meta_raid_anycomp_is_err(mdsetname_t *, mdnamelist_t *);
1423 
1424 /* meta_raid_resync.c */
1425 extern	int		meta_raid_resync(mdsetname_t *sp, mdname_t *raidnp,
1426 			    daddr_t size, md_error_t *ep);
1427 extern	int		meta_raid_resync_all(mdsetname_t *sp, daddr_t size,
1428 			    md_error_t *ep);
1429 
1430 extern	int		meta_raid_regen_byname(mdsetname_t *sp,
1431 			    mdname_t *raidnp, diskaddr_t size, md_error_t *ep);
1432 
1433 /* meta_repartition.c */
1434 extern	int		meta_replicaslice(mddrivename_t *dnp,
1435 			    uint_t *slicep, md_error_t *ep);
1436 
1437 /* meta_replace.c */
1438 extern	int		meta_replace_byname(mdsetname_t *sp, mdname_t *namep,
1439 			    mdname_t *oldnp, mdname_t *newnp,
1440 			    mdcmdopts_t options, md_error_t *ep);
1441 extern	int		meta_enable_byname(mdsetname_t *sp, mdname_t *namep,
1442 			    mdname_t *compnp, mdcmdopts_t options,
1443 			    md_error_t *ep);
1444 
1445 /* meta_reset.c */
1446 extern	int		meta_reset(mdsetname_t *sp, mdname_t *np,
1447 			    mdcmdopts_t options, md_error_t *ep);
1448 extern	int		meta_reset_all(mdsetname_t *sp, mdcmdopts_t options,
1449 			    md_error_t *ep);
1450 extern	int		meta_reset_by_name(mdsetname_t *sp, mdname_t *np,
1451 			    mdcmdopts_t options, md_error_t *ep);
1452 
1453 /* meta_resync.c */
1454 extern	int		meta_resync_byname(mdsetname_t *sp, mdname_t *np,
1455 			    daddr_t size, md_error_t *ep, md_resync_cmd_t cmd);
1456 extern	int		meta_resync_all(mdsetname_t *sp, daddr_t size,
1457 			    md_error_t *ep);
1458 
1459 /* meta_set.c */
1460 extern	set_t		get_max_sets(md_error_t *ep);
1461 extern	int		get_max_meds(md_error_t *ep);
1462 extern	side_t		getmyside(mdsetname_t *sp, md_error_t *ep);
1463 extern	md_set_record	*getsetbyname(char *setname, md_error_t *ep);
1464 extern	md_set_record	*getsetbynum(set_t setno, md_error_t *ep);
1465 extern	int		meta_check_drive_inuse(mdsetname_t *sp,
1466 			    mddrivename_t *dnp, int check_db, md_error_t *ep);
1467 extern	int		meta_check_ownership(mdsetname_t *sp, md_error_t *ep);
1468 extern	int		meta_check_ownership_on_host(mdsetname_t *sp,
1469 			    char *hostname, md_error_t *ep);
1470 extern	int		meta_is_member(char *node_name, md_mn_nodeid_t node_id,
1471 			    mndiskset_membershiplist_t *nl);
1472 extern	int		meta_getnextside_devinfo(mdsetname_t *sp, char *bname,
1473 			    side_t *sideno, char **ret_bname, char **ret_dname,
1474 			    minor_t *ret_mnum, md_error_t *ep);
1475 extern	int		meta_getside_devinfo(mdsetname_t *sp, char *bname,
1476 			    side_t sideno, char **ret_bname, char **ret_dname,
1477 			    minor_t *ret_mnum, md_error_t *ep);
1478 extern	int		meta_is_drive_in_anyset(mddrivename_t *dnp,
1479 			    mdsetname_t **spp, int bypass_daemon,
1480 			    md_error_t *ep);
1481 extern	int		meta_is_drive_in_thisset(mdsetname_t *sp,
1482 			    mddrivename_t *dnp, int bypass_daemon,
1483 			    md_error_t *ep);
1484 extern	int		meta_is_devid_in_anyset(void *devid,
1485 			    mdsetname_t **spp, md_error_t *ep);
1486 extern	int		meta_is_devid_in_thisset(mdsetname_t *sp,
1487 			    void *devid, md_error_t *ep);
1488 extern	int		meta_set_balance(mdsetname_t *sp, md_error_t *ep);
1489 extern	int		meta_set_destroy(mdsetname_t *sp, int lock_set,
1490 			    md_error_t *ep);
1491 extern	int		meta_set_purge(mdsetname_t *sp, int bypass_cluster,
1492 			    int forceflg, md_error_t *ep);
1493 extern	int		meta_set_query(mdsetname_t *sp, mddb_dtag_lst_t **dtlpp,
1494 			    md_error_t *ep);
1495 extern	mddrivename_t	*metadrivename_withdrkey(mdsetname_t *sp,
1496 			    side_t sideno, mdkey_t key, int flags,
1497 			    md_error_t *ep);
1498 extern	void		metafreedrivedesc(md_drive_desc **dd);
1499 extern	md_drive_desc	*metaget_drivedesc(mdsetname_t *sp, int flags,
1500 			    md_error_t *ep);
1501 extern	md_drive_desc	*metaget_drivedesc_fromnamelist(mdsetname_t *sp,
1502 			    mdnamelist_t *nlp, md_error_t *ep);
1503 extern	md_drive_desc	*metaget_drivedesc_sideno(mdsetname_t *sp,
1504 			    side_t sideno, int flags, md_error_t *ep);
1505 extern	int		metaget_setownership(mdsetname_t *sp, md_error_t *ep);
1506 extern	char		*mynode(void);
1507 extern	int		strinlst(char *str, int cnt, char **lst);
1508 extern	int		meta_get_reserved_names(mdsetname_t *sp,
1509 			    mdnamelist_t **nlpp, int options, md_error_t *ep);
1510 extern	int		meta_set_join(mdsetname_t *sp, md_error_t *ep);
1511 extern	int		meta_set_withdraw(mdsetname_t *sp, md_error_t *ep);
1512 extern	int		meta_reconfig_choose_master();
1513 extern	int		meta_mnsync_user_records(mdsetname_t *sp,
1514 			    md_error_t *ep);
1515 extern	int		meta_mnsync_diskset_mddbs(mdsetname_t *sp,
1516 			    md_error_t *ep);
1517 extern	int		meta_mnjoin_all(mdsetname_t *sp, md_error_t *ep);
1518 extern	int		meta_getandsetmaster(mdsetname_t *sp,
1519 			    md_mnset_record *mnsr, md_set_desc *sd,
1520 			    md_error_t *ep);
1521 extern	int		meta_devid_use(md_error_t *ep);
1522 
1523 /* meta_set_drv.c */
1524 extern	int		meta_make_sidenmlist(mdsetname_t *,
1525 			    mddrivename_t *, int imp_flag,
1526 			    md_im_drive_info_t *midp, md_error_t *);
1527 extern	int		meta_set_adddrives(mdsetname_t *sp,
1528 			    mddrivenamelist_t *dnlp, daddr_t dbsize,
1529 			    int force_label, md_error_t *ep);
1530 extern	int		meta_set_deletedrives(mdsetname_t *sp,
1531 			    mddrivenamelist_t *dnlp, int forceflg,
1532 			    md_error_t *ep);
1533 
1534 /* meta_set_hst.c */
1535 extern	int		meta_set_checkname(char *setname, md_error_t *ep);
1536 extern	int		meta_set_addhosts(mdsetname_t *sp, int multi_node,
1537 			    int node_c, char **node_v, int auto_take,
1538 			    md_error_t *ep);
1539 extern	int		meta_set_deletehosts(mdsetname_t *sp, int node_c,
1540 			    char **node_v, int forceflg, md_error_t *ep);
1541 extern	int		meta_set_auto_take(mdsetname_t *sp, int take_val,
1542 			    md_error_t *ep);
1543 
1544 /* meta_set_med.c */
1545 extern	int		meta_set_addmeds(mdsetname_t *sp, int node_c,
1546 			    char **node_v, md_error_t *ep);
1547 extern	int		meta_set_deletemeds(mdsetname_t *sp, int node_c,
1548 			    char **node_v, int forceflg, md_error_t *ep);
1549 
1550 /* meta_set_tkr.c */
1551 extern	int		meta_set_take(mdsetname_t *sp, mhd_mhiargs_t *mhiargsp,
1552 			    int flags, int usetag, md_error_t *ep);
1553 extern	int		meta_set_release(mdsetname_t *sp, md_error_t *ep);
1554 extern	int		meta_update_mb(mdsetname_t *sp, md_drive_desc *dd,
1555 			    md_error_t *ep);
1556 
1557 /* meta_setup.c */
1558 extern	char		*myname;
1559 extern	FILE		*metalogfp;
1560 extern	int		metasyslog;
1561 extern	uint_t		verbosity;
1562 extern	hrtime_t	start_time;
1563 extern	sigset_t	allsigs;
1564 #define	ANYSIG		allsigs
1565 extern	char		*meta_lock_name(set_t setno);
1566 extern	int		meta_unlock(mdsetname_t *sp, md_error_t *ep);
1567 extern	int		meta_lock(mdsetname_t *sp, int print_status,
1568 			    md_error_t *ep);
1569 extern	int		meta_lock_nowait(mdsetname_t *sp, md_error_t *ep);
1570 extern	int		meta_lock_status(mdsetname_t *sp, md_error_t *ep);
1571 extern	int		md_daemonize(mdsetname_t *sp, md_error_t *ep);
1572 extern	void		md_exit(mdsetname_t *sp, int eval);
1573 extern	void		md_post_sig(int sig);
1574 extern	int		md_got_sig(void);
1575 extern	int		md_which_sig(void);
1576 extern	void		md_rb_sig_handling_on(void);
1577 extern	void		md_rb_sig_handling_off(int sig_seen, int sig);
1578 extern	void		setup_mc_log(uint_t level);
1579 extern	int		md_init(int argc, char *argv[],
1580 			    int dosyslog, int doadmin, md_error_t *ep);
1581 extern	int		md_init_nosig(int argc, char *argv[],
1582 			    int dosyslog, int doadmin, md_error_t *ep);
1583 
1584 extern	int		md_init_daemon(char *name, md_error_t *ep);
1585 
1586 /* meta_smf.c */
1587 extern	int		meta_smf_enable(uint_t flags, md_error_t *ep);
1588 extern	int		meta_smf_disable(uint_t flags, md_error_t *ep);
1589 extern	int		meta_smf_isonline(uint_t flags, md_error_t *ep);
1590 extern	int		meta_smf_getmask();
1591 
1592 /* meta_sp.c */
1593 extern	int		meta_sp_check_component(mdsetname_t *sp,
1594 			    mdname_t *np, md_error_t *ep);
1595 extern	int		meta_get_sp_names(mdsetname_t *sp, mdnamelist_t **nlpp,
1596 			    int options, md_error_t *ep);
1597 extern	int		meta_check_insp(mdsetname_t *sp, mdname_t *np,
1598 			    diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep);
1599 extern	int		meta_sp_print(mdsetname_t *sp, mdname_t *np,
1600 			    mdnamelist_t **nlpp, char *fname, FILE *fp,
1601 			    mdprtopts_t options, md_error_t *ep);
1602 extern	md_sp_t		*meta_get_sp_common(mdsetname_t *sp, mdname_t *np,
1603 			    int fast, md_error_t *ep);
1604 extern	md_sp_t		*meta_get_sp(mdsetname_t *sp, mdname_t *np,
1605 			    md_error_t *ep);
1606 extern	int		meta_init_sp(mdsetname_t **spp, int argc, char *argv[],
1607 			    mdcmdopts_t options, md_error_t *ep);
1608 extern	void		meta_free_sp(md_sp_t *spp);
1609 extern	int		meta_sp_issp(mdsetname_t *sp, mdname_t *np,
1610 			    md_error_t *ep);
1611 extern	int		meta_sp_reset(mdsetname_t *sp, mdname_t *np,
1612 			    mdcmdopts_t options, md_error_t *ep);
1613 extern	int		meta_sp_reset_component(mdsetname_t *sp, char *name,
1614 			    mdcmdopts_t options, md_error_t *ep);
1615 extern	int		meta_sp_attach(mdsetname_t *sp, mdname_t *np,
1616 			    char *addsize, mdcmdopts_t options,
1617 			    sp_ext_length_t alignment, md_error_t *ep);
1618 extern	int		meta_recover_sp(mdsetname_t *sp, mdname_t *np, int argc,
1619 			    char *argv[], mdcmdopts_t options, md_error_t *ep);
1620 extern boolean_t	meta_sp_can_create_sps(mdsetname_t *mdsetnamep,
1621 				mdname_t *mdnamep, int number_of_sps,
1622 				blkcnt_t sp_size);
1623 extern boolean_t	meta_sp_can_create_sps_on_drive(mdsetname_t *mdsetnamep,
1624 				mddrivename_t *mddrivenamep, int number_of_sps,
1625 				blkcnt_t sp_size);
1626 extern blkcnt_t		meta_sp_get_free_space(mdsetname_t *mdsetnamep,
1627 				mdname_t *mdnamep);
1628 extern blkcnt_t		meta_sp_get_free_space_on_drive(mdsetname_t *mdsetnamep,
1629 				mddrivename_t *mddrivenamep);
1630 extern int 		meta_sp_get_number_of_possible_sps(
1631 				mdsetname_t *mdsetnamep, mdname_t *mdnamep,
1632 				blkcnt_t sp_size);
1633 extern int 		meta_sp_get_number_of_possible_sps_on_drive(
1634 				mdsetname_t *mdsetnamep,
1635 				mddrivename_t *mddrivenamep, blkcnt_t sp_size);
1636 extern blkcnt_t		meta_sp_get_possible_sp_size(mdsetname_t *mdsetnamep,
1637 				mdname_t *mdnamep, int number_of_sps);
1638 extern blkcnt_t		meta_sp_get_possible_sp_size_on_drive(
1639 				mdsetname_t *mdsetnamep,
1640 				mddrivename_t *mddrivenamep, int number_of_sps);
1641 extern int		meta_sp_setstatus(mdsetname_t *sp, minor_t *minors,
1642 			    int num_units, sp_status_t status, md_error_t *ep);
1643 extern int		meta_sp_parsesize(char *s, sp_ext_length_t *szp);
1644 extern int		meta_sp_update_abr(mdsetname_t *sp, md_error_t *ep);
1645 extern void		*meta_mn_sp_update_abr(void *arg);
1646 
1647 /* meta_stat.c */
1648 extern	int		meta_stat(const char *, struct stat *);
1649 extern	void		metaflushstatcache(void);
1650 
1651 /* meta_stripe.c */
1652 extern	int		meta_stripe_check_component(mdsetname_t *sp,
1653 			    mdname_t *np, md_dev64_t dev, md_error_t *ep);
1654 extern	int		meta_stripe_replace(mdsetname_t *sp, mdname_t *stripenp,
1655 			    mdname_t *oldnp, mdname_t *newnp,
1656 			    mdcmdopts_t options, md_error_t *ep);
1657 extern	int		meta_get_stripe_names(mdsetname_t *sp,
1658 			    mdnamelist_t **nlpp, int options, md_error_t *ep);
1659 extern	void		meta_free_stripe(md_stripe_t *stripep);
1660 extern	md_stripe_t	*meta_get_stripe_common(mdsetname_t *sp,
1661 			    mdname_t *stripenp, int fast, md_error_t *ep);
1662 extern	md_stripe_t	*meta_get_stripe(mdsetname_t *sp, mdname_t *stripenp,
1663 			    md_error_t *ep);
1664 extern	int		meta_check_instripe(mdsetname_t *sp, mdname_t *np,
1665 			    diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep);
1666 extern	int		meta_check_component(mdsetname_t *sp, mdname_t *np,
1667 			    int force, md_error_t *ep);
1668 extern	char		*comp_state_to_name(md_comp_t *mdcp,
1669 			    md_timeval32_t *tvp, uint_t tstate);
1670 extern	int		meta_print_stripe_options(mdhspname_t *hspnamep,
1671 			    char *fname, FILE *fp, md_error_t *ep);
1672 extern	int		meta_stripe_print(mdsetname_t *sp, mdname_t *stripenp,
1673 			    mdnamelist_t **nlpp, char *fname, FILE *fp,
1674 			    mdprtopts_t options, md_error_t *ep);
1675 extern	int		meta_find_erred_comp(mdsetname_t *sp,
1676 			    mdname_t *stripenp, mdname_t **compnpp,
1677 			    comp_state_t *compstate, md_error_t *ep);
1678 extern	int		meta_stripe_attach(mdsetname_t *sp, mdname_t *stripenp,
1679 			    mdnamelist_t *nlp, diskaddr_t interlace,
1680 			    mdcmdopts_t options, md_error_t *ep);
1681 extern	int		meta_stripe_get_params(mdsetname_t *sp,
1682 			    mdname_t *stripenp, ms_params_t *paramsp,
1683 			    md_error_t *ep);
1684 extern	int		meta_stripe_set_params(mdsetname_t *sp,
1685 			    mdname_t *stripenp, ms_params_t *paramsp,
1686 			    md_error_t *ep);
1687 extern	diskaddr_t		meta_default_stripe_interlace(void);
1688 extern	int		meta_stripe_check_interlace(diskaddr_t interlace,
1689 				char *uname, md_error_t *ep);
1690 extern	int		meta_check_stripe(mdsetname_t *sp,
1691 			    md_stripe_t *stripep, mdcmdopts_t options,
1692 			    md_error_t *ep);
1693 extern	int		meta_create_stripe(mdsetname_t *sp,
1694 			    md_stripe_t *stripep, mdcmdopts_t options,
1695 			    md_error_t *ep);
1696 extern	int		meta_init_stripe(mdsetname_t **spp,
1697 			    int argc, char *argv[], mdcmdopts_t options,
1698 			    md_error_t *ep);
1699 extern	int		meta_stripe_reset(mdsetname_t *sp, mdname_t *stripenp,
1700 			    mdcmdopts_t options, md_error_t *ep);
1701 extern	int		meta_stripe_anycomp_is_err(mdsetname_t *,
1702 			    mdnamelist_t *);
1703 
1704 /* meta_systemfile.c */
1705 extern	int		meta_systemfile_copy(char *sname, int doroot,
1706 			    int domddb, int doit, int verbose, char **tname,
1707 			    FILE **tfp, md_error_t *ep);
1708 extern	int		meta_systemfile_append_mdroot(mdname_t *rootnp,
1709 			    char *sname, char *tname, FILE *tfp, int ismeta,
1710 			    int doit, int verbose, md_error_t *ep);
1711 extern	int		meta_systemfile_append_mddb(char *cname, char *sname,
1712 			    char *tname, FILE *tfp, int doit, int verbose,
1713 			    int check, md_error_t *ep);
1714 
1715 /* meta_tab.c */
1716 extern	void		meta_tab_dump(md_tab_t *tabp, FILE *fp);
1717 extern	void		meta_tab_free(md_tab_t *tabp);
1718 extern	md_tab_t	*meta_tab_parse(char *filename, md_error_t *ep);
1719 extern	md_tab_line_t	*meta_tab_find(mdsetname_t *sp, md_tab_t *tabp,
1720 			    char *name, mdinittypes_t type);
1721 
1722 /* meta_trans.c */
1723 extern	int		meta_trans_replace(mdsetname_t *sp, mdname_t *transnp,
1724 			    mdname_t *oldnp, mdname_t *newnp,
1725 			    mdcmdopts_t options, md_error_t *ep);
1726 extern	int		meta_get_trans_names(mdsetname_t *sp,
1727 			    mdnamelist_t **nlpp, int options, md_error_t *ep);
1728 extern	void		meta_free_trans(md_trans_t *transp);
1729 extern	md_trans_t	*meta_get_trans(mdsetname_t *sp, mdname_t *transnp,
1730 			    md_error_t *ep);
1731 extern	md_trans_t	*meta_get_trans_common(mdsetname_t *sp,
1732 			    mdname_t *transnp, int fast, md_error_t *ep);
1733 extern	int		meta_check_intrans(mdsetname_t *sp, mdname_t *np,
1734 			    mdchkopts_t options, diskaddr_t slblk,
1735 			    diskaddr_t nblks, md_error_t *ep);
1736 extern	int		meta_check_master(mdsetname_t *sp, mdname_t *np,
1737 			    int force, md_error_t *ep);
1738 extern	int		meta_check_log(mdsetname_t *sp, mdname_t *np,
1739 			    md_error_t *ep);
1740 extern	char		*mt_l_error_to_name(md_trans_t *transp,
1741 			    md_timeval32_t *tvp, uint_t tstate);
1742 extern	char		*mt_flags_to_name(md_trans_t *transp,
1743 			    md_timeval32_t *tvp, uint_t tstate);
1744 extern	char		*mt_flags_to_action(md_trans_t *transp);
1745 extern	char		*mt_l_error_to_action(
1746 				mdsetname_t	*sp,
1747 				mdnamelist_t	*transnlp,
1748 				mdname_t	*lognamep,
1749 				md_error_t	*ep);
1750 extern	int		meta_trans_print(mdsetname_t *sp, mdname_t *transnp,
1751 			    mdnamelist_t **nlistpp, char *fname, FILE *fp,
1752 			    mdprtopts_t options, int *meta_print_trans_msgp,
1753 			    mdnamelist_t **lognlpp, md_error_t *ep);
1754 extern	int		meta_logs_print(mdsetname_t *sp, mdnamelist_t *lognlp,
1755 			    mdnamelist_t **nlistpp, char *fname, FILE *fp,
1756 			    mdprtopts_t options, md_error_t *ep);
1757 extern	int		meta_trans_attach(mdsetname_t *sp, mdname_t *transnp,
1758 			    mdname_t *lognp, mdcmdopts_t options,
1759 			    md_error_t *ep);
1760 extern	int		meta_trans_detach(mdsetname_t *sp, mdname_t *transnp,
1761 			    mdcmdopts_t options, int *delayed, md_error_t *ep);
1762 extern	int		meta_check_trans(mdsetname_t *sp, md_trans_t *transp,
1763 			    mdcmdopts_t options, md_error_t *ep);
1764 extern	int		meta_create_trans(mdsetname_t *sp, md_trans_t *transp,
1765 			    mdcmdopts_t options, char *uname, md_error_t *ep);
1766 extern	int		meta_init_trans(mdsetname_t **spp,
1767 			    int argc, char *argv[], mdcmdopts_t options,
1768 			    md_error_t *ep);
1769 extern	int		meta_trans_reset(mdsetname_t *sp, mdname_t *transnp,
1770 			    mdcmdopts_t options, md_error_t *ep);
1771 
1772 /* meta_userflags.c */
1773 extern int		meta_getuserflags(mdsetname_t *sp, mdname_t *np,
1774 			    uint_t *userflags, md_error_t *ep);
1775 extern int		meta_setuserflags(mdsetname_t *sp, mdname_t *np,
1776 			    uint_t userflags, md_error_t *ep);
1777 
1778 /* metarpcopen.c */
1779 extern CLIENT		*meta_client_create_retry(char *hostname,
1780 				clnt_create_func_t func, void *data,
1781 				time_t tout, md_error_t *ep);
1782 extern	CLIENT		*meta_client_create(char *host, rpcprog_t prognum,
1783 				rpcvers_t version, char *nettype);
1784 extern	CLIENT		*metarpcopen(char *hostname, long time_out,
1785 			    md_error_t *ep);
1786 extern	void		metarpcclose(CLIENT *clntp);
1787 extern	void		metarpccloseall(void);
1788 extern	int		cl_sto(CLIENT *clntp, char *hostname, long time_out,
1789 			    md_error_t *ep);
1790 
1791 /* metasplitname.c */
1792 extern	int		splitname(char *devname, md_splitname *splitname);
1793 extern	char		*splicename(md_splitname *splitname);
1794 
1795 /* meta_notify.c */
1796 extern	int		meta_notify_createq(char *qname, ulong_t flags,
1797 			    md_error_t *ep);
1798 extern	int		meta_notify_deleteq(char *qname, md_error_t *ep);
1799 extern	int		meta_notify_validq(char *qname, md_error_t *ep);
1800 extern	int		meta_notify_listq(char ***qnames, md_error_t *ep);
1801 extern	int		meta_notify_flushq(char *qname, md_error_t *ep);
1802 
1803 extern	int		meta_notify_getev(char *qname, ulong_t flags,
1804 			    md_ev_t *evp, md_error_t *ep);
1805 extern	int		meta_notify_getevlist(char *qname, ulong_t flags,
1806 			    md_evlist_t **evlpp, md_error_t *ep);
1807 extern	int		meta_notify_putev(md_ev_t *evp, md_error_t *ep);
1808 extern	int		meta_notify_putevlist(md_evlist_t *evlistp,
1809 			    md_error_t *ep);
1810 extern	void		meta_notify_freeevlist(md_evlist_t *evlp);
1811 
1812 extern	int		meta_notify_sendev(ev_obj_t tag, set_t set,
1813 			    md_dev64_t dev, evid_t event);
1814 
1815 extern	int		meta_exchange(mdsetname_t *, mdname_t *, mdname_t *,
1816 			    mdcmdopts_t, md_error_t *);
1817 extern	int		meta_rename(mdsetname_t *, mdname_t *, mdname_t *,
1818 			    mdcmdopts_t, md_error_t *);
1819 /* meta_se_notify.c */
1820 extern  void		meta_svm_sysevent(char *se_class, char *se_subclass,
1821 			    uint32_t tag, set_t setno, md_dev64_t devid);
1822 
1823 /* metgetroot.c */
1824 extern  void		*meta_get_current_root(md_error_t *ep);
1825 extern  mdname_t	*meta_get_current_root_dev(mdsetname_t *sp,
1826 			    md_error_t *ep);
1827 
1828 /* meta_time.c */
1829 extern  int		meta_gettimeofday(md_timeval32_t *tv);
1830 
1831 /* meta_devadm.c */
1832 extern	int		meta_update_namespace(set_t setno, side_t sideno,
1833 			    char *devname, md_dev64_t dev, mdkey_t key,
1834 			    char *pname, md_error_t *ep);
1835 extern	int		meta_fixdevid(mdsetname_t *sp, mddevopts_t options,
1836 			    char *diskname, md_error_t *ep);
1837 extern	int		meta_upd_ctdnames(mdsetname_t **sp, set_t setno,
1838 			    side_t sideno, mddrivename_t *dnp, char **newname,
1839 			    md_error_t *ep);
1840 extern  int		pathname_reload(mdsetname_t **sp, set_t setno,
1841 			    md_error_t *ep);
1842 extern	int		meta_update_devtree(minor_t mnum);
1843 
1844 /* meta_mn_comm.c */
1845 extern int		mdmn_send_message(set_t setno, md_mn_msgtype_t type,
1846 			    uint_t flags, char *data, int size,
1847 			    md_mn_result_t **resp, md_error_t *ep);
1848 extern int		mdmn_send_message_with_msgid(set_t setno,
1849 			    md_mn_msgtype_t type, uint_t flags, char *data,
1850 			    int size, md_mn_result_t **resp,
1851 			    md_mn_msgid_t *msgid, md_error_t *ep);
1852 extern int		mdmn_create_msgid(md_mn_msgid_t *id);
1853 extern int		mdmn_reinit_set(set_t setno, long timeout);
1854 extern int		mdmn_resume(set_t setno, md_mn_msgclass_t class,
1855 			    uint_t flags, long timeout);
1856 extern int		mdmn_suspend(set_t setno, md_mn_msgclass_t class,
1857 			    long timeout);
1858 extern int		mdmn_msgtype_lock(md_mn_msgtype_t msgtype,
1859 			    uint_t locktype);
1860 extern void		mdmn_abort(void);
1861 extern md_mn_result_t	*copy_result(md_mn_result_t *res);
1862 extern void		free_result(md_mn_result_t *res);
1863 extern md_mn_msg_t	*copy_msg(md_mn_msg_t *src, md_mn_msg_t *dest);
1864 
1865 /* meta_import.c */
1866 extern	int		read_master_block(md_error_t *ep, int fd, void *bp,
1867 			    int bsize);
1868 extern	int		read_database_block(md_error_t *, int, mddb_mb_t *, int,
1869 			    void *, int);
1870 extern	daddr_t		getphysblk(mddb_block_t, mddb_mb_t *);
1871 
1872 extern	md_im_drive_info_t	*pick_good_disk(md_im_set_desc_t *misp);
1873 
1874 extern	void		meta_unrslv_replicated_mb(mdsetname_t *sp,
1875 			    md_drive_desc *dd, mddrivenamelist_t *dnlp,
1876 			    md_error_t *ep);
1877 extern	void		meta_unrslv_replicated_nm(mdsetname_t *sp,
1878 			    md_drive_desc *dd, mddrivenamelist_t *dnlp,
1879 			    md_error_t *ep);
1880 extern  void *		replicated_list_lookup(uint_t devid_len,
1881 			    void *old_devid);
1882 extern  int		build_replicated_disks_list(md_error_t *ep,
1883 			    mddrivenamelist_t *dnlp);
1884 
1885 /*
1886  * pnm_rec is used to store the mapping from keys in the NM namespace
1887  * to actual physical devices.  The current name of a physical device, used
1888  * by a set that can be imported, can be retrieved by matching the did_key
1889  * (deviceID entry) in the DID_SHR_NM namespace to the min_devid_key in the
1890  * DID_NM namespace(the did_key to the min_key).  Then matching the min_key
1891  * in the DID_NM namespace to the n_key in the NM namespace.
1892  *
1893  * n_name is defined to be an array, so that only one malloc is needed for the
1894  * entire datastructure.
1895  */
1896 typedef struct pnm_rec {
1897 	mdkey_t		n_key;  /* The n_key/min_key value */
1898 	struct pnm_rec	*next;
1899 	ushort_t	n_namlen;
1900 	char		n_name[1]; /* The name of the physical device */
1901 } pnm_rec_t;
1902 
1903 /* Indentation value for metaimport output */
1904 #define	META_INDENT			4
1905 
1906 /* Flags for metaimport reporting */
1907 #define	META_IMP_REPORT		0x0001
1908 #define	META_IMP_VERBOSE	0x0002
1909 #define	META_IMP_PASS1		0x1000
1910 
1911 extern	int			meta_list_disks(md_error_t *, md_im_names_t *);
1912 extern	mddrivenamelist_t	*meta_prune_cnames(md_error_t *,
1913 				    md_im_names_t *, int);
1914 extern	int			meta_get_and_report_set_info(
1915 				    mddrivenamelist_t *, md_im_set_desc_t **,
1916 				    int, uint_t, int *, int,
1917 				    md_im_drive_info_t *, md_error_t *);
1918 extern	void			free_pnm_rec_list(pnm_rec_t **);
1919 extern	int			meta_imp_set(md_im_set_desc_t *,
1920 				    char *, int, bool_t, md_error_t *);
1921 extern	int			meta_imp_drvused(mdsetname_t *sp,
1922 				    mddrivename_t *dnp, md_error_t *ep);
1923 extern	int			meta_replica_quorum(md_im_set_desc_t *misp);
1924 extern	int			meta_imp_set_adddrives(mdsetname_t *sp,
1925 				    mddrivenamelist_t *dnlp,
1926 				    md_im_set_desc_t *misp, md_error_t *ep);
1927 extern	void			meta_free_im_set_desc(md_im_set_desc_t *misp);
1928 extern	int			clnt_imp_adddrvs(char *hostname,
1929 				    mdsetname_t *sp, md_drive_desc *dd,
1930 				    md_timeval32_t timestamp,
1931 				    ulong_t genid, md_error_t *ep);
1932 
1933 /* Flags for direction in copy_msg_1 */
1934 #define	MD_MN_COPY_TO_ONDISK 0x0001
1935 #define	MD_MN_COPY_TO_INCORE 0x0002
1936 
1937 extern void		copy_msg_1(md_mn_msg_t *incorep,
1938 			    md_mn_msg_od_t *ondiskp, int direction);
1939 extern void		free_msg(md_mn_msg_t *msg);
1940 
1941 extern md_mn_msgclass_t	mdmn_get_message_class(md_mn_msgtype_t msgtype);
1942 extern void		(*mdmn_get_handler(md_mn_msgtype_t msgtype))
1943 			    (md_mn_msg_t *msg, uint_t flags,
1944 			    md_mn_result_t *res);
1945 extern int		(*mdmn_get_submessage_generator(md_mn_msgtype_t type))
1946 			    (md_mn_msg_t *msg, md_mn_msg_t **msglist);
1947 extern time_t		mdmn_get_timeout(md_mn_msgtype_t msgtype);
1948 
1949 extern	int		meta_read_nodelist(int *nodecnt,
1950 			    mndiskset_membershiplist_t **nl, md_error_t *ep);
1951 extern	int		meta_write_nodelist(int nodecnt, char **nids,
1952 			    md_error_t *ep);
1953 extern	void		meta_free_nodelist(mndiskset_membershiplist_t *nl);
1954 
1955 /* meta_mn_subr.c */
1956 /* defines for flags argument for meta_mn_send_command() */
1957 #define	MD_DISP_STDERR			0x0000
1958 #define	MD_IGNORE_STDERR		0x0001
1959 #define	MD_DRYRUN			0x0002
1960 #define	MD_RETRY_BUSY			0x0004
1961 #define	MD_NOLOG			0x0008
1962 #define	MD_PANIC_WHEN_INCONSISTENT	0x0010
1963 
1964 /* define for initall_context argument for meta_mn_send_command() */
1965 #define	NO_CONTEXT_STRING	NULL
1966 
1967 extern int		meta_is_mn_set(mdsetname_t *sp, md_error_t *ep);
1968 extern int		meta_is_mn_name(mdsetname_t **sp, char *name,
1969 			    md_error_t *ep);
1970 extern void		meta_ping_mnset(set_t setno);
1971 extern int		meta_mn_send_command(mdsetname_t *sp, int argc,
1972 			    char *argv[], int flags, char *initall_context,
1973 			    md_error_t *ep);
1974 extern int		meta_mn_send_suspend_writes(minor_t mnum,
1975 			    md_error_t *ep);
1976 extern int		meta_mn_send_setsync(mdsetname_t *sp,
1977 			    mdname_t *mirnp, daddr_t size, md_error_t *ep);
1978 extern int		meta_mn_send_metaclear_command(mdsetname_t *sp,
1979 			    char *name, mdcmdopts_t options, int pflag,
1980 			    md_error_t *ep);
1981 extern int		meta_mn_send_resync_starting(mdname_t *mirnp,
1982 			    md_error_t *ep);
1983 extern int		meta_mn_change_owner(md_set_mmown_params_t **opp,
1984 			    set_t setno, uint_t mnum, uint_t owner,
1985 			    uint_t flags);
1986 extern int		meta_mn_singlenode(void);
1987 extern int		meta_mn_send_get_tstate(md_dev64_t dev, uint_t *tstatep,
1988 			    md_error_t *ep);
1989 /* meta_set_prv.c */
1990 extern int		setup_db_bydd(mdsetname_t *sp, md_drive_desc *dd,
1991 			    int force, md_error_t *ep);
1992 extern int		snarf_set(mdsetname_t *sp, bool_t stale_bool,
1993 			    md_error_t *ep);
1994 extern int		halt_set(mdsetname_t *sp, md_error_t *ep);
1995 
1996 /* meta_statconcise.c */
1997 extern  void		print_concise_entry(int indent, char *name,
1998 			    diskaddr_t size, char mtype);
1999 extern	char		*meta_get_raid_col_state(rcs_state_t);
2000 extern	char		*meta_get_stripe_state(comp_state_t);
2001 extern	char		*meta_get_hs_state(hotspare_states_t);
2002 extern	int		report_metastat_info(mddb_mb_t *, mddb_lb_t *,
2003 			    mddb_rb_t *, pnm_rec_t **, mdname_t *, int,
2004 			    md_timeval32_t *, md_error_t *);
2005 
2006 #ifdef	__cplusplus
2007 }
2008 #endif
2009 
2010 #endif	/* _META_H */
2011