raidframevar.h revision 1.1.8.2 1 1.1.8.2 thorpej /* $NetBSD: raidframevar.h,v 1.1.8.2 2002/01/10 19:57:36 thorpej Exp $ */
2 1.1.8.2 thorpej /*-
3 1.1.8.2 thorpej * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
4 1.1.8.2 thorpej * All rights reserved.
5 1.1.8.2 thorpej *
6 1.1.8.2 thorpej * This code is derived from software contributed to The NetBSD Foundation
7 1.1.8.2 thorpej * by Greg Oster
8 1.1.8.2 thorpej *
9 1.1.8.2 thorpej * Redistribution and use in source and binary forms, with or without
10 1.1.8.2 thorpej * modification, are permitted provided that the following conditions
11 1.1.8.2 thorpej * are met:
12 1.1.8.2 thorpej * 1. Redistributions of source code must retain the above copyright
13 1.1.8.2 thorpej * notice, this list of conditions and the following disclaimer.
14 1.1.8.2 thorpej * 2. Redistributions in binary form must reproduce the above copyright
15 1.1.8.2 thorpej * notice, this list of conditions and the following disclaimer in the
16 1.1.8.2 thorpej * documentation and/or other materials provided with the distribution.
17 1.1.8.2 thorpej * 3. All advertising materials mentioning features or use of this software
18 1.1.8.2 thorpej * must display the following acknowledgement:
19 1.1.8.2 thorpej * This product includes software developed by the NetBSD
20 1.1.8.2 thorpej * Foundation, Inc. and its contributors.
21 1.1.8.2 thorpej * 4. Neither the name of The NetBSD Foundation nor the names of its
22 1.1.8.2 thorpej * contributors may be used to endorse or promote products derived
23 1.1.8.2 thorpej * from this software without specific prior written permission.
24 1.1.8.2 thorpej *
25 1.1.8.2 thorpej * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
26 1.1.8.2 thorpej * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 1.1.8.2 thorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 1.1.8.2 thorpej * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
29 1.1.8.2 thorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 1.1.8.2 thorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 1.1.8.2 thorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 1.1.8.2 thorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 1.1.8.2 thorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 1.1.8.2 thorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 1.1.8.2 thorpej * POSSIBILITY OF SUCH DAMAGE.
36 1.1.8.2 thorpej */
37 1.1.8.2 thorpej /*
38 1.1.8.2 thorpej * Copyright (c) 1995 Carnegie-Mellon University.
39 1.1.8.2 thorpej * All rights reserved.
40 1.1.8.2 thorpej *
41 1.1.8.2 thorpej * Author: Mark Holland
42 1.1.8.2 thorpej *
43 1.1.8.2 thorpej * Permission to use, copy, modify and distribute this software and
44 1.1.8.2 thorpej * its documentation is hereby granted, provided that both the copyright
45 1.1.8.2 thorpej * notice and this permission notice appear in all copies of the
46 1.1.8.2 thorpej * software, derivative works or modified versions, and any portions
47 1.1.8.2 thorpej * thereof, and that both notices appear in supporting documentation.
48 1.1.8.2 thorpej *
49 1.1.8.2 thorpej * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
50 1.1.8.2 thorpej * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
51 1.1.8.2 thorpej * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
52 1.1.8.2 thorpej *
53 1.1.8.2 thorpej * Carnegie Mellon requests users of this software to return to
54 1.1.8.2 thorpej *
55 1.1.8.2 thorpej * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU
56 1.1.8.2 thorpej * School of Computer Science
57 1.1.8.2 thorpej * Carnegie Mellon University
58 1.1.8.2 thorpej * Pittsburgh PA 15213-3890
59 1.1.8.2 thorpej *
60 1.1.8.2 thorpej * any improvements or extensions that they make and grant Carnegie the
61 1.1.8.2 thorpej * rights to redistribute these changes.
62 1.1.8.2 thorpej */
63 1.1.8.2 thorpej
64 1.1.8.2 thorpej /*
65 1.1.8.2 thorpej * Copyright (c) 1995 Carnegie-Mellon University.
66 1.1.8.2 thorpej * All rights reserved.
67 1.1.8.2 thorpej *
68 1.1.8.2 thorpej * Author: Jim Zelenka
69 1.1.8.2 thorpej *
70 1.1.8.2 thorpej * Permission to use, copy, modify and distribute this software and
71 1.1.8.2 thorpej * its documentation is hereby granted, provided that both the copyright
72 1.1.8.2 thorpej * notice and this permission notice appear in all copies of the
73 1.1.8.2 thorpej * software, derivative works or modified versions, and any portions
74 1.1.8.2 thorpej * thereof, and that both notices appear in supporting documentation.
75 1.1.8.2 thorpej *
76 1.1.8.2 thorpej * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
77 1.1.8.2 thorpej * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
78 1.1.8.2 thorpej * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
79 1.1.8.2 thorpej *
80 1.1.8.2 thorpej * Carnegie Mellon requests users of this software to return to
81 1.1.8.2 thorpej *
82 1.1.8.2 thorpej * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU
83 1.1.8.2 thorpej * School of Computer Science
84 1.1.8.2 thorpej * Carnegie Mellon University
85 1.1.8.2 thorpej * Pittsburgh PA 15213-3890
86 1.1.8.2 thorpej *
87 1.1.8.2 thorpej * any improvements or extensions that they make and grant Carnegie the
88 1.1.8.2 thorpej * rights to redistribute these changes.
89 1.1.8.2 thorpej */
90 1.1.8.2 thorpej
91 1.1.8.2 thorpej /*****************************************************
92 1.1.8.2 thorpej *
93 1.1.8.2 thorpej * raidframevar.h
94 1.1.8.2 thorpej *
95 1.1.8.2 thorpej * main header file for using raidframe in the kernel.
96 1.1.8.2 thorpej *
97 1.1.8.2 thorpej *****************************************************/
98 1.1.8.2 thorpej
99 1.1.8.2 thorpej
100 1.1.8.2 thorpej #ifndef _RF_RAIDFRAMEVAR_H_
101 1.1.8.2 thorpej #define _RF_RAIDFRAMEVAR_H_
102 1.1.8.2 thorpej
103 1.1.8.2 thorpej
104 1.1.8.2 thorpej #include <sys/ioctl.h>
105 1.1.8.2 thorpej
106 1.1.8.2 thorpej #include <sys/errno.h>
107 1.1.8.2 thorpej #include <sys/types.h>
108 1.1.8.2 thorpej
109 1.1.8.2 thorpej #include <sys/uio.h>
110 1.1.8.2 thorpej #include <sys/param.h>
111 1.1.8.2 thorpej #include <sys/proc.h>
112 1.1.8.2 thorpej #include <sys/lock.h>
113 1.1.8.2 thorpej
114 1.1.8.2 thorpej /*
115 1.1.8.2 thorpej * First, define system-dependent types and constants.
116 1.1.8.2 thorpej *
117 1.1.8.2 thorpej * If the machine is big-endian, RF_BIG_ENDIAN should be 1.
118 1.1.8.2 thorpej * Otherwise, it should be 0.
119 1.1.8.2 thorpej *
120 1.1.8.2 thorpej * The various integer types should be self-explanatory; we
121 1.1.8.2 thorpej * use these elsewhere to avoid size confusion.
122 1.1.8.2 thorpej *
123 1.1.8.2 thorpej * LONGSHIFT is lg(sizeof(long)) (that is, log base two of sizeof(long)
124 1.1.8.2 thorpej *
125 1.1.8.2 thorpej */
126 1.1.8.2 thorpej
127 1.1.8.2 thorpej #include <sys/types.h>
128 1.1.8.2 thorpej #include <machine/endian.h>
129 1.1.8.2 thorpej #include <machine/limits.h>
130 1.1.8.2 thorpej
131 1.1.8.2 thorpej #if BYTE_ORDER == BIG_ENDIAN
132 1.1.8.2 thorpej #define RF_IS_BIG_ENDIAN 1
133 1.1.8.2 thorpej #elif BYTE_ORDER == LITTLE_ENDIAN
134 1.1.8.2 thorpej #define RF_IS_BIG_ENDIAN 0
135 1.1.8.2 thorpej #else
136 1.1.8.2 thorpej #error byte order not defined
137 1.1.8.2 thorpej #endif
138 1.1.8.2 thorpej typedef int8_t RF_int8;
139 1.1.8.2 thorpej typedef u_int8_t RF_uint8;
140 1.1.8.2 thorpej typedef int16_t RF_int16;
141 1.1.8.2 thorpej typedef u_int16_t RF_uint16;
142 1.1.8.2 thorpej typedef int32_t RF_int32;
143 1.1.8.2 thorpej typedef u_int32_t RF_uint32;
144 1.1.8.2 thorpej typedef int64_t RF_int64;
145 1.1.8.2 thorpej typedef u_int64_t RF_uint64;
146 1.1.8.2 thorpej #if LONG_BIT == 32
147 1.1.8.2 thorpej #define RF_LONGSHIFT 2
148 1.1.8.2 thorpej #elif LONG_BIT == 64
149 1.1.8.2 thorpej #define RF_LONGSHIFT 3
150 1.1.8.2 thorpej #else
151 1.1.8.2 thorpej #error word size not defined
152 1.1.8.2 thorpej #endif
153 1.1.8.2 thorpej
154 1.1.8.2 thorpej /*
155 1.1.8.2 thorpej * These are just zero and non-zero. We don't use "TRUE"
156 1.1.8.2 thorpej * and "FALSE" because there's too much nonsense trying
157 1.1.8.2 thorpej * to get them defined exactly once on every platform, given
158 1.1.8.2 thorpej * the different places they may be defined in system header
159 1.1.8.2 thorpej * files.
160 1.1.8.2 thorpej */
161 1.1.8.2 thorpej #define RF_TRUE 1
162 1.1.8.2 thorpej #define RF_FALSE 0
163 1.1.8.2 thorpej
164 1.1.8.2 thorpej /*
165 1.1.8.2 thorpej * Now, some generic types
166 1.1.8.2 thorpej */
167 1.1.8.2 thorpej typedef RF_uint64 RF_IoCount_t;
168 1.1.8.2 thorpej typedef RF_uint64 RF_Offset_t;
169 1.1.8.2 thorpej typedef RF_uint32 RF_PSSFlags_t;
170 1.1.8.2 thorpej typedef RF_uint64 RF_SectorCount_t;
171 1.1.8.2 thorpej typedef RF_uint64 RF_StripeCount_t;
172 1.1.8.2 thorpej typedef RF_int64 RF_SectorNum_t;/* these are unsigned so we can set them to
173 1.1.8.2 thorpej * (-1) for "uninitialized" */
174 1.1.8.2 thorpej typedef RF_int64 RF_StripeNum_t;
175 1.1.8.2 thorpej typedef RF_int64 RF_RaidAddr_t;
176 1.1.8.2 thorpej typedef int RF_RowCol_t; /* unsigned so it can be (-1) */
177 1.1.8.2 thorpej typedef RF_int64 RF_HeadSepLimit_t;
178 1.1.8.2 thorpej typedef RF_int64 RF_ReconUnitCount_t;
179 1.1.8.2 thorpej typedef int RF_ReconUnitNum_t;
180 1.1.8.2 thorpej
181 1.1.8.2 thorpej typedef char RF_ParityConfig_t;
182 1.1.8.2 thorpej
183 1.1.8.2 thorpej typedef char RF_DiskQueueType_t[1024];
184 1.1.8.2 thorpej #define RF_DISK_QUEUE_TYPE_NONE ""
185 1.1.8.2 thorpej
186 1.1.8.2 thorpej /* values for the 'type' field in a reconstruction buffer */
187 1.1.8.2 thorpej typedef int RF_RbufType_t;
188 1.1.8.2 thorpej #define RF_RBUF_TYPE_EXCLUSIVE 0 /* this buf assigned exclusively to
189 1.1.8.2 thorpej * one disk */
190 1.1.8.2 thorpej #define RF_RBUF_TYPE_FLOATING 1 /* this is a floating recon buf */
191 1.1.8.2 thorpej #define RF_RBUF_TYPE_FORCED 2 /* this rbuf was allocated to complete
192 1.1.8.2 thorpej * a forced recon */
193 1.1.8.2 thorpej
194 1.1.8.2 thorpej typedef char RF_IoType_t;
195 1.1.8.2 thorpej #define RF_IO_TYPE_READ 'r'
196 1.1.8.2 thorpej #define RF_IO_TYPE_WRITE 'w'
197 1.1.8.2 thorpej #define RF_IO_TYPE_NOP 'n'
198 1.1.8.2 thorpej #define RF_IO_IS_R_OR_W(_type_) (((_type_) == RF_IO_TYPE_READ) \
199 1.1.8.2 thorpej || ((_type_) == RF_IO_TYPE_WRITE))
200 1.1.8.2 thorpej
201 1.1.8.2 thorpej typedef void (*RF_VoidFuncPtr) (void *,...);
202 1.1.8.2 thorpej
203 1.1.8.2 thorpej typedef RF_uint32 RF_AccessStripeMapFlags_t;
204 1.1.8.2 thorpej typedef RF_uint32 RF_DiskQueueDataFlags_t;
205 1.1.8.2 thorpej typedef RF_uint32 RF_DiskQueueFlags_t;
206 1.1.8.2 thorpej typedef RF_uint32 RF_RaidAccessFlags_t;
207 1.1.8.2 thorpej
208 1.1.8.2 thorpej #define RF_DISKQUEUE_DATA_FLAGS_NONE ((RF_DiskQueueDataFlags_t)0)
209 1.1.8.2 thorpej
210 1.1.8.2 thorpej typedef struct RF_AccessStripeMap_s RF_AccessStripeMap_t;
211 1.1.8.2 thorpej typedef struct RF_AccessStripeMapHeader_s RF_AccessStripeMapHeader_t;
212 1.1.8.2 thorpej typedef struct RF_AllocListElem_s RF_AllocListElem_t;
213 1.1.8.2 thorpej typedef struct RF_CallbackDesc_s RF_CallbackDesc_t;
214 1.1.8.2 thorpej typedef struct RF_ChunkDesc_s RF_ChunkDesc_t;
215 1.1.8.2 thorpej typedef struct RF_CommonLogData_s RF_CommonLogData_t;
216 1.1.8.2 thorpej typedef struct RF_Config_s RF_Config_t;
217 1.1.8.2 thorpej typedef struct RF_CumulativeStats_s RF_CumulativeStats_t;
218 1.1.8.2 thorpej typedef struct RF_DagHeader_s RF_DagHeader_t;
219 1.1.8.2 thorpej typedef struct RF_DagList_s RF_DagList_t;
220 1.1.8.2 thorpej typedef struct RF_DagNode_s RF_DagNode_t;
221 1.1.8.2 thorpej typedef struct RF_DeclusteredConfigInfo_s RF_DeclusteredConfigInfo_t;
222 1.1.8.2 thorpej typedef struct RF_DiskId_s RF_DiskId_t;
223 1.1.8.2 thorpej typedef struct RF_DiskMap_s RF_DiskMap_t;
224 1.1.8.2 thorpej typedef struct RF_DiskQueue_s RF_DiskQueue_t;
225 1.1.8.2 thorpej typedef struct RF_DiskQueueData_s RF_DiskQueueData_t;
226 1.1.8.2 thorpej typedef struct RF_DiskQueueSW_s RF_DiskQueueSW_t;
227 1.1.8.2 thorpej typedef struct RF_Etimer_s RF_Etimer_t;
228 1.1.8.2 thorpej typedef struct RF_EventCreate_s RF_EventCreate_t;
229 1.1.8.2 thorpej typedef struct RF_FreeList_s RF_FreeList_t;
230 1.1.8.2 thorpej typedef struct RF_LockReqDesc_s RF_LockReqDesc_t;
231 1.1.8.2 thorpej typedef struct RF_LockTableEntry_s RF_LockTableEntry_t;
232 1.1.8.2 thorpej typedef struct RF_MCPair_s RF_MCPair_t;
233 1.1.8.2 thorpej typedef struct RF_OwnerInfo_s RF_OwnerInfo_t;
234 1.1.8.2 thorpej typedef struct RF_ParityLog_s RF_ParityLog_t;
235 1.1.8.2 thorpej typedef struct RF_ParityLogAppendQueue_s RF_ParityLogAppendQueue_t;
236 1.1.8.2 thorpej typedef struct RF_ParityLogData_s RF_ParityLogData_t;
237 1.1.8.2 thorpej typedef struct RF_ParityLogDiskQueue_s RF_ParityLogDiskQueue_t;
238 1.1.8.2 thorpej typedef struct RF_ParityLogQueue_s RF_ParityLogQueue_t;
239 1.1.8.2 thorpej typedef struct RF_ParityLogRecord_s RF_ParityLogRecord_t;
240 1.1.8.2 thorpej typedef struct RF_PerDiskReconCtrl_s RF_PerDiskReconCtrl_t;
241 1.1.8.2 thorpej typedef struct RF_PSStatusHeader_s RF_PSStatusHeader_t;
242 1.1.8.2 thorpej typedef struct RF_PhysDiskAddr_s RF_PhysDiskAddr_t;
243 1.1.8.2 thorpej typedef struct RF_PropHeader_s RF_PropHeader_t;
244 1.1.8.2 thorpej typedef struct RF_Raid_s RF_Raid_t;
245 1.1.8.2 thorpej typedef struct RF_RaidAccessDesc_s RF_RaidAccessDesc_t;
246 1.1.8.2 thorpej typedef struct RF_RaidDisk_s RF_RaidDisk_t;
247 1.1.8.2 thorpej typedef struct RF_RaidLayout_s RF_RaidLayout_t;
248 1.1.8.2 thorpej typedef struct RF_RaidReconDesc_s RF_RaidReconDesc_t;
249 1.1.8.2 thorpej typedef struct RF_ReconBuffer_s RF_ReconBuffer_t;
250 1.1.8.2 thorpej typedef struct RF_ReconConfig_s RF_ReconConfig_t;
251 1.1.8.2 thorpej typedef struct RF_ReconCtrl_s RF_ReconCtrl_t;
252 1.1.8.2 thorpej typedef struct RF_ReconDoneProc_s RF_ReconDoneProc_t;
253 1.1.8.2 thorpej typedef struct RF_ReconEvent_s RF_ReconEvent_t;
254 1.1.8.2 thorpej typedef struct RF_ReconMap_s RF_ReconMap_t;
255 1.1.8.2 thorpej typedef struct RF_ReconMapListElem_s RF_ReconMapListElem_t;
256 1.1.8.2 thorpej typedef struct RF_ReconParityStripeStatus_s RF_ReconParityStripeStatus_t;
257 1.1.8.2 thorpej typedef struct RF_RedFuncs_s RF_RedFuncs_t;
258 1.1.8.2 thorpej typedef struct RF_RegionBufferQueue_s RF_RegionBufferQueue_t;
259 1.1.8.2 thorpej typedef struct RF_RegionInfo_s RF_RegionInfo_t;
260 1.1.8.2 thorpej typedef struct RF_ShutdownList_s RF_ShutdownList_t;
261 1.1.8.2 thorpej typedef struct RF_SpareTableEntry_s RF_SpareTableEntry_t;
262 1.1.8.2 thorpej typedef struct RF_SparetWait_s RF_SparetWait_t;
263 1.1.8.2 thorpej typedef struct RF_StripeLockDesc_s RF_StripeLockDesc_t;
264 1.1.8.2 thorpej typedef struct RF_ThreadGroup_s RF_ThreadGroup_t;
265 1.1.8.2 thorpej typedef struct RF_ThroughputStats_s RF_ThroughputStats_t;
266 1.1.8.2 thorpej
267 1.1.8.2 thorpej /*
268 1.1.8.2 thorpej * Important assumptions regarding ordering of the states in this list
269 1.1.8.2 thorpej * have been made!!! Before disturbing this ordering, look at code in
270 1.1.8.2 thorpej * sys/dev/raidframe/rf_states.c
271 1.1.8.2 thorpej */
272 1.1.8.2 thorpej typedef enum RF_AccessState_e {
273 1.1.8.2 thorpej /* original states */
274 1.1.8.2 thorpej rf_QuiesceState, /* handles queisence for reconstruction */
275 1.1.8.2 thorpej rf_IncrAccessesCountState, /* count accesses in flight */
276 1.1.8.2 thorpej rf_DecrAccessesCountState,
277 1.1.8.2 thorpej rf_MapState, /* map access to disk addresses */
278 1.1.8.2 thorpej rf_LockState, /* take stripe locks */
279 1.1.8.2 thorpej rf_CreateDAGState, /* create DAGs */
280 1.1.8.2 thorpej rf_ExecuteDAGState, /* execute DAGs */
281 1.1.8.2 thorpej rf_ProcessDAGState, /* DAGs are completing- check if correct,
282 1.1.8.2 thorpej * or if we need to retry */
283 1.1.8.2 thorpej rf_CleanupState, /* release stripe locks, clean up */
284 1.1.8.2 thorpej rf_LastState /* must be the last state */
285 1.1.8.2 thorpej } RF_AccessState_t;
286 1.1.8.2 thorpej
287 1.1.8.2 thorpej
288 1.1.8.2 thorpej /* Some constants related to RAIDframe. These are arbitrary and
289 1.1.8.2 thorpej can be modified at will. */
290 1.1.8.2 thorpej
291 1.1.8.2 thorpej #define RF_MAXROW 10
292 1.1.8.2 thorpej #define RF_MAXCOL 40
293 1.1.8.2 thorpej #define RF_MAXSPARE 10
294 1.1.8.2 thorpej #define RF_MAXDBGV 75 /* max number of debug variables */
295 1.1.8.2 thorpej #define RF_MAX_DISKS 128 /* max disks per array */
296 1.1.8.2 thorpej #define RF_SPAREMAP_NAME_LEN 128
297 1.1.8.2 thorpej #define RF_PROTECTED_SECTORS 64L /* # of sectors at start of disk to
298 1.1.8.2 thorpej exclude from RAID address space */
299 1.1.8.2 thorpej
300 1.1.8.2 thorpej struct RF_SpareTableEntry_s {
301 1.1.8.2 thorpej u_int spareDisk; /* disk to which this block is spared */
302 1.1.8.2 thorpej u_int spareBlockOffsetInSUs; /* offset into spare table for that
303 1.1.8.2 thorpej * disk */
304 1.1.8.2 thorpej };
305 1.1.8.2 thorpej
306 1.1.8.2 thorpej union RF_GenericParam_u {
307 1.1.8.2 thorpej void *p;
308 1.1.8.2 thorpej RF_uint64 v;
309 1.1.8.2 thorpej };
310 1.1.8.2 thorpej typedef union RF_GenericParam_u RF_DagParam_t;
311 1.1.8.2 thorpej typedef union RF_GenericParam_u RF_CBParam_t;
312 1.1.8.2 thorpej
313 1.1.8.2 thorpej /* the raidframe configuration, passed down through an ioctl.
314 1.1.8.2 thorpej * the driver can be reconfigured (with total loss of data) at any time,
315 1.1.8.2 thorpej * but it must be shut down first.
316 1.1.8.2 thorpej */
317 1.1.8.2 thorpej struct RF_Config_s {
318 1.1.8.2 thorpej RF_RowCol_t numRow, numCol, numSpare; /* number of rows, columns,
319 1.1.8.2 thorpej * and spare disks */
320 1.1.8.2 thorpej dev_t devs[RF_MAXROW][RF_MAXCOL]; /* device numbers for disks
321 1.1.8.2 thorpej * comprising array */
322 1.1.8.2 thorpej char devnames[RF_MAXROW][RF_MAXCOL][50]; /* device names */
323 1.1.8.2 thorpej dev_t spare_devs[RF_MAXSPARE]; /* device numbers for spare
324 1.1.8.2 thorpej * disks */
325 1.1.8.2 thorpej char spare_names[RF_MAXSPARE][50]; /* device names */
326 1.1.8.2 thorpej RF_SectorNum_t sectPerSU; /* sectors per stripe unit */
327 1.1.8.2 thorpej RF_StripeNum_t SUsPerPU;/* stripe units per parity unit */
328 1.1.8.2 thorpej RF_StripeNum_t SUsPerRU;/* stripe units per reconstruction unit */
329 1.1.8.2 thorpej RF_ParityConfig_t parityConfig; /* identifies the RAID architecture to
330 1.1.8.2 thorpej * be used */
331 1.1.8.2 thorpej RF_DiskQueueType_t diskQueueType; /* 'f' = fifo, 'c' = cvscan,
332 1.1.8.2 thorpej * not used in kernel */
333 1.1.8.2 thorpej char maxOutstandingDiskReqs; /* # concurrent reqs to be sent to a
334 1.1.8.2 thorpej * disk. not used in kernel. */
335 1.1.8.2 thorpej char debugVars[RF_MAXDBGV][50]; /* space for specifying debug
336 1.1.8.2 thorpej * variables & their values */
337 1.1.8.2 thorpej unsigned int layoutSpecificSize; /* size in bytes of
338 1.1.8.2 thorpej * layout-specific info */
339 1.1.8.2 thorpej void *layoutSpecific; /* a pointer to a layout-specific structure to
340 1.1.8.2 thorpej * be copied in */
341 1.1.8.2 thorpej int force; /* if !0, ignore many fatal
342 1.1.8.2 thorpej configuration conditions */
343 1.1.8.2 thorpej /*
344 1.1.8.2 thorpej "force" is used to override cases where the component labels would
345 1.1.8.2 thorpej indicate that configuration should not proceed without user
346 1.1.8.2 thorpej intervention
347 1.1.8.2 thorpej */
348 1.1.8.2 thorpej };
349 1.1.8.2 thorpej
350 1.1.8.2 thorpej typedef RF_uint32 RF_ReconReqFlags_t;
351 1.1.8.2 thorpej /* flags that can be put in the rf_recon_req structure */
352 1.1.8.2 thorpej #define RF_FDFLAGS_NONE 0x0 /* just fail the disk */
353 1.1.8.2 thorpej #define RF_FDFLAGS_RECON 0x1 /* fail and initiate recon */
354 1.1.8.2 thorpej
355 1.1.8.2 thorpej struct rf_recon_req { /* used to tell the kernel to fail a disk */
356 1.1.8.2 thorpej RF_RowCol_t row, col;
357 1.1.8.2 thorpej RF_ReconReqFlags_t flags;
358 1.1.8.2 thorpej void *raidPtr; /* used internally; need not be set at ioctl
359 1.1.8.2 thorpej * time */
360 1.1.8.2 thorpej struct rf_recon_req *next; /* used internally; need not be set at
361 1.1.8.2 thorpej * ioctl time */
362 1.1.8.2 thorpej };
363 1.1.8.2 thorpej
364 1.1.8.2 thorpej struct RF_SparetWait_s {
365 1.1.8.2 thorpej int C, G, fcol; /* C = # disks in row, G = # units in stripe,
366 1.1.8.2 thorpej * fcol = which disk has failed */
367 1.1.8.2 thorpej
368 1.1.8.2 thorpej RF_StripeCount_t SUsPerPU; /* this stuff is the info required to
369 1.1.8.2 thorpej * create a spare table */
370 1.1.8.2 thorpej int TablesPerSpareRegion;
371 1.1.8.2 thorpej int BlocksPerTable;
372 1.1.8.2 thorpej RF_StripeCount_t TableDepthInPUs;
373 1.1.8.2 thorpej RF_StripeCount_t SpareSpaceDepthPerRegionInSUs;
374 1.1.8.2 thorpej
375 1.1.8.2 thorpej RF_SparetWait_t *next; /* used internally; need not be set at ioctl
376 1.1.8.2 thorpej * time */
377 1.1.8.2 thorpej };
378 1.1.8.2 thorpej /*
379 1.1.8.2 thorpej * A physical disk can be in one of several states:
380 1.1.8.2 thorpej * IF YOU ADD A STATE, CHECK TO SEE IF YOU NEED TO MODIFY RF_DEAD_DISK().
381 1.1.8.2 thorpej */
382 1.1.8.2 thorpej enum RF_DiskStatus_e {
383 1.1.8.2 thorpej rf_ds_optimal, /* no problems */
384 1.1.8.2 thorpej rf_ds_failed, /* reconstruction ongoing */
385 1.1.8.2 thorpej rf_ds_reconstructing, /* reconstruction complete to spare, dead disk
386 1.1.8.2 thorpej * not yet replaced */
387 1.1.8.2 thorpej rf_ds_dist_spared, /* reconstruction complete to distributed
388 1.1.8.2 thorpej * spare space, dead disk not yet replaced */
389 1.1.8.2 thorpej rf_ds_spared, /* reconstruction complete to distributed
390 1.1.8.2 thorpej * spare space, dead disk not yet replaced */
391 1.1.8.2 thorpej rf_ds_spare, /* an available spare disk */
392 1.1.8.2 thorpej rf_ds_used_spare /* a spare which has been used, and hence is
393 1.1.8.2 thorpej * not available */
394 1.1.8.2 thorpej };
395 1.1.8.2 thorpej typedef enum RF_DiskStatus_e RF_DiskStatus_t;
396 1.1.8.2 thorpej
397 1.1.8.2 thorpej struct RF_RaidDisk_s {
398 1.1.8.2 thorpej char devname[56]; /* name of device file */
399 1.1.8.2 thorpej RF_DiskStatus_t status; /* whether it is up or down */
400 1.1.8.2 thorpej RF_RowCol_t spareRow; /* if in status "spared", this identifies the
401 1.1.8.2 thorpej * spare disk */
402 1.1.8.2 thorpej RF_RowCol_t spareCol; /* if in status "spared", this identifies the
403 1.1.8.2 thorpej * spare disk */
404 1.1.8.2 thorpej RF_SectorCount_t numBlocks; /* number of blocks, obtained via READ
405 1.1.8.2 thorpej * CAPACITY */
406 1.1.8.2 thorpej int blockSize;
407 1.1.8.2 thorpej RF_SectorCount_t partitionSize; /* The *actual* and *full* size of
408 1.1.8.2 thorpej the partition, from the disklabel */
409 1.1.8.2 thorpej int auto_configured;/* 1 if this component was autoconfigured.
410 1.1.8.2 thorpej 0 otherwise. */
411 1.1.8.2 thorpej dev_t dev;
412 1.1.8.2 thorpej };
413 1.1.8.2 thorpej /* The per-component label information that the user can set */
414 1.1.8.2 thorpej typedef struct RF_ComponentInfo_s {
415 1.1.8.2 thorpej int row; /* the row number of this component */
416 1.1.8.2 thorpej int column; /* the column number of this component */
417 1.1.8.2 thorpej int serial_number; /* a user-specified serial number for this
418 1.1.8.2 thorpej RAID set */
419 1.1.8.2 thorpej } RF_ComponentInfo_t;
420 1.1.8.2 thorpej
421 1.1.8.2 thorpej /* The per-component label information */
422 1.1.8.2 thorpej typedef struct RF_ComponentLabel_s {
423 1.1.8.2 thorpej int version; /* The version of this label. */
424 1.1.8.2 thorpej int serial_number; /* a user-specified serial number for this
425 1.1.8.2 thorpej RAID set */
426 1.1.8.2 thorpej int mod_counter; /* modification counter. Changed (usually
427 1.1.8.2 thorpej by incrementing) every time the label
428 1.1.8.2 thorpej is changed */
429 1.1.8.2 thorpej int row; /* the row number of this component */
430 1.1.8.2 thorpej int column; /* the column number of this component */
431 1.1.8.2 thorpej int num_rows; /* number of rows in this RAID set */
432 1.1.8.2 thorpej int num_columns; /* number of columns in this RAID set */
433 1.1.8.2 thorpej int clean; /* 1 when clean, 0 when dirty */
434 1.1.8.2 thorpej int status; /* rf_ds_optimal, rf_ds_dist_spared, whatever. */
435 1.1.8.2 thorpej /* stuff that will be in version 2 of the label */
436 1.1.8.2 thorpej int sectPerSU; /* Sectors per Stripe Unit */
437 1.1.8.2 thorpej int SUsPerPU; /* Stripe Units per Parity Units */
438 1.1.8.2 thorpej int SUsPerRU; /* Stripe Units per Reconstruction Units */
439 1.1.8.2 thorpej int parityConfig; /* '0' == RAID0, '1' == RAID1, etc. */
440 1.1.8.2 thorpej int maxOutstanding; /* maxOutstanding disk requests */
441 1.1.8.2 thorpej int blockSize; /* size of component block.
442 1.1.8.2 thorpej (disklabel->d_secsize) */
443 1.1.8.2 thorpej int numBlocks; /* number of blocks on this component. May
444 1.1.8.2 thorpej be smaller than the partition size. */
445 1.1.8.2 thorpej int partitionSize; /* number of blocks on this *partition*.
446 1.1.8.2 thorpej Must exactly match the partition size
447 1.1.8.2 thorpej from the disklabel. */
448 1.1.8.2 thorpej int future_use[33]; /* Future expansion */
449 1.1.8.2 thorpej int autoconfigure; /* automatically configure this RAID set.
450 1.1.8.2 thorpej 0 == no, 1 == yes */
451 1.1.8.2 thorpej int root_partition; /* Use this set as /
452 1.1.8.2 thorpej 0 == no, 1 == yes*/
453 1.1.8.2 thorpej int last_unit; /* last unit number (e.g. 0 for /dev/raid0)
454 1.1.8.2 thorpej of this component. Used for autoconfigure
455 1.1.8.2 thorpej only. */
456 1.1.8.2 thorpej int config_order; /* 0 .. n. The order in which the component
457 1.1.8.2 thorpej should be auto-configured. E.g. 0 is will
458 1.1.8.2 thorpej done first, (and would become raid0).
459 1.1.8.2 thorpej This may be in conflict with last_unit!!?! */
460 1.1.8.2 thorpej /* Not currently used. */
461 1.1.8.2 thorpej int future_use2[44]; /* More future expansion */
462 1.1.8.2 thorpej } RF_ComponentLabel_t;
463 1.1.8.2 thorpej
464 1.1.8.2 thorpej typedef struct RF_SingleComponent_s {
465 1.1.8.2 thorpej int row;
466 1.1.8.2 thorpej int column;
467 1.1.8.2 thorpej char component_name[50]; /* name of the component */
468 1.1.8.2 thorpej } RF_SingleComponent_t;
469 1.1.8.2 thorpej
470 1.1.8.2 thorpej typedef struct RF_DeviceConfig_s {
471 1.1.8.2 thorpej u_int rows;
472 1.1.8.2 thorpej u_int cols;
473 1.1.8.2 thorpej u_int maxqdepth;
474 1.1.8.2 thorpej int ndevs;
475 1.1.8.2 thorpej RF_RaidDisk_t devs[RF_MAX_DISKS];
476 1.1.8.2 thorpej int nspares;
477 1.1.8.2 thorpej RF_RaidDisk_t spares[RF_MAX_DISKS];
478 1.1.8.2 thorpej } RF_DeviceConfig_t;
479 1.1.8.2 thorpej
480 1.1.8.2 thorpej typedef struct RF_ProgressInfo_s {
481 1.1.8.2 thorpej RF_uint64 remaining;
482 1.1.8.2 thorpej RF_uint64 completed;
483 1.1.8.2 thorpej RF_uint64 total;
484 1.1.8.2 thorpej } RF_ProgressInfo_t;
485 1.1.8.2 thorpej
486 1.1.8.2 thorpej typedef struct RF_LayoutSW_s {
487 1.1.8.2 thorpej RF_ParityConfig_t parityConfig;
488 1.1.8.2 thorpej const char *configName;
489 1.1.8.2 thorpej
490 1.1.8.2 thorpej #ifndef _KERNEL
491 1.1.8.2 thorpej /* layout-specific parsing */
492 1.1.8.2 thorpej int (*MakeLayoutSpecific) (FILE * fp, RF_Config_t * cfgPtr,
493 1.1.8.2 thorpej void *arg);
494 1.1.8.2 thorpej void *makeLayoutSpecificArg;
495 1.1.8.2 thorpej #else /* !KERNEL */
496 1.1.8.2 thorpej
497 1.1.8.2 thorpej /* initialization routine */
498 1.1.8.2 thorpej int (*Configure) (RF_ShutdownList_t ** shutdownListp,
499 1.1.8.2 thorpej RF_Raid_t * raidPtr, RF_Config_t * cfgPtr);
500 1.1.8.2 thorpej
501 1.1.8.2 thorpej /* routine to map RAID sector address -> physical (row, col, offset) */
502 1.1.8.2 thorpej void (*MapSector) (RF_Raid_t * raidPtr, RF_RaidAddr_t raidSector,
503 1.1.8.2 thorpej RF_RowCol_t * row, RF_RowCol_t * col,
504 1.1.8.2 thorpej RF_SectorNum_t * diskSector, int remap);
505 1.1.8.2 thorpej
506 1.1.8.2 thorpej /* routine to map RAID sector address -> physical (r,c,o) of parity
507 1.1.8.2 thorpej * unit */
508 1.1.8.2 thorpej void (*MapParity) (RF_Raid_t * raidPtr, RF_RaidAddr_t raidSector,
509 1.1.8.2 thorpej RF_RowCol_t * row, RF_RowCol_t * col,
510 1.1.8.2 thorpej RF_SectorNum_t * diskSector, int remap);
511 1.1.8.2 thorpej
512 1.1.8.2 thorpej /* routine to map RAID sector address -> physical (r,c,o) of Q unit */
513 1.1.8.2 thorpej void (*MapQ) (RF_Raid_t * raidPtr, RF_RaidAddr_t raidSector,
514 1.1.8.2 thorpej RF_RowCol_t * row, RF_RowCol_t * col,
515 1.1.8.2 thorpej RF_SectorNum_t * diskSector, int remap);
516 1.1.8.2 thorpej
517 1.1.8.2 thorpej /* routine to identify the disks comprising a stripe */
518 1.1.8.2 thorpej void (*IdentifyStripe) (RF_Raid_t * raidPtr, RF_RaidAddr_t addr,
519 1.1.8.2 thorpej RF_RowCol_t ** diskids,
520 1.1.8.2 thorpej RF_RowCol_t * outRow);
521 1.1.8.2 thorpej
522 1.1.8.2 thorpej /* routine to select a dag */
523 1.1.8.2 thorpej void (*SelectionFunc) (RF_Raid_t * raidPtr, RF_IoType_t type,
524 1.1.8.2 thorpej RF_AccessStripeMap_t * asmap,
525 1.1.8.2 thorpej RF_VoidFuncPtr *);
526 1.1.8.2 thorpej
527 1.1.8.2 thorpej /* map a stripe ID to a parity stripe ID. This is typically the
528 1.1.8.2 thorpej * identity mapping */
529 1.1.8.2 thorpej void (*MapSIDToPSID) (RF_RaidLayout_t * layoutPtr,
530 1.1.8.2 thorpej RF_StripeNum_t stripeID,
531 1.1.8.2 thorpej RF_StripeNum_t * psID,
532 1.1.8.2 thorpej RF_ReconUnitNum_t * which_ru);
533 1.1.8.2 thorpej
534 1.1.8.2 thorpej /* get default head separation limit (may be NULL) */
535 1.1.8.2 thorpej RF_HeadSepLimit_t(*GetDefaultHeadSepLimit) (RF_Raid_t * raidPtr);
536 1.1.8.2 thorpej
537 1.1.8.2 thorpej /* get default num recon buffers (may be NULL) */
538 1.1.8.2 thorpej int (*GetDefaultNumFloatingReconBuffers) (RF_Raid_t * raidPtr);
539 1.1.8.2 thorpej
540 1.1.8.2 thorpej /* get number of spare recon units (may be NULL) */
541 1.1.8.2 thorpej RF_ReconUnitCount_t(*GetNumSpareRUs) (RF_Raid_t * raidPtr);
542 1.1.8.2 thorpej
543 1.1.8.2 thorpej /* spare table installation (may be NULL) */
544 1.1.8.2 thorpej int (*InstallSpareTable) (RF_Raid_t * raidPtr, RF_RowCol_t frow,
545 1.1.8.2 thorpej RF_RowCol_t fcol);
546 1.1.8.2 thorpej
547 1.1.8.2 thorpej /* recon buffer submission function */
548 1.1.8.2 thorpej int (*SubmitReconBuffer) (RF_ReconBuffer_t * rbuf, int keep_it,
549 1.1.8.2 thorpej int use_committed);
550 1.1.8.2 thorpej
551 1.1.8.2 thorpej /*
552 1.1.8.2 thorpej * verify that parity information for a stripe is correct
553 1.1.8.2 thorpej * see rf_parityscan.h for return vals
554 1.1.8.2 thorpej */
555 1.1.8.2 thorpej int (*VerifyParity) (RF_Raid_t * raidPtr, RF_RaidAddr_t raidAddr,
556 1.1.8.2 thorpej RF_PhysDiskAddr_t * parityPDA,
557 1.1.8.2 thorpej int correct_it, RF_RaidAccessFlags_t flags);
558 1.1.8.2 thorpej
559 1.1.8.2 thorpej /* number of faults tolerated by this mapping */
560 1.1.8.2 thorpej int faultsTolerated;
561 1.1.8.2 thorpej
562 1.1.8.2 thorpej /* states to step through in an access. Must end with "LastState". The
563 1.1.8.2 thorpej * default is DefaultStates in rf_layout.c */
564 1.1.8.2 thorpej RF_AccessState_t *states;
565 1.1.8.2 thorpej
566 1.1.8.2 thorpej RF_AccessStripeMapFlags_t flags;
567 1.1.8.2 thorpej #endif /* !KERNEL */
568 1.1.8.2 thorpej } RF_LayoutSW_t;
569 1.1.8.2 thorpej
570 1.1.8.2 thorpej #endif /* !_RF_RAIDFRAMEVAR_H_ */
571