xref: /onnv-gate/usr/src/uts/common/sys/lvm/mdvar.h (revision 12678:79fad257c978)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
51623Stw21770  * Common Development and Distribution License (the "License").
61623Stw21770  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
217563SPrasad.Singamsetty@Sun.COM 
220Sstevel@tonic-gate /*
23*12678SJames.Hall@Sun.COM  * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
240Sstevel@tonic-gate  */
250Sstevel@tonic-gate 
260Sstevel@tonic-gate #ifndef	_SYS_MDVAR_H
270Sstevel@tonic-gate #define	_SYS_MDVAR_H
280Sstevel@tonic-gate 
290Sstevel@tonic-gate #include <sys/types.h>
300Sstevel@tonic-gate #include <sys/kmem.h>
310Sstevel@tonic-gate #include <sys/mkdev.h>
320Sstevel@tonic-gate #include <sys/param.h>
330Sstevel@tonic-gate #include <sys/systm.h>
340Sstevel@tonic-gate #include <sys/t_lock.h>
350Sstevel@tonic-gate #include <sys/open.h>
360Sstevel@tonic-gate #include <sys/devops.h>
370Sstevel@tonic-gate #include <sys/modctl.h>
380Sstevel@tonic-gate #ifdef	DEBUG
390Sstevel@tonic-gate #include <sys/thread.h>
400Sstevel@tonic-gate #endif
410Sstevel@tonic-gate #include <sys/kstat.h>
420Sstevel@tonic-gate #include <sys/efi_partition.h>
430Sstevel@tonic-gate #include <sys/byteorder.h>
440Sstevel@tonic-gate #include <sys/door.h>
450Sstevel@tonic-gate 
460Sstevel@tonic-gate #include <sys/lvm/mdmn_commd.h>
470Sstevel@tonic-gate #include <sys/lvm/mdio.h>
480Sstevel@tonic-gate #include <sys/lvm/md_mdiox.h>
490Sstevel@tonic-gate #include <sys/lvm/md_mddb.h>
500Sstevel@tonic-gate #include <sys/lvm/md_notify.h>
510Sstevel@tonic-gate 
520Sstevel@tonic-gate #ifdef	__cplusplus
530Sstevel@tonic-gate extern "C" {
540Sstevel@tonic-gate #endif
550Sstevel@tonic-gate 
560Sstevel@tonic-gate /*
570Sstevel@tonic-gate  * defaults
580Sstevel@tonic-gate  */
590Sstevel@tonic-gate #define	NMD_DEFAULT		128	/* number of metadevices */
600Sstevel@tonic-gate #define	MD_NOPS			25	/* number of misc modules */
610Sstevel@tonic-gate #define	MAXBOOTLIST		64
620Sstevel@tonic-gate 
630Sstevel@tonic-gate /*
640Sstevel@tonic-gate  * Needed for backwards-compatibility with metadevices created under
650Sstevel@tonic-gate  * 2.6 or earlier.  Back then, a krwlock_t was twelve bytes.  More
660Sstevel@tonic-gate  * recently, it's four bytes.  Since these get included in structures
670Sstevel@tonic-gate  * written out to disk, we have to make sure we're using the largest
680Sstevel@tonic-gate  * size.  Things will get interesting if krwlock_t ever gets bigger
690Sstevel@tonic-gate  * than twelve bytes.
700Sstevel@tonic-gate  */
710Sstevel@tonic-gate 
720Sstevel@tonic-gate typedef union _md_krwlock {
730Sstevel@tonic-gate 	krwlock_t	lock;
740Sstevel@tonic-gate 	struct {
750Sstevel@tonic-gate 		void	*_opaque[3];
760Sstevel@tonic-gate 	} xx;
770Sstevel@tonic-gate } md_krwlock_t;
780Sstevel@tonic-gate 
790Sstevel@tonic-gate typedef struct {
800Sstevel@tonic-gate 	kmutex_t	md_io_mx;		/* counter mutex */
810Sstevel@tonic-gate 	kcondvar_t	md_io_cv;		/* ioctl wait on if draining */
820Sstevel@tonic-gate 	long		io_cnt;			/* number of I/Os */
830Sstevel@tonic-gate 	long		io_state;		/* !0 if waiting on zero */
840Sstevel@tonic-gate } md_set_io_t;
850Sstevel@tonic-gate 
860Sstevel@tonic-gate typedef enum set_iostate {
870Sstevel@tonic-gate 	MD_SET_ACTIVE = 1,
880Sstevel@tonic-gate 	MD_SET_RELEASE = 2
890Sstevel@tonic-gate }set_iostate_t;
900Sstevel@tonic-gate 
910Sstevel@tonic-gate /*
920Sstevel@tonic-gate  * for md_dev64_t translation
930Sstevel@tonic-gate  */
940Sstevel@tonic-gate struct md_xlate_table {
950Sstevel@tonic-gate 	dev32_t		mini_devt;
960Sstevel@tonic-gate 	dev32_t		targ_devt;
970Sstevel@tonic-gate };
980Sstevel@tonic-gate 
990Sstevel@tonic-gate extern struct md_xlate_table	*md_tuple_table;
1000Sstevel@tonic-gate 
1010Sstevel@tonic-gate /*
1020Sstevel@tonic-gate  * for major number translation
1030Sstevel@tonic-gate  */
1040Sstevel@tonic-gate 
1050Sstevel@tonic-gate struct md_xlate_major_table {
1060Sstevel@tonic-gate 	char		*drv_name;
1070Sstevel@tonic-gate 	major_t		targ_maj;
1080Sstevel@tonic-gate };
1090Sstevel@tonic-gate 
1100Sstevel@tonic-gate extern struct md_xlate_major_table *md_major_tuple_table;
1110Sstevel@tonic-gate 
1120Sstevel@tonic-gate extern int	md_tuple_length;
1130Sstevel@tonic-gate extern uint_t	md_majortab_len;
1140Sstevel@tonic-gate extern int	md_in_upgrade;
1150Sstevel@tonic-gate 
1160Sstevel@tonic-gate extern md_mn_nodeid_t	md_mn_mynode_id;
1170Sstevel@tonic-gate 
1180Sstevel@tonic-gate #define	MD_UPGRADE (md_in_upgrade == 1)
1190Sstevel@tonic-gate 
1200Sstevel@tonic-gate /*
1210Sstevel@tonic-gate  * Flags used during upgrade:
1220Sstevel@tonic-gate  *
1230Sstevel@tonic-gate  * md_keep_repl_state flag means that mddb should be kept in the format
1240Sstevel@tonic-gate  *   that was found on disk (non-device id format vs. device id format).
1250Sstevel@tonic-gate  *   This is used during the upgrade process when install is probing
1260Sstevel@tonic-gate  *   for root disks so that the user can choose the one to be upgraded.
1270Sstevel@tonic-gate  *
1280Sstevel@tonic-gate  * md_devid_destroy flag is used to destroy device ids stored in the
1290Sstevel@tonic-gate  *   metadevice state database (mddb).
1300Sstevel@tonic-gate  *
1310Sstevel@tonic-gate  *   The md_devid_destroy flag is to be used only in a catastrophic failure
1320Sstevel@tonic-gate  *   case. An example of this would be if a user upgrades firmware on all
1330Sstevel@tonic-gate  *   disks where this causes the disks to now have different device id's.
1340Sstevel@tonic-gate  *   The user would not be able to boot a mirror'd root filesystem since the
1350Sstevel@tonic-gate  *   system would recognize none of the device id's stored in the mddb.
1360Sstevel@tonic-gate  *   This flag would destroy all device id information stored in the mddb and
1370Sstevel@tonic-gate  *   if the md_keep_repl_state flag was not set, the mddb would be reconverted
1380Sstevel@tonic-gate  *   to device id format on SLVM startup and all of the device id
1390Sstevel@tonic-gate  *   information would be regenerated.
1400Sstevel@tonic-gate  *
1410Sstevel@tonic-gate  *   If the md_devid_destroy flag is set and the md_keep_repl_state flag is
1420Sstevel@tonic-gate  *   set, the mddb's would have their device id information destroyed and
1430Sstevel@tonic-gate  *   would be left in non-devid format since the device id information would
1440Sstevel@tonic-gate  *   not be regenerated.
1450Sstevel@tonic-gate  *
1460Sstevel@tonic-gate  *   This flag is not documented anywhere and is only to be used as a last
1470Sstevel@tonic-gate  *   resort as in the described case or if a device driver has a bug where
1480Sstevel@tonic-gate  *   device id's are found to not be unique.  If device id's aren't unique,
1490Sstevel@tonic-gate  *   the user could run without device id's until a patch is released for
1500Sstevel@tonic-gate  *   that driver.
1510Sstevel@tonic-gate  */
1520Sstevel@tonic-gate extern int	md_keep_repl_state;
1530Sstevel@tonic-gate extern int	md_devid_destroy;
1540Sstevel@tonic-gate extern int	mdmn_door_did;
1550Sstevel@tonic-gate #ifdef _KERNEL
1560Sstevel@tonic-gate extern door_handle_t	mdmn_door_handle;
1570Sstevel@tonic-gate #endif /* _KERNEL */
1580Sstevel@tonic-gate 
1590Sstevel@tonic-gate /*
1600Sstevel@tonic-gate  * An io_lock mechanism for raid, the MD_UL_XXXX bits are used for
1610Sstevel@tonic-gate  * convenience.
1620Sstevel@tonic-gate  */
1630Sstevel@tonic-gate typedef struct md_io_lock {
1640Sstevel@tonic-gate 	ulong_t		io_readercnt;	/* number of unit readers */
1650Sstevel@tonic-gate 	ulong_t		io_wanabecnt;	/* # pending on becoming unit writer */
1660Sstevel@tonic-gate 	ulong_t		io_lock;
1670Sstevel@tonic-gate 	void		*io_list_front;
1680Sstevel@tonic-gate 	void		*io_list_back;
1690Sstevel@tonic-gate 	kmutex_t	io_mx;
1700Sstevel@tonic-gate 	kcondvar_t	io_cv;
1710Sstevel@tonic-gate 	kmutex_t	io_list_mutex;	/* list of waiting io */
1720Sstevel@tonic-gate 	kthread_id_t	io_owner;	/* writer thread */
1730Sstevel@tonic-gate } md_io_lock_t;
1740Sstevel@tonic-gate 
1750Sstevel@tonic-gate /*
1760Sstevel@tonic-gate  * The following flags are in un_flag field of mdc_unit struct.
1770Sstevel@tonic-gate  */
1780Sstevel@tonic-gate #define	MD_LABELED	0x1	/* First sector of the metadevice is a label */
1790Sstevel@tonic-gate #define	MD_EFILABEL	0x2	/* This md has an EFI label and no vtoc */
1800Sstevel@tonic-gate 
1810Sstevel@tonic-gate /*
1820Sstevel@tonic-gate  * This is the number of bytes a DKIOCGETEFI ioctl returns
1830Sstevel@tonic-gate  * For now it's one time the header and once the size for a partition info
1840Sstevel@tonic-gate  */
1850Sstevel@tonic-gate #define	MD_EFI_LABEL_SIZE (sizeof (efi_gpt_t) + sizeof (efi_gpe_t))
1860Sstevel@tonic-gate 
1870Sstevel@tonic-gate /* This is the number of bytes consumed by efi_gpe_PartitionName */
1880Sstevel@tonic-gate #define	MD_EFI_PARTNAME_BYTES (EFI_PART_NAME_LEN * sizeof (ushort_t))
1890Sstevel@tonic-gate 
1900Sstevel@tonic-gate typedef enum hs_cmds {
1910Sstevel@tonic-gate 	HS_GET, HS_FREE, HS_BAD, HSP_INCREF, HSP_DECREF, HS_MKDEV
1920Sstevel@tonic-gate } hs_cmds_t;
1930Sstevel@tonic-gate 
1940Sstevel@tonic-gate typedef struct md_link {
1950Sstevel@tonic-gate 	struct md_link	*ln_next;
1960Sstevel@tonic-gate 	set_t		ln_setno;
1970Sstevel@tonic-gate 	uint_t		ln_id;
1980Sstevel@tonic-gate } md_link_t;
1990Sstevel@tonic-gate 
2000Sstevel@tonic-gate typedef struct mdi_unit {
2010Sstevel@tonic-gate 	md_link_t	ui_link;
2020Sstevel@tonic-gate 	ulong_t		ui_readercnt;	/* number of unit readers */
2030Sstevel@tonic-gate 	ulong_t		ui_wanabecnt;	/* # pending on becoming unit writer */
2040Sstevel@tonic-gate 	ulong_t		ui_lock;
2050Sstevel@tonic-gate 	kmutex_t	ui_mx;
2060Sstevel@tonic-gate 	kcondvar_t	ui_cv;
2070Sstevel@tonic-gate 	int		ui_opsindex;
2080Sstevel@tonic-gate 	uint_t		ui_ocnt[OTYPCNT]; /* open counts */
2090Sstevel@tonic-gate 	md_io_lock_t	*ui_io_lock;	/* pointer to io lock */
2100Sstevel@tonic-gate 	kstat_t		*ui_kstat;	/* kernel statistics */
2110Sstevel@tonic-gate 	kthread_id_t	ui_owner;	/* writer thread */
2120Sstevel@tonic-gate 	uint_t		ui_tstate;	/* transient state bits */
2130Sstevel@tonic-gate 	uint_t		ui_capab;	/* Capability bits supported */
2140Sstevel@tonic-gate } mdi_unit_t;
2150Sstevel@tonic-gate 
2160Sstevel@tonic-gate /*
2170Sstevel@tonic-gate  * Following are used with ui_lock
2180Sstevel@tonic-gate  * which is in the unit incore structure.
2190Sstevel@tonic-gate  */
2200Sstevel@tonic-gate #define	MD_UL_WRITER		0x0001 /* Stall all new strategy calls */
2210Sstevel@tonic-gate #define	MD_UL_WANABEWRITER	0x0002
2220Sstevel@tonic-gate #define	MD_UL_OPENORCLOSE	0x0004
2230Sstevel@tonic-gate 
2240Sstevel@tonic-gate #define	MD_UL_OPEN		0x0008	/* unit is open */
2250Sstevel@tonic-gate #define	MD_UL_EXCL		0x0010	/* unit is open exclusively */
2260Sstevel@tonic-gate 
2270Sstevel@tonic-gate /*
2280Sstevel@tonic-gate  * The softpart open code may do an I/O to validate the watermarks
2290Sstevel@tonic-gate  * and should hold no open locks during this I/O.  So, mark the unit
2300Sstevel@tonic-gate  * as OPENINPROGRESS and drop the locks.  This will keep any other
2310Sstevel@tonic-gate  * softpart open's waiting until the validate has completed.
2320Sstevel@tonic-gate  */
2330Sstevel@tonic-gate #define	MD_UL_OPENINPROGRESS	0x0020	/* Open in Progress */
2340Sstevel@tonic-gate 
2350Sstevel@tonic-gate /*
2360Sstevel@tonic-gate  * Following are used with ui_tstate to specify any transient states which
2370Sstevel@tonic-gate  * occur during metadevice operation. These are not written to the metadb as
2380Sstevel@tonic-gate  * they do not represent a failure of the underlying metadevice.
2390Sstevel@tonic-gate  * Transient errors are stored in the lower 16 bits and other transient
2400Sstevel@tonic-gate  * state is stored in the upper 16 bits.
2410Sstevel@tonic-gate  * MD_NOTOPENABLE should contain all the states that are set prior to an
2420Sstevel@tonic-gate  * open (by snarf) and that indicate that a metadevice cannot be opened.
2430Sstevel@tonic-gate  */
2440Sstevel@tonic-gate #define	MD_DEV_ERRORED		0x0000ffff /* ui_tstate error bits */
2450Sstevel@tonic-gate #define	MD_EOF_METADEVICE	0x00000001 /* EOF'd metadevice */
2460Sstevel@tonic-gate #define	MD_64MD_ON_32KERNEL	0x00000002 /* 64bit metadev on 32bit kernel */
2470Sstevel@tonic-gate #define	MD_INACCESSIBLE		0x00000004 /* metadevice unavailable */
2480Sstevel@tonic-gate #define	MD_RETRYING		0x00010000 /* retrying errored failfast I/O */
2490Sstevel@tonic-gate #define	MD_OPENLOCKED		0x00020000 /* MN: open locked before removing */
2500Sstevel@tonic-gate #define	MD_ERR_PENDING		0x00040000 /* MN: error pending */
2510Sstevel@tonic-gate #define	MD_ABR_CAP		0x00080000 /* MN: Application Based Recovery */
2520Sstevel@tonic-gate #define	MD_DMR_CAP		0x00100000 /* MN: Directed Mirror Read */
2530Sstevel@tonic-gate #define	MD_RELEASE_IOERR_DONE	0x00200000 /* ioerr console message done */
2540Sstevel@tonic-gate #define	MD_RESYNC_NOT_DONE	0x00400000 /* resync not done yet */
2550Sstevel@tonic-gate 
2560Sstevel@tonic-gate /* A metadevice cannot be opened when these states are set */
2570Sstevel@tonic-gate #define	MD_NOTOPENABLE		(MD_EOF_METADEVICE|MD_64MD_ON_32KERNEL)
2580Sstevel@tonic-gate 
2590Sstevel@tonic-gate typedef struct md_ioctl_lock {
2600Sstevel@tonic-gate 	int		l_flags;	/* locks held */
2610Sstevel@tonic-gate 	mdi_unit_t	*l_ui;		/* unit for which lock is held */
2620Sstevel@tonic-gate } md_ioctl_lock_t;
2630Sstevel@tonic-gate 
2640Sstevel@tonic-gate #define	MD_MASTER_DROPPED	0x0001
2650Sstevel@tonic-gate #define	MD_READER_HELD		0x0002
2660Sstevel@tonic-gate #define	MD_WRITER_HELD		0x0004
2670Sstevel@tonic-gate #define	MD_IO_HELD		0x0008
2680Sstevel@tonic-gate #define	MD_ARRAY_READER		0x0010
2690Sstevel@tonic-gate #define	MD_ARRAY_WRITER		0x0020
2700Sstevel@tonic-gate #define	STALE_OK		0x0100
2710Sstevel@tonic-gate #define	NO_OLD			0x0200
2720Sstevel@tonic-gate #define	NO_LOCK			0x0400
2730Sstevel@tonic-gate #define	MD_MT_IOCTL		0x80000 /* MD_GBL_IOCTL_LOCK not set */
2740Sstevel@tonic-gate #define	IOLOCK	md_ioctl_lock_t
2750Sstevel@tonic-gate 
2760Sstevel@tonic-gate #define	WR_LOCK			MD_WRITER_HELD
2770Sstevel@tonic-gate #define	RD_LOCK			MD_READER_HELD | STALE_OK
2780Sstevel@tonic-gate #define	ARRAY_WRITER		MD_ARRAY_WRITER
2790Sstevel@tonic-gate #define	ARRAY_READER		MD_ARRAY_READER
2800Sstevel@tonic-gate #define	WRITERS			MD_WRITER_HELD | MD_IO_HELD | MD_ARRAY_WRITER
2810Sstevel@tonic-gate #define	READERS			RD_LOCK | MD_ARRAY_READER
2820Sstevel@tonic-gate 
2830Sstevel@tonic-gate #define	IOLOCK_RETURN_IOCTLEND(code, lock) \
2840Sstevel@tonic-gate 	md_ioctl_lock_exit((code), (lock)->l_flags, (lock)->l_ui, TRUE)
2850Sstevel@tonic-gate 
2860Sstevel@tonic-gate #define	IOLOCK_RETURN(code, lock) \
2870Sstevel@tonic-gate 	md_ioctl_lock_exit((code), (lock)->l_flags, (lock)->l_ui, FALSE)
2880Sstevel@tonic-gate 
2890Sstevel@tonic-gate #define	IOLOCK_RETURN_RELEASE(code, lock) \
2900Sstevel@tonic-gate 	md_ioctl_releaselocks((code), (lock)->l_flags, (lock)->l_ui)
2910Sstevel@tonic-gate 
2920Sstevel@tonic-gate #define	IOLOCK_RETURN_REACQUIRE(lock) \
2930Sstevel@tonic-gate 	md_ioctl_reacquirelocks((lock)->l_flags, (lock)->l_ui)
2940Sstevel@tonic-gate 
2950Sstevel@tonic-gate #define	IOLOCK_INIT(lock)	bzero((caddr_t)(lock), sizeof (*(lock)))
2960Sstevel@tonic-gate /*
2970Sstevel@tonic-gate  * checks to be sure locks are held
2980Sstevel@tonic-gate  */
2990Sstevel@tonic-gate #define	UNIT_WRITER_HELD(un) \
3000Sstevel@tonic-gate 	(MDI_UNIT(MD_SID(un))->ui_lock & MD_UL_WRITER)
3010Sstevel@tonic-gate #define	UNIT_READER_HELD(un) \
3020Sstevel@tonic-gate 	(MDI_UNIT(MD_SID(un))->ui_readercnt != 0)
3030Sstevel@tonic-gate #define	IO_WRITER_HELD(un) \
3040Sstevel@tonic-gate 	(MDI_UNIT(MD_SID(un))->ui_io_lock->io_lock & MD_UL_WRITER)
3050Sstevel@tonic-gate #define	IO_READER_HELD(un) \
3060Sstevel@tonic-gate 	(MDI_UNIT(MD_SID(un))->ui_io_lock->io_readercnt != 0)
3070Sstevel@tonic-gate 
3080Sstevel@tonic-gate #ifdef  DEBUG
3090Sstevel@tonic-gate #define	STAT_INC(statvar)		\
3100Sstevel@tonic-gate 	statvar++
3110Sstevel@tonic-gate #define	STAT_DEC(statvar)		\
3120Sstevel@tonic-gate 	statvar--
3130Sstevel@tonic-gate #define	STAT_ZERO(statvar)		\
3140Sstevel@tonic-gate 	statvar = 0;
3150Sstevel@tonic-gate #define	STAT_MAX(statmax, statvar)	\
3160Sstevel@tonic-gate 	{				\
3170Sstevel@tonic-gate 	statvar++;			\
3180Sstevel@tonic-gate 	if (statvar > statmax)		\
3190Sstevel@tonic-gate 		statmax = statvar;	\
3200Sstevel@tonic-gate 	}
3210Sstevel@tonic-gate #define	STAT_CHECK(statvar, value)	\
3220Sstevel@tonic-gate 	{				\
3230Sstevel@tonic-gate 	if (value)			\
3240Sstevel@tonic-gate 		statvar++;		\
3250Sstevel@tonic-gate 	}
3260Sstevel@tonic-gate #else
3270Sstevel@tonic-gate #define	STAT_INC(statvar)
3280Sstevel@tonic-gate #define	STAT_DEC(statvar)
3290Sstevel@tonic-gate #define	STAT_ZERO(statvar)
3300Sstevel@tonic-gate #define	STAT_MAX(statmax, statvar)
3310Sstevel@tonic-gate #define	STAT_CHECK(statvar, value)
3320Sstevel@tonic-gate #endif
3330Sstevel@tonic-gate /*
3340Sstevel@tonic-gate  * bit map related macros
3350Sstevel@tonic-gate  */
3360Sstevel@tonic-gate #define	setbit(a, i)	((a)[(i)/NBBY] |= 1<<((i)%NBBY))
3370Sstevel@tonic-gate #define	clrbit(a, i)	((a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
3380Sstevel@tonic-gate #define	isset(a, i)	((a)[(i)/NBBY] & (1<<((i)%NBBY)))
3390Sstevel@tonic-gate #define	isclr(a, i)	(((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
3400Sstevel@tonic-gate 
3410Sstevel@tonic-gate typedef struct daemon_queue {
3420Sstevel@tonic-gate 	int	maxq_len;
3430Sstevel@tonic-gate 	int	qlen;
3440Sstevel@tonic-gate 	int	treqs;		/* total number of requests */
3450Sstevel@tonic-gate 	struct daemon_queue	*dq_next;
3460Sstevel@tonic-gate 	struct daemon_queue	*dq_prev;
3470Sstevel@tonic-gate 	void			(*dq_call)();
3480Sstevel@tonic-gate } daemon_queue_t;
3490Sstevel@tonic-gate 
3500Sstevel@tonic-gate #define	DAEMON_QUEUE daemon_queue_t	dq;
3510Sstevel@tonic-gate 
3520Sstevel@tonic-gate #ifdef _KERNEL
3530Sstevel@tonic-gate #include	<sys/buf.h>
3540Sstevel@tonic-gate #include	<sys/dkio.h>
3550Sstevel@tonic-gate #include	<sys/vtoc.h>
3560Sstevel@tonic-gate 
3570Sstevel@tonic-gate #define	MD_DEV2SET(d)	(MD_MIN2SET(md_getminor(d)))
3580Sstevel@tonic-gate 
3590Sstevel@tonic-gate #define	MD_UNIT(m)	(md_set[MD_MIN2SET(m)].s_un[MD_MIN2UNIT(m)])
3600Sstevel@tonic-gate #define	MDI_UNIT(m)	((mdi_unit_t *) \
3610Sstevel@tonic-gate 			    md_set[MD_MIN2SET(m)].s_ui[MD_MIN2UNIT(m)])
3620Sstevel@tonic-gate #define	MD_VOIDUNIT(m)	(md_set[MD_MIN2SET(m)].s_un[MD_MIN2UNIT(m)])
3630Sstevel@tonic-gate #define	MDI_VOIDUNIT(m)	(md_set[MD_MIN2SET(m)].s_ui[MD_MIN2UNIT(m)])
3640Sstevel@tonic-gate 
3650Sstevel@tonic-gate /*
3660Sstevel@tonic-gate  * This is the current maximum number of real disks per Virtual Disk.
3670Sstevel@tonic-gate  */
3680Sstevel@tonic-gate extern	uint_t	md_mdelay;	/* md_mirror timeout delay */
3690Sstevel@tonic-gate 
3700Sstevel@tonic-gate #define	MD_ADM_MINOR		L_MAXMIN32 /* the minor number for md_admin */
3710Sstevel@tonic-gate #define	MD_MDELAY		(md_mdelay)
3720Sstevel@tonic-gate #define	NUM_USEC_IN_SEC		1000000 /* 1 million usec in a second */
3730Sstevel@tonic-gate 
3740Sstevel@tonic-gate #define	ANY_SERVICE		-1	/* md_get_named_service() wild card */
3750Sstevel@tonic-gate 
3760Sstevel@tonic-gate /*
3770Sstevel@tonic-gate  * daemon threads are used in multiple places in md. The following set of
3780Sstevel@tonic-gate  * structures and routines allow a common way to create and initialize them.
3790Sstevel@tonic-gate  *
3800Sstevel@tonic-gate  * md_requestq_entry_t - entry of creating request queues.
3810Sstevel@tonic-gate  * struct mdq_anchor - request queue header
3820Sstevel@tonic-gate  *
3830Sstevel@tonic-gate  * Functions associated with request queues:
3840Sstevel@tonic-gate  *
3850Sstevel@tonic-gate  * int init_requestq_entry -
3860Sstevel@tonic-gate  * void daemon_request - put a request on the queue.
3870Sstevel@tonic-gate  */
3880Sstevel@tonic-gate 
3890Sstevel@tonic-gate typedef struct md_requestq_entry {
3900Sstevel@tonic-gate 	struct mdq_anchor	*dispq_headp;
3910Sstevel@tonic-gate 	int		*num_threadsp; /* threads servicing the queue */
3920Sstevel@tonic-gate } md_requestq_entry_t;
3930Sstevel@tonic-gate 
3940Sstevel@tonic-gate #define	NULL_REQUESTQ_ENTRY(rqp)\
3950Sstevel@tonic-gate 		((rqp)->dispq_headp == NULL || (rqp)->num_threadsp == NULL)
3960Sstevel@tonic-gate 
3970Sstevel@tonic-gate /* this typedef is used to differentiate between the two call styles */
3980Sstevel@tonic-gate typedef enum callstyle {
3990Sstevel@tonic-gate 	REQ_OLD,
4000Sstevel@tonic-gate 	REQ_NEW
4010Sstevel@tonic-gate } callstyle_t;
4020Sstevel@tonic-gate 
4030Sstevel@tonic-gate 
4040Sstevel@tonic-gate #define	daemon_request_new daemon_request
4050Sstevel@tonic-gate 
4060Sstevel@tonic-gate typedef struct mdq_anchor {
4070Sstevel@tonic-gate 	DAEMON_QUEUE
4080Sstevel@tonic-gate 	kcondvar_t	 a_cv;		/* Request has been put on queue */
4090Sstevel@tonic-gate 	kmutex_t	 a_mx;
4100Sstevel@tonic-gate } mdq_anchor_t;
4110Sstevel@tonic-gate 
4120Sstevel@tonic-gate typedef struct daemon_request {
4130Sstevel@tonic-gate 	DAEMON_QUEUE
4140Sstevel@tonic-gate 	kmutex_t	dr_mx;
4150Sstevel@tonic-gate 	int		dr_pending;
4160Sstevel@tonic-gate 	timeout_id_t	dr_timeout_id;
4170Sstevel@tonic-gate } daemon_request_t;
4180Sstevel@tonic-gate 
4190Sstevel@tonic-gate typedef struct sv_dev {
4200Sstevel@tonic-gate 	set_t	setno;
4210Sstevel@tonic-gate 	side_t	side;
4220Sstevel@tonic-gate 	mdkey_t	key;
4230Sstevel@tonic-gate } sv_dev_t;
4240Sstevel@tonic-gate 
4250Sstevel@tonic-gate /*
4260Sstevel@tonic-gate  * Types of device probes
4270Sstevel@tonic-gate  */
4280Sstevel@tonic-gate 
4290Sstevel@tonic-gate 
4300Sstevel@tonic-gate typedef struct probe_req {
4310Sstevel@tonic-gate 	DAEMON_QUEUE
4320Sstevel@tonic-gate 	minor_t mnum;			/* mnum of the metadevice to probe */
4330Sstevel@tonic-gate 	void   *private_handle;		/* private handle */
4340Sstevel@tonic-gate 	intptr_t (*probe_fcn)();	/* type of probeing to be done */
4350Sstevel@tonic-gate } probe_req_t;
4360Sstevel@tonic-gate 
4370Sstevel@tonic-gate /* Global flags */
4380Sstevel@tonic-gate #define	MD_NO_GBL_LOCKS_HELD	0x0000	/* currently holding no global locks */
4390Sstevel@tonic-gate #define	MD_GBL_DAEMONS_LIVE	0x0001	/* master daemon has been started. */
4400Sstevel@tonic-gate #define	MD_GBL_DAEMONS_DIE	0x0002
4410Sstevel@tonic-gate #define	MD_GBL_HALTED		0x0004	/* driver is shut down */
4420Sstevel@tonic-gate 
4430Sstevel@tonic-gate /* Available bit was GBL_STALE	0x0008	*/
4440Sstevel@tonic-gate 
4450Sstevel@tonic-gate #define	MD_GBL_IOCTL_LOCK	0x0010	/* single-threads ioctls */
4460Sstevel@tonic-gate #define	MD_GBL_HS_LOCK		0x0020	/* single-threads hotspares */
4470Sstevel@tonic-gate #define	MD_GBL_OPEN		0x0040	/* admin is open */
4480Sstevel@tonic-gate #define	MD_GBL_EXCL		0x0080	/* admin is open exclusively */
4490Sstevel@tonic-gate 
4500Sstevel@tonic-gate #define	MD_OFLG_NULL		0x0000	/* Null flag */
4510Sstevel@tonic-gate #define	MD_OFLG_CONT_ERRS	0x0001	/* Continue on open errors */
4520Sstevel@tonic-gate #define	MD_OFLG_PROBEDEV	0x0002  /* force a simulated open */
4530Sstevel@tonic-gate #define	MD_OFLG_ISINIT		0x0004  /* raid initialization */
4540Sstevel@tonic-gate #define	MD_OFLG_FROMIOCTL	0x0008  /* Called from an ioctl handler */
4550Sstevel@tonic-gate 
4560Sstevel@tonic-gate 
4570Sstevel@tonic-gate typedef struct md_named_services {
4580Sstevel@tonic-gate 
4590Sstevel@tonic-gate 	intptr_t	(*md_service)();
4600Sstevel@tonic-gate 	char		*md_name;
4610Sstevel@tonic-gate } md_named_services_t;
4620Sstevel@tonic-gate 
4630Sstevel@tonic-gate typedef enum md_snarfcmd {MD_SNARF_CLEANUP, MD_SNARF_DOIT} md_snarfcmd_t;
4640Sstevel@tonic-gate 
4650Sstevel@tonic-gate typedef struct md_ops {
4660Sstevel@tonic-gate 	int	(*md_open)(
4670Sstevel@tonic-gate 		    dev_t		*devp,
4680Sstevel@tonic-gate 		    int			flag,
4690Sstevel@tonic-gate 		    int			otyp,
4700Sstevel@tonic-gate 		    cred_t		*credp,
4710Sstevel@tonic-gate 		    int			md_oflags);
4720Sstevel@tonic-gate 	int	(*md_close)(
4730Sstevel@tonic-gate 		    dev_t		dev,
4740Sstevel@tonic-gate 		    int			flag,
4750Sstevel@tonic-gate 		    int			otyp,
4760Sstevel@tonic-gate 		    cred_t		*credp,
4770Sstevel@tonic-gate 		    int			md_oflags);
4780Sstevel@tonic-gate 	void	(*md_strategy)(
4790Sstevel@tonic-gate 		    buf_t		*bufp,
4800Sstevel@tonic-gate 		    int			flag,
4810Sstevel@tonic-gate 		    void		*private);
4820Sstevel@tonic-gate 	int	(*md_print)();		/* unused now */
4830Sstevel@tonic-gate 	int	(*md_dump)(
4840Sstevel@tonic-gate 		    dev_t		dev,
4850Sstevel@tonic-gate 		    caddr_t		addr,
4860Sstevel@tonic-gate 		    daddr_t		blkno,
4870Sstevel@tonic-gate 		    int			nblk);
4880Sstevel@tonic-gate 	int	(*md_read)(
4890Sstevel@tonic-gate 		    dev_t		dev,
4900Sstevel@tonic-gate 		    struct uio		*uiop,
4910Sstevel@tonic-gate 		    cred_t		*credp);
4920Sstevel@tonic-gate 	int	(*md_write)(
4930Sstevel@tonic-gate 		    dev_t		dev,
4940Sstevel@tonic-gate 		    struct uio		*uiop,
4950Sstevel@tonic-gate 		    cred_t		*credp);
4960Sstevel@tonic-gate 	int	(*md_ioctl)(
4970Sstevel@tonic-gate 		    dev_t		dev,
4980Sstevel@tonic-gate 		    int			cmd,
4990Sstevel@tonic-gate 		    void		*data,
5000Sstevel@tonic-gate 		    int			mode,
5010Sstevel@tonic-gate 		    IOLOCK		*lockp);
5020Sstevel@tonic-gate 	int	(*md_snarf)(
5030Sstevel@tonic-gate 		    md_snarfcmd_t	cmd,
5040Sstevel@tonic-gate 		    set_t		setno);
5050Sstevel@tonic-gate 	int	(*md_halt)();
5060Sstevel@tonic-gate 	int	(*md_aread)(
5070Sstevel@tonic-gate 		    dev_t		dev,
5080Sstevel@tonic-gate 		    struct aio_req	*aiop,
5090Sstevel@tonic-gate 		    cred_t		*credp);
5100Sstevel@tonic-gate 	int	(*md_awrite)(
5110Sstevel@tonic-gate 		    dev_t		dev,
5120Sstevel@tonic-gate 		    struct aio_req	*aiop,
5130Sstevel@tonic-gate 		    cred_t		*credp);
5140Sstevel@tonic-gate 	int	(*md_imp_set)(
5150Sstevel@tonic-gate 		    set_t		setno);
5160Sstevel@tonic-gate 	md_named_services_t	*md_services;
5170Sstevel@tonic-gate 	md_krwlock_t		md_link_rw;
5180Sstevel@tonic-gate 	md_link_t		*md_head;
5190Sstevel@tonic-gate 	/*
5200Sstevel@tonic-gate 	 * NOTE: when TSlvm s10/onnv compatibility is not an issue:
5210Sstevel@tonic-gate 	 *	o md_modid and md_locked should be deleted.
5220Sstevel@tonic-gate 	 *	o md_mod should be added
5230Sstevel@tonic-gate 	 *		ddi_modhandle_t		md_mod;
5240Sstevel@tonic-gate 	 *	  and used instead of the md_mods array (md_mods should
5250Sstevel@tonic-gate 	 *	  be deleted).
5260Sstevel@tonic-gate 	 */
5270Sstevel@tonic-gate 	int			md_modid;
5280Sstevel@tonic-gate 	int			md_locked;
5290Sstevel@tonic-gate 	int			md_selfindex;
5300Sstevel@tonic-gate 	struct md_ops		*md_next;
5310Sstevel@tonic-gate 	md_driver_t		md_driver;
5320Sstevel@tonic-gate 	/* NOTE: TSlvm depends on offsets in and sizeof this structure */
5330Sstevel@tonic-gate } md_ops_t;
5340Sstevel@tonic-gate 
5350Sstevel@tonic-gate /* macro to generate linkage for a md misc plugin module */
5360Sstevel@tonic-gate #define	md_noop
5370Sstevel@tonic-gate #define	MD_PLUGIN_MISC_MODULE(desc, init_init, fini_uninit)		\
5380Sstevel@tonic-gate 	static struct modlmisc		modlmisc = {			\
5390Sstevel@tonic-gate 		&mod_miscops, "Solaris Volume Manager " desc		\
5400Sstevel@tonic-gate 	};								\
5410Sstevel@tonic-gate 	static struct modlinkage	modlinkage = {			\
5420Sstevel@tonic-gate 		MODREV_1, (void *)&modlmisc, NULL			\
5430Sstevel@tonic-gate 	};								\
5440Sstevel@tonic-gate 	int								\
5450Sstevel@tonic-gate 	_init(void)							\
5460Sstevel@tonic-gate 	{								\
5470Sstevel@tonic-gate 		int	i;						\
5480Sstevel@tonic-gate 		init_init;						\
5490Sstevel@tonic-gate 		if ((i = mod_install(&modlinkage)) != 0) {		\
5500Sstevel@tonic-gate 			fini_uninit;					\
5510Sstevel@tonic-gate 		}							\
5520Sstevel@tonic-gate 		return (i);						\
5530Sstevel@tonic-gate 	}								\
5540Sstevel@tonic-gate 	int								\
5550Sstevel@tonic-gate 	_fini()								\
5560Sstevel@tonic-gate 	{								\
5570Sstevel@tonic-gate 		int	i;                                              \
5580Sstevel@tonic-gate 		if ((i = mod_remove(&modlinkage)) == 0) {		\
5590Sstevel@tonic-gate 			fini_uninit;					\
5600Sstevel@tonic-gate 		}							\
5610Sstevel@tonic-gate 		return (i);						\
5620Sstevel@tonic-gate 	}								\
5630Sstevel@tonic-gate 	int								\
5640Sstevel@tonic-gate 	_info(struct modinfo *modinfop)					\
5650Sstevel@tonic-gate 	{								\
5660Sstevel@tonic-gate 		return (mod_info(&modlinkage, modinfop));		\
5670Sstevel@tonic-gate 	}
5680Sstevel@tonic-gate 
5690Sstevel@tonic-gate typedef enum md_haltcmd {MD_HALT_ALL, MD_HALT_CHECK, MD_HALT_DOIT,
5700Sstevel@tonic-gate 			MD_HALT_CLOSE, MD_HALT_OPEN, MD_HALT_UNLOAD
5710Sstevel@tonic-gate } md_haltcmd_t;
5720Sstevel@tonic-gate 
5730Sstevel@tonic-gate /*
5740Sstevel@tonic-gate  * To support cpr (Energy Star) we need to know when the resync threads are
5750Sstevel@tonic-gate  * running to not allow suspention.
5760Sstevel@tonic-gate  */
5770Sstevel@tonic-gate typedef struct md_resync_thds_cnt {
5780Sstevel@tonic-gate 	int md_raid_resync;	/* count of active raid resync threads */
5790Sstevel@tonic-gate 	int md_mirror_resync;	/* count of active mirror resync threads */
5800Sstevel@tonic-gate 	kmutex_t md_resync_mutex;	/* protects both resync counts */
5810Sstevel@tonic-gate } md_resync_t;
5820Sstevel@tonic-gate 
5830Sstevel@tonic-gate /*
5840Sstevel@tonic-gate  * flags used with call to individual strategy routines
5850Sstevel@tonic-gate  */
5860Sstevel@tonic-gate #define	MD_STR_PASSEDON 0x0000ffff
5870Sstevel@tonic-gate #define	MD_STR_NOTTOP	0x00000001
5880Sstevel@tonic-gate #define	MD_STR_MAPPED	0x00000002	/* set when buf_t is mapped in	*/
5890Sstevel@tonic-gate #define	MD_STR_ABR	0x00000004	/* use ABR to handle any recovery */
5900Sstevel@tonic-gate #define	MD_STR_WMUPDATE	0x00000008	/* set if updating watermarks for sp */
5910Sstevel@tonic-gate #define	MD_IO_COUNTED	0x00000400	/* io has been counted */
5920Sstevel@tonic-gate #define	MD_NOBLOCK	0x00000800	/* do not block io durring release */
5930Sstevel@tonic-gate 
5940Sstevel@tonic-gate #define	MD_STR_WAR	0x00010000	/* this write is write after read */
5950Sstevel@tonic-gate #define	MD_STR_WOW	0x00020000	/* handling a write-on-write */
5960Sstevel@tonic-gate #define	MD_STR_DMR	0x00040000	/* Directed Read request */
5970Sstevel@tonic-gate #define	MD_STR_DIRTY_RD	0x00080000	/* Read of a dirty block */
5980Sstevel@tonic-gate #define	MD_STR_FLAG_ERR	0x00100000	/* Flag any write error on this i/o */
5997975SAchim.Maurer@Sun.COM #define	MD_STR_BLOCK_OK	0x00200000	/* Flag if caller i/o can be blocked */
6000Sstevel@tonic-gate 
6010Sstevel@tonic-gate /*
6020Sstevel@tonic-gate  * Bits for return value of md_getdevnum
6030Sstevel@tonic-gate  */
6040Sstevel@tonic-gate #define	MD_TRUST_DEVT	1
6050Sstevel@tonic-gate #define	MD_NOTRUST_DEVT	0
6060Sstevel@tonic-gate 
6070Sstevel@tonic-gate /* Flag for drivers to pass to kmem_cache_alloc() */
6080Sstevel@tonic-gate #define	MD_ALLOCFLAGS   (KM_PUSHPAGE | KM_SLEEP)
6090Sstevel@tonic-gate 
6100Sstevel@tonic-gate /* Named services */
6110Sstevel@tonic-gate #define	MD_CHECK_OFFLINE	"check_offline"
6120Sstevel@tonic-gate #define	MD_INC_ABR_COUNT	"inc abr count"
6130Sstevel@tonic-gate #define	MD_DEC_ABR_COUNT	"dec abr count"
6140Sstevel@tonic-gate 
6154491Sjmf /* md_getdevname_common flags for namespace lock */
6164491Sjmf #define	MD_WAIT_LOCK	0
6174491Sjmf #define	MD_NOWAIT_LOCK	1
6184491Sjmf 
6190Sstevel@tonic-gate /* Externals from md.c */
6200Sstevel@tonic-gate extern int	md_snarf_db_set(set_t setno, md_error_t *ep);
6210Sstevel@tonic-gate extern void	get_info(struct dk_cinfo *, minor_t);
6220Sstevel@tonic-gate extern void	get_minfo(struct dk_minfo *, minor_t);
6230Sstevel@tonic-gate extern int	mdstrategy(buf_t *);
6240Sstevel@tonic-gate extern int	md_create_minor_node(set_t, minor_t);
6257627SChris.Horne@Sun.COM extern void	md_nblocks_set(minor_t mnum, uint64_t nblocks);
6260Sstevel@tonic-gate 
6270Sstevel@tonic-gate /* External from md_subr.c */
6280Sstevel@tonic-gate extern int	md_inc_iocount(set_t);
6290Sstevel@tonic-gate extern void	md_inc_iocount_noblock(set_t);
6300Sstevel@tonic-gate extern void	md_dec_iocount(set_t);
6310Sstevel@tonic-gate extern int	md_isblock_setio(set_t);
6320Sstevel@tonic-gate extern int	md_block_setio(set_t);
6330Sstevel@tonic-gate extern void	md_clearblock_setio(set_t);
6340Sstevel@tonic-gate extern void	md_unblock_setio(set_t);
6350Sstevel@tonic-gate extern int	md_tas_block_setio(set_t);
6360Sstevel@tonic-gate extern void	md_biodone(struct buf *);
6370Sstevel@tonic-gate extern void	md_bioreset(struct buf *);
6380Sstevel@tonic-gate extern md_dev64_t md_xlate_targ_2_mini(md_dev64_t);
6390Sstevel@tonic-gate extern md_dev64_t md_xlate_mini_2_targ(md_dev64_t);
6400Sstevel@tonic-gate extern void	md_xlate_free(int);
6410Sstevel@tonic-gate extern major_t	md_targ_name_to_major(char *);
6420Sstevel@tonic-gate extern char	*md_targ_major_to_name(major_t);
6430Sstevel@tonic-gate extern void	md_majortab_free();
6440Sstevel@tonic-gate extern void	md_set_status(int);
6450Sstevel@tonic-gate extern void	md_clr_status(int);
6460Sstevel@tonic-gate extern int	md_get_status(void);
6470Sstevel@tonic-gate extern void	md_set_setstatus(set_t, int);
6480Sstevel@tonic-gate extern void	md_clr_setstatus(set_t, int);
6490Sstevel@tonic-gate extern uint_t	md_get_setstatus(set_t);
6500Sstevel@tonic-gate extern void	*md_unit_readerlock(mdi_unit_t *);
6510Sstevel@tonic-gate extern void	*md_unit_writerlock(mdi_unit_t *);
6520Sstevel@tonic-gate extern void	md_unit_readerexit(mdi_unit_t *);
6530Sstevel@tonic-gate extern void	md_unit_writerexit(mdi_unit_t *);
6540Sstevel@tonic-gate extern void	md_ioctl_releaselocks(int, int, mdi_unit_t *);
6550Sstevel@tonic-gate extern void	md_ioctl_reacquirelocks(int, mdi_unit_t *);
6560Sstevel@tonic-gate extern int	md_ioctl_lock_exit(int, int, mdi_unit_t *, int);
6570Sstevel@tonic-gate extern int	md_ioctl_lock_enter(void);
6580Sstevel@tonic-gate extern void	*md_ioctl_readerlock(IOLOCK *, mdi_unit_t *);
6590Sstevel@tonic-gate extern void	md_ioctl_readerexit(IOLOCK *);
6600Sstevel@tonic-gate extern void	*md_ioctl_writerlock(IOLOCK *, mdi_unit_t *);
6610Sstevel@tonic-gate extern void	md_ioctl_writerexit(IOLOCK *);
6620Sstevel@tonic-gate extern void	md_ioctl_io_exit(IOLOCK *);
6630Sstevel@tonic-gate extern void	*md_ioctl_io_lock(IOLOCK *, mdi_unit_t *);
6640Sstevel@tonic-gate extern void	md_ioctl_droplocks(IOLOCK *);
6650Sstevel@tonic-gate extern void	md_array_writer(IOLOCK *);
6660Sstevel@tonic-gate extern void	md_array_reader(IOLOCK *);
6670Sstevel@tonic-gate extern void	*md_ioctl_openclose_enter(IOLOCK *, mdi_unit_t *);
6680Sstevel@tonic-gate extern void	md_ioctl_openclose_exit(IOLOCK *);
6690Sstevel@tonic-gate extern void	md_ioctl_openclose_exit_lh(IOLOCK *);
6700Sstevel@tonic-gate extern void	*md_unit_openclose_enter(mdi_unit_t *);
6710Sstevel@tonic-gate extern void	md_unit_openclose_exit(mdi_unit_t *);
6720Sstevel@tonic-gate extern void	md_unit_openclose_exit_lh(mdi_unit_t *);
6730Sstevel@tonic-gate extern int	md_unit_isopen(mdi_unit_t *ui);
6740Sstevel@tonic-gate extern int	md_unit_incopen(minor_t mnum, int flag, int otyp);
6750Sstevel@tonic-gate extern int	md_unit_decopen(minor_t mnum, int otyp);
6760Sstevel@tonic-gate extern void	*md_io_readerlock(mdi_unit_t *);
6770Sstevel@tonic-gate extern void	*md_io_writerlock(mdi_unit_t *);
6780Sstevel@tonic-gate extern void	md_io_readerexit(mdi_unit_t *);
6790Sstevel@tonic-gate extern void	md_io_writerexit(mdi_unit_t *);
6800Sstevel@tonic-gate extern intptr_t	(*md_get_named_service())();
6810Sstevel@tonic-gate extern int	init_requestq(md_requestq_entry_t *, void (*)(),
6820Sstevel@tonic-gate 						caddr_t, int, int);
6830Sstevel@tonic-gate extern void	daemon_request(mdq_anchor_t *, void(*)(),
6840Sstevel@tonic-gate 				daemon_queue_t *, callstyle_t);
6850Sstevel@tonic-gate extern void	md_daemon(int, mdq_anchor_t *);
6860Sstevel@tonic-gate extern void	mddb_commitrec_wrapper(mddb_recid_t);
6870Sstevel@tonic-gate extern void	mddb_commitrecs_wrapper(mddb_recid_t *);
6880Sstevel@tonic-gate extern void	mddb_deleterec_wrapper(mddb_recid_t);
6890Sstevel@tonic-gate extern void	md_holdset_enter(set_t setno);
6900Sstevel@tonic-gate extern void	md_holdset_exit(set_t setno);
6910Sstevel@tonic-gate extern int	md_holdset_testandenter(set_t setno);
6920Sstevel@tonic-gate extern void	md_haltsnarf_enter(set_t setno);
6930Sstevel@tonic-gate extern void	md_haltsnarf_exit(set_t setno);
6940Sstevel@tonic-gate extern void	md_haltsnarf_wait(set_t setno);
6950Sstevel@tonic-gate extern int	md_halt_set(set_t setno, enum md_haltcmd cmd);
6960Sstevel@tonic-gate extern int	md_halt(int global_lock_flag);
6970Sstevel@tonic-gate extern int	md_layered_open(minor_t, md_dev64_t *, int);
6980Sstevel@tonic-gate extern void	md_layered_close(md_dev64_t, int);
6990Sstevel@tonic-gate extern char	*md_get_device_name(md_dev64_t);
7000Sstevel@tonic-gate extern int	errdone(mdi_unit_t *, struct buf *, int);
7010Sstevel@tonic-gate extern int	md_checkbuf(mdi_unit_t *, md_unit_t *, buf_t *);
7020Sstevel@tonic-gate extern int	md_start_daemons(int init_queues);
7030Sstevel@tonic-gate extern int	md_loadsubmod(set_t, char *, int);
7040Sstevel@tonic-gate extern int	md_getmodindex(md_driver_t *, int, int);
7050Sstevel@tonic-gate extern void	md_call_strategy(buf_t *, int, void *);
7060Sstevel@tonic-gate extern int	md_call_ioctl(md_dev64_t, int, void *, int, IOLOCK *);
7070Sstevel@tonic-gate extern void	md_rem_link(set_t, int, krwlock_t *, md_link_t **);
7080Sstevel@tonic-gate extern int	md_dev_exists(md_dev64_t);
7090Sstevel@tonic-gate extern md_parent_t md_get_parent(md_dev64_t);
7100Sstevel@tonic-gate extern void	md_set_parent(md_dev64_t, md_parent_t);
7110Sstevel@tonic-gate extern void	md_reset_parent(md_dev64_t);
7121623Stw21770 extern struct hot_spare_pool *find_hot_spare_pool(set_t, int);
7130Sstevel@tonic-gate extern int	md_hot_spare_ifc(hs_cmds_t, mddb_recid_t, u_longlong_t, int,
7140Sstevel@tonic-gate 		    mddb_recid_t *, mdkey_t *, md_dev64_t *, diskaddr_t *);
7150Sstevel@tonic-gate extern int	md_notify_interface(md_event_cmds_t cmd, md_tags_t type,
7160Sstevel@tonic-gate 		set_t set, md_dev64_t dev, md_event_type_t event);
7170Sstevel@tonic-gate extern void	svm_gen_sysevent(char *se_class, char *se_subclass,
7180Sstevel@tonic-gate 		    uint32_t tag, set_t setno, md_dev64_t devid);
7190Sstevel@tonic-gate extern void	md_create_unit_incore(minor_t, md_ops_t *, int);
7200Sstevel@tonic-gate extern void	md_destroy_unit_incore(minor_t, md_ops_t *);
7210Sstevel@tonic-gate extern void	md_rem_names(sv_dev_t *, int);
7220Sstevel@tonic-gate struct uio;
7230Sstevel@tonic-gate extern int	md_chk_uio(struct uio *);
7240Sstevel@tonic-gate extern char	*md_shortname(minor_t mnum);
7250Sstevel@tonic-gate extern char	*md_devname(set_t setno, md_dev64_t dev, char *buf,
7260Sstevel@tonic-gate 		size_t size);
7270Sstevel@tonic-gate extern void	md_minphys(buf_t *);
7280Sstevel@tonic-gate extern void	md_kstat_init(minor_t mnum);
7290Sstevel@tonic-gate extern void	md_kstat_init_ui(minor_t mnum, mdi_unit_t *ui);
7300Sstevel@tonic-gate extern void	md_kstat_destroy(minor_t mnum);
7310Sstevel@tonic-gate extern void	md_kstat_destroy_ui(mdi_unit_t *ui);
7320Sstevel@tonic-gate extern void	md_kstat_waitq_enter(mdi_unit_t *ui);
7330Sstevel@tonic-gate extern void	md_kstat_waitq_to_runq(mdi_unit_t *ui);
7340Sstevel@tonic-gate extern void	md_kstat_waitq_exit(mdi_unit_t *ui);
7350Sstevel@tonic-gate extern void	md_kstat_runq_enter(mdi_unit_t *ui);
7360Sstevel@tonic-gate extern void	md_kstat_runq_exit(mdi_unit_t *ui);
7370Sstevel@tonic-gate extern void	md_kstat_done(mdi_unit_t *ui, buf_t *bp, int war);
7380Sstevel@tonic-gate extern pid_t	md_getpid(void);
7390Sstevel@tonic-gate extern proc_t	*md_getproc(void);
7400Sstevel@tonic-gate extern int	md_checkpid(pid_t pid, proc_t *proc);
7410Sstevel@tonic-gate extern char	*md_strdup(char *cp);
7420Sstevel@tonic-gate extern void	freestr(char *cp);
7437563SPrasad.Singamsetty@Sun.COM extern int	md_check_ioctl_against_unit(int, mdc_unit_t);
7440Sstevel@tonic-gate extern mddb_recid_t md_vtoc_to_efi_record(mddb_recid_t, set_t);
7450Sstevel@tonic-gate 
7468452SJohn.Wren.Kennedy@Sun.COM extern int	mdmn_ksend_message(set_t, md_mn_msgtype_t, uint_t,
7478452SJohn.Wren.Kennedy@Sun.COM 		    md_mn_nodeid_t, char *, int, md_mn_kresult_t *);
7480Sstevel@tonic-gate extern void	mdmn_ksend_show_error(int, md_mn_kresult_t *, const char *);
7490Sstevel@tonic-gate extern int	mdmn_send_capability_message(minor_t, volcap_t, IOLOCK *);
7500Sstevel@tonic-gate extern void	mdmn_clear_all_capabilities(minor_t);
7510Sstevel@tonic-gate extern int	md_init_probereq(struct md_probedev_impl *p,
7520Sstevel@tonic-gate 		    daemon_queue_t **hdrpp);
7530Sstevel@tonic-gate extern boolean_t callb_md_mrs_cpr(void *, int);
7541623Stw21770 extern void	md_upd_set_unnext(set_t, unit_t);
7551623Stw21770 extern int	md_rem_selfname(minor_t);
7561623Stw21770 extern void	md_rem_hspname(set_t, mdkey_t);
7578452SJohn.Wren.Kennedy@Sun.COM extern void	*md_create_taskq(set_t, minor_t);
7580Sstevel@tonic-gate 
7590Sstevel@tonic-gate /* Externals from md_ioctl.c */
7600Sstevel@tonic-gate extern int	md_mn_is_commd_present(void);
7618452SJohn.Wren.Kennedy@Sun.COM extern int	md_mn_is_commd_present_lite(void);
7620Sstevel@tonic-gate extern void	md_mn_clear_commd_present(void);
7630Sstevel@tonic-gate extern int	md_admin_ioctl(md_dev64_t, int, caddr_t, int, IOLOCK *lockp);
7640Sstevel@tonic-gate extern void	md_get_geom(md_unit_t *, struct dk_geom *);
7657563SPrasad.Singamsetty@Sun.COM extern int	md_set_vtoc(md_unit_t *, struct vtoc *);
7660Sstevel@tonic-gate extern void	md_get_vtoc(md_unit_t *, struct vtoc *);
7677563SPrasad.Singamsetty@Sun.COM extern int	md_set_extvtoc(md_unit_t *, struct extvtoc *);
7687563SPrasad.Singamsetty@Sun.COM extern void	md_get_extvtoc(md_unit_t *, struct extvtoc *);
7690Sstevel@tonic-gate extern void	md_get_cgapart(md_unit_t *, struct dk_map *);
7700Sstevel@tonic-gate extern void	md_get_efi(md_unit_t *, char *);
7710Sstevel@tonic-gate extern int	md_set_efi(md_unit_t *, char *);
7720Sstevel@tonic-gate extern int	md_dkiocgetefi(minor_t, void *, int);
7730Sstevel@tonic-gate extern int	md_dkiocsetefi(minor_t, void *, int);
7740Sstevel@tonic-gate extern int	md_dkiocpartition(minor_t, void *, int);
7751623Stw21770 extern void	md_remove_minor_node(minor_t);
7760Sstevel@tonic-gate 
7770Sstevel@tonic-gate 
7780Sstevel@tonic-gate /* Externals from md_names.c */
7790Sstevel@tonic-gate extern mdkey_t	md_setdevname(set_t, side_t, mdkey_t, char *, minor_t, char *,
7801945Sjeanm 		    int imp_flag, ddi_devid_t devid, char *minorname,
7811623Stw21770 			set_t, md_error_t *);
7820Sstevel@tonic-gate extern int	md_getdevname(set_t, side_t, mdkey_t, md_dev64_t, char *,
7830Sstevel@tonic-gate 		    size_t);
7844491Sjmf extern int	md_getdevname_common(set_t, side_t, mdkey_t, md_dev64_t, char *,
7854491Sjmf 		    size_t, int);
7861623Stw21770 extern int	md_gethspinfo(set_t, side_t, mdkey_t, char *, hsp_t *,
7871623Stw21770 		    char *);
7880Sstevel@tonic-gate extern int	md_getkeyfromdev(set_t, side_t, md_dev64_t, mdkey_t *, int *);
7890Sstevel@tonic-gate extern int	md_devid_found(set_t, side_t, mdkey_t);
7900Sstevel@tonic-gate extern int	md_getnment(set_t, side_t, mdkey_t, md_dev64_t,
7910Sstevel@tonic-gate 		    char *, uint_t, major_t *, minor_t *, mdkey_t *);
7920Sstevel@tonic-gate extern md_dev64_t md_getdevnum(set_t, side_t, mdkey_t, int);
7930Sstevel@tonic-gate extern mdkey_t	md_getnextkey(set_t, side_t, mdkey_t, uint_t *);
7940Sstevel@tonic-gate extern int	md_remdevname(set_t, side_t, mdkey_t);
7950Sstevel@tonic-gate extern mdkey_t	md_setshared_name(set_t, char *, int);
7960Sstevel@tonic-gate extern char	*md_getshared_name(set_t, mdkey_t);
7970Sstevel@tonic-gate extern int	md_remshared_name(set_t, mdkey_t);
7980Sstevel@tonic-gate extern mdkey_t	md_getshared_key(set_t, char *);
7990Sstevel@tonic-gate extern int	md_setshared_data(set_t, uint_t, caddr_t);
8000Sstevel@tonic-gate extern caddr_t	md_getshared_data(set_t, uint_t);
8010Sstevel@tonic-gate extern int	md_load_namespace(set_t, md_error_t *ep, int);
8020Sstevel@tonic-gate extern void	md_unload_namespace(set_t, int);
8030Sstevel@tonic-gate extern int	md_nm_did_chkspace(set_t);
8040Sstevel@tonic-gate extern void	md_bioinit();
8050Sstevel@tonic-gate extern buf_t	*md_bioclone(buf_t *, off_t, size_t, dev_t, diskaddr_t,
8060Sstevel@tonic-gate 		    int (*)(buf_t *), buf_t *, int);
8070Sstevel@tonic-gate extern int	md_getdevid(set_t setno, side_t side, mdkey_t key,
8080Sstevel@tonic-gate 		    ddi_devid_t devid, ushort_t *did_size);
8090Sstevel@tonic-gate extern int	md_getdevidminor(set_t setno, side_t side, mdkey_t key,
8100Sstevel@tonic-gate 		    char *minorname, size_t minorname_len);
8110Sstevel@tonic-gate extern int	md_update_namespace(set_t setno, side_t side, mdkey_t key,
812*12678SJames.Hall@Sun.COM 		    caddr_t devname, caddr_t pathname, major_t major,
813*12678SJames.Hall@Sun.COM 		    minor_t mnum);
8140Sstevel@tonic-gate extern int	md_update_locator_namespace(set_t setno, side_t side,
8150Sstevel@tonic-gate 		    caddr_t devname, caddr_t pathname, md_dev64_t devt);
8160Sstevel@tonic-gate extern int	md_update_namespace_did(set_t setno, side_t side, mdkey_t key,
8170Sstevel@tonic-gate 		    md_error_t *ep);
8180Sstevel@tonic-gate extern int	md_validate_devid(set_t setno, side_t side, int *maxsz);
8190Sstevel@tonic-gate extern int	md_get_invdid(set_t setno, side_t side, int cnt, int maxsz,
8200Sstevel@tonic-gate 		    void *didptr);
8210Sstevel@tonic-gate extern md_dev64_t md_resolve_bydevid(minor_t, md_dev64_t, mdkey_t key);
8220Sstevel@tonic-gate extern md_dev64_t md_expldev(md_dev64_t);
8230Sstevel@tonic-gate extern dev32_t	md_cmpldev(md_dev64_t);
8240Sstevel@tonic-gate extern dev_t	md_dev64_to_dev(md_dev64_t);
8250Sstevel@tonic-gate extern md_dev64_t md_makedevice(major_t, minor_t);
8260Sstevel@tonic-gate extern major_t	md_getmajor(md_dev64_t);
8270Sstevel@tonic-gate extern minor_t	md_getminor(md_dev64_t);
8280Sstevel@tonic-gate extern void	md_timeval(md_timeval32_t *);
8291945Sjeanm extern int	md_imp_snarf_set(mddb_config_t *);
8300Sstevel@tonic-gate 
8310Sstevel@tonic-gate /* externals from md_mddb.c */
8320Sstevel@tonic-gate extern int	mddb_reread_rr(set_t, mddb_recid_t);
8330Sstevel@tonic-gate extern int	mddb_setowner(mddb_recid_t id, md_mn_nodeid_t owner);
8340Sstevel@tonic-gate extern int	mddb_parse(mddb_parse_parm_t *mpp);
8350Sstevel@tonic-gate extern int	mddb_block(mddb_block_parm_t *mpp);
8360Sstevel@tonic-gate extern int	mddb_optrecfix(mddb_optrec_parm_t *mop);
8370Sstevel@tonic-gate extern int	mddb_check_write_ioctl(mddb_config_t *info);
8380Sstevel@tonic-gate extern int	mddb_setflags_ioctl(mddb_setflags_config_t *info);
8390Sstevel@tonic-gate extern struct nm_next_hdr	*get_first_record(set_t, int, int);
8400Sstevel@tonic-gate extern void	*lookup_entry(struct nm_next_hdr *, set_t,
8410Sstevel@tonic-gate 			side_t, mdkey_t, md_dev64_t, int);
8420Sstevel@tonic-gate extern void	*lookup_shared_entry(struct nm_next_hdr *,
8430Sstevel@tonic-gate 		    mdkey_t key, char *, mddb_recid_t *, int);
8440Sstevel@tonic-gate extern int	remove_shared_entry(struct nm_next_hdr *, mdkey_t key,
8450Sstevel@tonic-gate 		    char *, int);
846*12678SJames.Hall@Sun.COM extern int	remove_entry(struct nm_next_hdr *, side_t, mdkey_t, int);
8470Sstevel@tonic-gate extern void	*alloc_entry(struct nm_next_hdr *, mddb_recid_t, size_t, int,
8480Sstevel@tonic-gate 		    mddb_recid_t *);
8490Sstevel@tonic-gate extern void	*getshared_name(set_t, mdkey_t, int);
8500Sstevel@tonic-gate 
8510Sstevel@tonic-gate #endif	/* _KERNEL */
8520Sstevel@tonic-gate 
853734Smw145384 
854734Smw145384 /* externals from md_revchk.c */
855734Smw145384 extern int	revchk(uint_t my_rev, uint_t data);
856734Smw145384 
857734Smw145384 
8580Sstevel@tonic-gate #ifdef	__cplusplus
8590Sstevel@tonic-gate }
8600Sstevel@tonic-gate #endif
8610Sstevel@tonic-gate 
8620Sstevel@tonic-gate #endif	/* _SYS_MDVAR_H */
863