xref: /onnv-gate/usr/src/uts/common/sys/lvm/md_sp.h (revision 8452:89d32dfdae6e)
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
5*8452SJohn.Wren.Kennedy@Sun.COM  * Common Development and Distribution License (the "License").
6*8452SJohn.Wren.Kennedy@Sun.COM  * 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  */
21*8452SJohn.Wren.Kennedy@Sun.COM 
220Sstevel@tonic-gate /*
23*8452SJohn.Wren.Kennedy@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
240Sstevel@tonic-gate  * Use is subject to license terms.
250Sstevel@tonic-gate  */
260Sstevel@tonic-gate 
270Sstevel@tonic-gate #ifndef _SYS__MD_SP_H
280Sstevel@tonic-gate #define	_SYS__MD_SP_H
290Sstevel@tonic-gate 
300Sstevel@tonic-gate #include <sys/lvm/mdvar.h>
310Sstevel@tonic-gate 
320Sstevel@tonic-gate #ifdef	__cplusplus
330Sstevel@tonic-gate extern "C" {
340Sstevel@tonic-gate #endif
350Sstevel@tonic-gate 
360Sstevel@tonic-gate #define	META_SP_DEBUG ("META_SP_DEBUG")
370Sstevel@tonic-gate 
380Sstevel@tonic-gate /* on-disk structures */
390Sstevel@tonic-gate #define	MD_SP_MAGIC			(0x20000127)
400Sstevel@tonic-gate /* number of sectors to reserve at the beginning of the volume */
410Sstevel@tonic-gate #define	MD_SP_START			(0)
420Sstevel@tonic-gate /* current watermark version number */
430Sstevel@tonic-gate #define	MD_SP_VERSION			(1)
440Sstevel@tonic-gate /* size of a watermark in sectors */
450Sstevel@tonic-gate #define	MD_SP_WMSIZE			(1)
460Sstevel@tonic-gate /* free watermark name */
470Sstevel@tonic-gate #define	MD_SP_FREEWMNAME		"free"
480Sstevel@tonic-gate /* local set name */
490Sstevel@tonic-gate #define	MD_SP_LOCALSETNAME		""
500Sstevel@tonic-gate /* maximum length of a soft partition metadevice name. eg. dXXXX\0 */
510Sstevel@tonic-gate #define	MD_SP_MAX_DEVNAME_PLUS_1	(6)
520Sstevel@tonic-gate 
530Sstevel@tonic-gate /*
540Sstevel@tonic-gate  * The size of this structure is forced to be 512 bytes (ie a sector) by
550Sstevel@tonic-gate  * using a union. Note the MD_MAX_SETNAME_PLUS_1 is set in meta_basic.h
560Sstevel@tonic-gate  */
570Sstevel@tonic-gate 
580Sstevel@tonic-gate #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
590Sstevel@tonic-gate #pragma pack(4)
600Sstevel@tonic-gate #endif
610Sstevel@tonic-gate typedef union mp_watermark {
620Sstevel@tonic-gate 	struct {
630Sstevel@tonic-gate 		uint32_t	wm_magic;	/* magic number */
640Sstevel@tonic-gate 		uint32_t	wm_version;	/* version number */
650Sstevel@tonic-gate 		uint32_t	wm_checksum;	/* structure checksum */
660Sstevel@tonic-gate 		uint32_t	wm_seq;		/* sequence number */
670Sstevel@tonic-gate 		uint32_t	wm_type;	/* extent type */
680Sstevel@tonic-gate 		uint64_t	wm_length;	/* length of extent */
690Sstevel@tonic-gate 		char		wm_mdname[MD_MAX_SETNAME_PLUS_1 +
700Sstevel@tonic-gate 				    MD_SP_MAX_DEVNAME_PLUS_1];	/* SP name */
710Sstevel@tonic-gate 		char		wm_setname[MD_MAX_SETNAME_PLUS_1]; /* setname */
720Sstevel@tonic-gate 	} wm;
730Sstevel@tonic-gate 	uchar_t			wm_pad[MD_SP_WMSIZE * DEV_BSIZE];
740Sstevel@tonic-gate } mp_watermark_t;
750Sstevel@tonic-gate #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
760Sstevel@tonic-gate #pragma pack()
770Sstevel@tonic-gate #endif
780Sstevel@tonic-gate 
790Sstevel@tonic-gate #define	wm_magic	wm.wm_magic
800Sstevel@tonic-gate #define	wm_version	wm.wm_version
810Sstevel@tonic-gate #define	wm_checksum	wm.wm_checksum
820Sstevel@tonic-gate #define	wm_seq		wm.wm_seq
830Sstevel@tonic-gate #define	wm_type		wm.wm_type
840Sstevel@tonic-gate #define	wm_length	wm.wm_length
850Sstevel@tonic-gate #define	wm_mdname	wm.wm_mdname
860Sstevel@tonic-gate #define	wm_setname	wm.wm_setname
870Sstevel@tonic-gate 
880Sstevel@tonic-gate /* Watermark types */
890Sstevel@tonic-gate typedef enum sp_ext_type {
900Sstevel@tonic-gate 	EXTTYP_ALLOC	= 0x1,	/* this extent is in use by a soft partition */
910Sstevel@tonic-gate 	EXTTYP_FREE	= 0x2,	/* extent is not in use */
920Sstevel@tonic-gate 	EXTTYP_END	= 0x3,	/* last descriptor on the volume */
930Sstevel@tonic-gate 	EXTTYP_RESERVED	= 0x4	/* extent will not be used or updated */
940Sstevel@tonic-gate } sp_ext_type_t;
950Sstevel@tonic-gate 
960Sstevel@tonic-gate /* ioctls */
970Sstevel@tonic-gate #define	MD_IOC_SPSTATUS		(MDIOC_MISC|0)
980Sstevel@tonic-gate #define	MD_IOC_SPUPDATEWM	(MDIOC_MISC|1)
990Sstevel@tonic-gate #define	MD_IOC_SPREADWM		(MDIOC_MISC|2)
100*8452SJohn.Wren.Kennedy@Sun.COM #define	MD_MN_IOC_SPUPDATEWM	(MDIOC_MISC|3)
1010Sstevel@tonic-gate 
1020Sstevel@tonic-gate #ifdef _KERNEL
1030Sstevel@tonic-gate 
1040Sstevel@tonic-gate /*
1050Sstevel@tonic-gate  * parent and child save areas provide the mechanism for tracking
1060Sstevel@tonic-gate  * I/O operations in the metadevice stack.
1070Sstevel@tonic-gate  */
1080Sstevel@tonic-gate 
1090Sstevel@tonic-gate /* soft partitioning parent save area */
1100Sstevel@tonic-gate typedef struct md_spps {		/* soft partition parent save */
1110Sstevel@tonic-gate 	DAEMON_QUEUE
1120Sstevel@tonic-gate 	mp_unit_t	*ps_un;		/* sp unit structure */
1130Sstevel@tonic-gate 	mdi_unit_t	*ps_ui;		/* incore unit struct */
1140Sstevel@tonic-gate 	buf_t		*ps_bp;		/* parent buffer */
1150Sstevel@tonic-gate 	caddr_t		 ps_addr;
1160Sstevel@tonic-gate 	int		 ps_frags;
1170Sstevel@tonic-gate 	int		 ps_flags;
1180Sstevel@tonic-gate 	/*
1190Sstevel@tonic-gate 	 * New structure members should be added here; fields added
1200Sstevel@tonic-gate 	 * after ps_mx will not be zeroed during initialization.
1210Sstevel@tonic-gate 	 */
1220Sstevel@tonic-gate 	kmutex_t	 ps_mx;
1230Sstevel@tonic-gate } md_spps_t;
1240Sstevel@tonic-gate 
1250Sstevel@tonic-gate /* parent save flags. */
1260Sstevel@tonic-gate #define	MD_SPPS_ERROR		0x0001
1270Sstevel@tonic-gate #define	MD_SPPS_DONTFREE	0x0002
1280Sstevel@tonic-gate #define	MD_SPPS_DONE		0x0004
1290Sstevel@tonic-gate 
1300Sstevel@tonic-gate /* soft partitioning child save area */
1310Sstevel@tonic-gate typedef struct md_spcs {
1320Sstevel@tonic-gate 	DAEMON_QUEUE
1330Sstevel@tonic-gate 	minor_t		 cs_mdunit;	/* child minor number */
1340Sstevel@tonic-gate 	md_spps_t	*cs_ps;		/* parent save pointer */
1350Sstevel@tonic-gate 	/* Add new structure members HERE!! */
1360Sstevel@tonic-gate 	buf_t		 cs_buf;	/* child buffer */
1370Sstevel@tonic-gate 	/*  DO NOT add struture members here; cs_buf is dynamically sized */
1380Sstevel@tonic-gate } md_spcs_t;
1390Sstevel@tonic-gate 
1400Sstevel@tonic-gate #define	SPPS_FREE(kc, ps)			\
1410Sstevel@tonic-gate {						\
1420Sstevel@tonic-gate 	if ((ps)->ps_flags & MD_SPPS_DONTFREE)	\
1430Sstevel@tonic-gate 		(ps)->ps_flags |= MD_SPPS_DONE;	\
1440Sstevel@tonic-gate 	else					\
1450Sstevel@tonic-gate 		kmem_cache_free((kc), (ps));	\
1460Sstevel@tonic-gate }
1470Sstevel@tonic-gate 
1480Sstevel@tonic-gate /* externals from sp.c */
1490Sstevel@tonic-gate extern int	sp_build_incore(void *, int);
1500Sstevel@tonic-gate extern void	reset_sp(mp_unit_t *, minor_t, int);
1510Sstevel@tonic-gate extern int	sp_directed_read(minor_t, vol_directed_rd_t *, int);
1520Sstevel@tonic-gate 
1530Sstevel@tonic-gate /* externals from sp_ioctl.c */
1540Sstevel@tonic-gate extern int	md_sp_ioctl(dev_t dev, int cmd, void *data,
1550Sstevel@tonic-gate 	int mode, IOLOCK *lockp);
1560Sstevel@tonic-gate 
1570Sstevel@tonic-gate #endif	/* _KERNEL */
1580Sstevel@tonic-gate 
1590Sstevel@tonic-gate #ifdef	__cplusplus
1600Sstevel@tonic-gate }
1610Sstevel@tonic-gate #endif
1620Sstevel@tonic-gate 
1630Sstevel@tonic-gate #endif	/* _SYS__MD_SP_H */
164