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