xref: /onnv-gate/usr/src/uts/common/sys/lvm/md_sp.h (revision 0:68f95e015346)
1*0Sstevel@tonic-gate /*
2*0Sstevel@tonic-gate  * CDDL HEADER START
3*0Sstevel@tonic-gate  *
4*0Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*0Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*0Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*0Sstevel@tonic-gate  * with the License.
8*0Sstevel@tonic-gate  *
9*0Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*0Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*0Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*0Sstevel@tonic-gate  * and limitations under the License.
13*0Sstevel@tonic-gate  *
14*0Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*0Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*0Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*0Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*0Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*0Sstevel@tonic-gate  *
20*0Sstevel@tonic-gate  * CDDL HEADER END
21*0Sstevel@tonic-gate  */
22*0Sstevel@tonic-gate /*
23*0Sstevel@tonic-gate  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24*0Sstevel@tonic-gate  * Use is subject to license terms.
25*0Sstevel@tonic-gate  */
26*0Sstevel@tonic-gate 
27*0Sstevel@tonic-gate #ifndef _SYS__MD_SP_H
28*0Sstevel@tonic-gate #define	_SYS__MD_SP_H
29*0Sstevel@tonic-gate 
30*0Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*0Sstevel@tonic-gate 
32*0Sstevel@tonic-gate #include <sys/lvm/mdvar.h>
33*0Sstevel@tonic-gate 
34*0Sstevel@tonic-gate #ifdef	__cplusplus
35*0Sstevel@tonic-gate extern "C" {
36*0Sstevel@tonic-gate #endif
37*0Sstevel@tonic-gate 
38*0Sstevel@tonic-gate #define	META_SP_DEBUG ("META_SP_DEBUG")
39*0Sstevel@tonic-gate 
40*0Sstevel@tonic-gate /* on-disk structures */
41*0Sstevel@tonic-gate #define	MD_SP_MAGIC			(0x20000127)
42*0Sstevel@tonic-gate /* number of sectors to reserve at the beginning of the volume */
43*0Sstevel@tonic-gate #define	MD_SP_START			(0)
44*0Sstevel@tonic-gate /* current watermark version number */
45*0Sstevel@tonic-gate #define	MD_SP_VERSION			(1)
46*0Sstevel@tonic-gate /* size of a watermark in sectors */
47*0Sstevel@tonic-gate #define	MD_SP_WMSIZE			(1)
48*0Sstevel@tonic-gate /* free watermark name */
49*0Sstevel@tonic-gate #define	MD_SP_FREEWMNAME		"free"
50*0Sstevel@tonic-gate /* local set name */
51*0Sstevel@tonic-gate #define	MD_SP_LOCALSETNAME		""
52*0Sstevel@tonic-gate /* maximum length of a soft partition metadevice name. eg. dXXXX\0 */
53*0Sstevel@tonic-gate #define	MD_SP_MAX_DEVNAME_PLUS_1	(6)
54*0Sstevel@tonic-gate 
55*0Sstevel@tonic-gate /*
56*0Sstevel@tonic-gate  * The size of this structure is forced to be 512 bytes (ie a sector) by
57*0Sstevel@tonic-gate  * using a union. Note the MD_MAX_SETNAME_PLUS_1 is set in meta_basic.h
58*0Sstevel@tonic-gate  */
59*0Sstevel@tonic-gate 
60*0Sstevel@tonic-gate #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
61*0Sstevel@tonic-gate #pragma pack(4)
62*0Sstevel@tonic-gate #endif
63*0Sstevel@tonic-gate typedef union mp_watermark {
64*0Sstevel@tonic-gate 	struct {
65*0Sstevel@tonic-gate 		uint32_t	wm_magic;	/* magic number */
66*0Sstevel@tonic-gate 		uint32_t	wm_version;	/* version number */
67*0Sstevel@tonic-gate 		uint32_t	wm_checksum;	/* structure checksum */
68*0Sstevel@tonic-gate 		uint32_t	wm_seq;		/* sequence number */
69*0Sstevel@tonic-gate 		uint32_t	wm_type;	/* extent type */
70*0Sstevel@tonic-gate 		uint64_t	wm_length;	/* length of extent */
71*0Sstevel@tonic-gate 		char		wm_mdname[MD_MAX_SETNAME_PLUS_1 +
72*0Sstevel@tonic-gate 				    MD_SP_MAX_DEVNAME_PLUS_1];	/* SP name */
73*0Sstevel@tonic-gate 		char		wm_setname[MD_MAX_SETNAME_PLUS_1]; /* setname */
74*0Sstevel@tonic-gate 	} wm;
75*0Sstevel@tonic-gate 	uchar_t			wm_pad[MD_SP_WMSIZE * DEV_BSIZE];
76*0Sstevel@tonic-gate } mp_watermark_t;
77*0Sstevel@tonic-gate #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
78*0Sstevel@tonic-gate #pragma pack()
79*0Sstevel@tonic-gate #endif
80*0Sstevel@tonic-gate 
81*0Sstevel@tonic-gate #define	wm_magic	wm.wm_magic
82*0Sstevel@tonic-gate #define	wm_version	wm.wm_version
83*0Sstevel@tonic-gate #define	wm_checksum	wm.wm_checksum
84*0Sstevel@tonic-gate #define	wm_seq		wm.wm_seq
85*0Sstevel@tonic-gate #define	wm_type		wm.wm_type
86*0Sstevel@tonic-gate #define	wm_length	wm.wm_length
87*0Sstevel@tonic-gate #define	wm_mdname	wm.wm_mdname
88*0Sstevel@tonic-gate #define	wm_setname	wm.wm_setname
89*0Sstevel@tonic-gate 
90*0Sstevel@tonic-gate /* Watermark types */
91*0Sstevel@tonic-gate typedef enum sp_ext_type {
92*0Sstevel@tonic-gate 	EXTTYP_ALLOC	= 0x1,	/* this extent is in use by a soft partition */
93*0Sstevel@tonic-gate 	EXTTYP_FREE	= 0x2,	/* extent is not in use */
94*0Sstevel@tonic-gate 	EXTTYP_END	= 0x3,	/* last descriptor on the volume */
95*0Sstevel@tonic-gate 	EXTTYP_RESERVED	= 0x4	/* extent will not be used or updated */
96*0Sstevel@tonic-gate } sp_ext_type_t;
97*0Sstevel@tonic-gate 
98*0Sstevel@tonic-gate /* ioctls */
99*0Sstevel@tonic-gate #define	MD_IOC_SPSTATUS		(MDIOC_MISC|0)
100*0Sstevel@tonic-gate #define	MD_IOC_SPUPDATEWM	(MDIOC_MISC|1)
101*0Sstevel@tonic-gate #define	MD_IOC_SPREADWM		(MDIOC_MISC|2)
102*0Sstevel@tonic-gate 
103*0Sstevel@tonic-gate #ifdef _KERNEL
104*0Sstevel@tonic-gate 
105*0Sstevel@tonic-gate /*
106*0Sstevel@tonic-gate  * parent and child save areas provide the mechanism for tracking
107*0Sstevel@tonic-gate  * I/O operations in the metadevice stack.
108*0Sstevel@tonic-gate  */
109*0Sstevel@tonic-gate 
110*0Sstevel@tonic-gate /* soft partitioning parent save area */
111*0Sstevel@tonic-gate typedef struct md_spps {		/* soft partition parent save */
112*0Sstevel@tonic-gate 	DAEMON_QUEUE
113*0Sstevel@tonic-gate 	mp_unit_t	*ps_un;		/* sp unit structure */
114*0Sstevel@tonic-gate 	mdi_unit_t	*ps_ui;		/* incore unit struct */
115*0Sstevel@tonic-gate 	buf_t		*ps_bp;		/* parent buffer */
116*0Sstevel@tonic-gate 	caddr_t		 ps_addr;
117*0Sstevel@tonic-gate 	int		 ps_frags;
118*0Sstevel@tonic-gate 	int		 ps_flags;
119*0Sstevel@tonic-gate 	/*
120*0Sstevel@tonic-gate 	 * New structure members should be added here; fields added
121*0Sstevel@tonic-gate 	 * after ps_mx will not be zeroed during initialization.
122*0Sstevel@tonic-gate 	 */
123*0Sstevel@tonic-gate 	kmutex_t	 ps_mx;
124*0Sstevel@tonic-gate } md_spps_t;
125*0Sstevel@tonic-gate 
126*0Sstevel@tonic-gate /* parent save flags. */
127*0Sstevel@tonic-gate #define	MD_SPPS_ERROR		0x0001
128*0Sstevel@tonic-gate #define	MD_SPPS_DONTFREE	0x0002
129*0Sstevel@tonic-gate #define	MD_SPPS_DONE		0x0004
130*0Sstevel@tonic-gate 
131*0Sstevel@tonic-gate /* soft partitioning child save area */
132*0Sstevel@tonic-gate typedef struct md_spcs {
133*0Sstevel@tonic-gate 	DAEMON_QUEUE
134*0Sstevel@tonic-gate 	minor_t		 cs_mdunit;	/* child minor number */
135*0Sstevel@tonic-gate 	md_spps_t	*cs_ps;		/* parent save pointer */
136*0Sstevel@tonic-gate 	/* Add new structure members HERE!! */
137*0Sstevel@tonic-gate 	buf_t		 cs_buf;	/* child buffer */
138*0Sstevel@tonic-gate 	/*  DO NOT add struture members here; cs_buf is dynamically sized */
139*0Sstevel@tonic-gate } md_spcs_t;
140*0Sstevel@tonic-gate 
141*0Sstevel@tonic-gate #define	SPPS_FREE(kc, ps)			\
142*0Sstevel@tonic-gate {						\
143*0Sstevel@tonic-gate 	if ((ps)->ps_flags & MD_SPPS_DONTFREE)	\
144*0Sstevel@tonic-gate 		(ps)->ps_flags |= MD_SPPS_DONE;	\
145*0Sstevel@tonic-gate 	else					\
146*0Sstevel@tonic-gate 		kmem_cache_free((kc), (ps));	\
147*0Sstevel@tonic-gate }
148*0Sstevel@tonic-gate 
149*0Sstevel@tonic-gate /* externals from sp.c */
150*0Sstevel@tonic-gate extern int	sp_build_incore(void *, int);
151*0Sstevel@tonic-gate extern void	reset_sp(mp_unit_t *, minor_t, int);
152*0Sstevel@tonic-gate extern int	sp_directed_read(minor_t, vol_directed_rd_t *, int);
153*0Sstevel@tonic-gate 
154*0Sstevel@tonic-gate /* externals from sp_ioctl.c */
155*0Sstevel@tonic-gate extern int	md_sp_ioctl(dev_t dev, int cmd, void *data,
156*0Sstevel@tonic-gate 	int mode, IOLOCK *lockp);
157*0Sstevel@tonic-gate 
158*0Sstevel@tonic-gate #endif	/* _KERNEL */
159*0Sstevel@tonic-gate 
160*0Sstevel@tonic-gate #ifdef	__cplusplus
161*0Sstevel@tonic-gate }
162*0Sstevel@tonic-gate #endif
163*0Sstevel@tonic-gate 
164*0Sstevel@tonic-gate #endif	/* _SYS__MD_SP_H */
165