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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef _SYS__MD_STRIPE_H
28#define	_SYS__MD_STRIPE_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#include <sys/lvm/mdvar.h>
33#include <sys/lvm/md_mirror_shared.h>
34#include <sys/lvm/md_rename.h>
35
36#ifdef	__cplusplus
37extern "C" {
38#endif
39
40/*
41 * ms_comp32_od is for old 32 bit format only
42 */
43#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
44#pragma pack(4)
45#endif
46typedef struct ms_comp32_od {
47	mdkey_t		un_key;
48	dev32_t		un_dev;
49	daddr32_t	un_start_block;	/* comp start blkno */
50	md_m_shared32_od_t un_mirror;
51} ms_comp32_od_t;
52
53
54typedef struct ms_comp {	/* components */
55	mdkey_t		un_key;		/* namespace key */
56	md_dev64_t	un_dev;		/* device number, 64 bit */
57	diskaddr_t	un_start_block;	/* comp start blkno */
58	md_m_shared_t	un_mirror;	/* mirror shared data */
59} ms_comp_t;
60#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
61#pragma pack()
62#endif
63
64/*
65 * ms_unit32_od is for old 32 bit format only
66 */
67#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
68#pragma pack(4)
69#endif
70typedef struct ms_unit32_od {
71	mdc_unit32_od_t	c;
72	int		un_hsp_id;	/* hot spare pool db record id */
73	uint_t		un_nrows;	/* number of rows */
74	uint_t		un_ocomp;	/* offset of  ms_comp array  */
75	struct ms_row32_od {
76		int	un_icomp;	/* ms_comp array index of first comp */
77		uint_t	un_ncomp;	/* # comps in this row */
78		int	un_blocks;	/* total blocks in this row */
79		int	un_cum_blocks;	/* cum. blks in this and prev. rows */
80		int	un_interlace;	/* # blks from each disk in a stripe */
81	}un_row[1];
82} ms_unit32_od_t;
83
84
85typedef struct ms_unit {
86	mdc_unit_t	c;
87	int		un_hsp_id;	/* hot spare pool db record id */
88	uint_t		un_nrows;	/* number of rows */
89	uint_t		un_ocomp;	/* offset of  ms_comp array  */
90	struct ms_row {
91		int	un_icomp;	/* ms_comp array index of first comp */
92		uint_t	un_ncomp;	/* # comps in this row */
93		diskaddr_t un_blocks;	/* total blocks in this row */
94		diskaddr_t un_cum_blocks;	/* cum. blks in rows */
95		diskaddr_t un_interlace;	/* # blks from each disk */
96	}un_row[1];
97} ms_unit_t;
98#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
99#pragma pack()
100#endif
101
102#ifdef _KERNEL
103
104typedef struct md_sps {			/* stripe parent save */
105	DAEMON_QUEUE
106	ms_unit_t	*ps_un;
107	mdi_unit_t	*ps_ui;
108	buf_t		*ps_bp;
109	caddr_t		 ps_addr;
110	int		 ps_frags;
111	int		 ps_flags;
112	ms_comp_t	*ps_errcomp;
113	/*
114	 * New structure members should be added here; fields added
115	 * after ps_mx will not be zeroed during initialization.
116	 */
117	kmutex_t	 ps_mx;
118} md_sps_t;
119
120#define	MD_SPS_ERROR		0x0001
121#define	MD_SPS_DONTFREE		0x0002
122#define	MD_SPS_DONE		0x0004
123
124#define	SPS_FREE(kc, ps)			\
125{						\
126	if ((ps)->ps_flags & MD_SPS_DONTFREE)	\
127		(ps)->ps_flags |= MD_SPS_DONE;	\
128	else					\
129		kmem_cache_free((kc), (ps));	\
130}
131
132typedef struct md_scs {
133	DAEMON_QUEUE
134	minor_t		 cs_mdunit;
135	md_sps_t	*cs_ps;
136	ms_comp_t	*cs_comp;
137	/* Add new structure members HERE!! */
138	buf_t		 cs_buf;
139	/*  DO NOT add struture members here; cs_buf is dynamically sized */
140} md_scs_t;
141
142/* Externals from stripe.c */
143extern int	stripe_build_incore(void *, int);
144extern void	reset_stripe(ms_unit_t *, minor_t, int);
145extern intptr_t	stripe_component_count(md_dev64_t, void *);
146extern intptr_t	stripe_get_dev(md_dev64_t, void *, int, ms_cd_info_t *);
147extern intptr_t stripe_replace_dev(md_dev64_t, void *, int, ms_new_dev_t *,
148    mddb_recid_t *, int, void (**)(), void **);
149extern void	stripe_replace_done(md_dev64_t, sv_dev_t *);
150
151/* Externals from stripe_ioctl.c */
152extern int	md_stripe_ioctl(dev_t dev, int cmd, void *data,
153		    int mode, IOLOCK *lockp);
154
155/* rename named service functions (stripe_ioctl.c) */
156md_ren_svc_t	stripe_rename_check;
157
158#endif	/* _KERNEL */
159
160#ifdef	__cplusplus
161}
162#endif
163
164#endif	/* _SYS__MD_STRIPE_H */
165