1 /*	$OpenBSD: rf_types.h,v 1.6 2002/12/16 07:01:05 tdeval Exp $	*/
2 /*	$NetBSD: rf_types.h,v 1.6 1999/09/05 03:05:55 oster Exp $	*/
3 
4 /*
5  * rf_types.h
6  */
7 /*
8  * Copyright (c) 1995 Carnegie-Mellon University.
9  * All rights reserved.
10  *
11  * Author: Jim Zelenka
12  *
13  * Permission to use, copy, modify and distribute this software and
14  * its documentation is hereby granted, provided that both the copyright
15  * notice and this permission notice appear in all copies of the
16  * software, derivative works or modified versions, and any portions
17  * thereof, and that both notices appear in supporting documentation.
18  *
19  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
20  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
21  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
22  *
23  * Carnegie Mellon requests users of this software to return to
24  *
25  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
26  *  School of Computer Science
27  *  Carnegie Mellon University
28  *  Pittsburgh PA 15213-3890
29  *
30  * any improvements or extensions that they make and grant Carnegie the
31  * rights to redistribute these changes.
32  */
33 /***********************************************************
34  *
35  * rf_types.h -- Standard types for RAIDframe.
36  *
37  ***********************************************************/
38 
39 #ifndef	_RF__RF_TYPES_H_
40 #define	_RF__RF_TYPES_H_
41 
42 
43 #include "rf_archs.h"
44 
45 #include <sys/errno.h>
46 #include <sys/types.h>
47 
48 #include <sys/uio.h>
49 #include <sys/param.h>
50 #include <sys/lock.h>
51 
52 /*
53  * First, define system-dependent types and constants.
54  *
55  * If the machine is big-endian, RF_BIG_ENDIAN should be 1.
56  * Otherwise, it should be 0.
57  *
58  * The various integer types should be self-explanatory; we
59  * use these elsewhere to avoid size confusion.
60  *
61  * LONGSHIFT is lg(sizeof(long)) (that is, log base two of sizeof(long))
62  *
63  */
64 
65 #include <sys/types.h>
66 #include <sys/limits.h>
67 #include <machine/endian.h>
68 
69 #if	BYTE_ORDER == BIG_ENDIAN
70 #define	RF_IS_BIG_ENDIAN	1
71 #elif	BYTE_ORDER == LITTLE_ENDIAN
72 #define	RF_IS_BIG_ENDIAN	0
73 #else
74 #error byte order not defined
75 #endif
76 typedef int8_t		RF_int8;
77 typedef u_int8_t	RF_uint8;
78 typedef int16_t		RF_int16;
79 typedef u_int16_t	RF_uint16;
80 typedef int32_t		RF_int32;
81 typedef u_int32_t	RF_uint32;
82 typedef int64_t		RF_int64;
83 typedef u_int64_t	RF_uint64;
84 #if	LONG_BIT == 32
85 #define	RF_LONGSHIFT		2
86 #elif	LONG_BIT == 64
87 #define	RF_LONGSHIFT		3
88 #else
89 #error word size not defined
90 #endif
91 
92 /*
93  * These are just zero and non-zero. We don't use "TRUE"
94  * and "FALSE" because there's too much nonsense trying
95  * to get them defined exactly once on every platform, given
96  * the different places they may be defined in system header
97  * files.
98  */
99 #define	RF_TRUE			1
100 #define	RF_FALSE		0
101 
102 /*
103  * Now, some generic types.
104  */
105 typedef RF_uint64	RF_IoCount_t;
106 typedef RF_uint64	RF_Offset_t;
107 typedef RF_uint32	RF_PSSFlags_t;
108 typedef RF_uint64	RF_SectorCount_t;
109 typedef RF_uint64	RF_StripeCount_t;
110 typedef RF_int64	RF_SectorNum_t;	/*
111 					 * These are unsigned so we can set
112 					 * them to (-1) for "uninitialized".
113 					 */
114 typedef RF_int64	RF_StripeNum_t;
115 typedef RF_int64	RF_RaidAddr_t;
116 typedef int		RF_RowCol_t;	/* Unsigned so it can be (-1). */
117 typedef RF_int64	RF_HeadSepLimit_t;
118 typedef RF_int64	RF_ReconUnitCount_t;
119 typedef int		RF_ReconUnitNum_t;
120 
121 typedef char		RF_ParityConfig_t;
122 
123 typedef char		RF_DiskQueueType_t[1024];
124 #define	RF_DISK_QUEUE_TYPE_NONE	""
125 
126 /* Values for the 'type' field in a reconstruction buffer. */
127 typedef int		RF_RbufType_t;
128 #define	RF_RBUF_TYPE_EXCLUSIVE	0	/*
129 					 * This buf assigned exclusively to
130 					 * one disk.
131 					 */
132 #define	RF_RBUF_TYPE_FLOATING	1	/* This is a floating recon buf. */
133 #define	RF_RBUF_TYPE_FORCED	2	/*
134 					 * This rbuf was allocated to complete
135 					 * a forced recon.
136 					 */
137 
138 typedef char		RF_IoType_t;
139 #define	RF_IO_TYPE_READ		'r'
140 #define	RF_IO_TYPE_WRITE	'w'
141 #define	RF_IO_TYPE_NOP		'n'
142 #define	RF_IO_IS_R_OR_W(_type_)						\
143 	(((_type_) == RF_IO_TYPE_READ) || ((_type_) == RF_IO_TYPE_WRITE))
144 
145 typedef void		(*RF_VoidFuncPtr) (void *,...);
146 
147 typedef RF_uint32	RF_AccessStripeMapFlags_t;
148 typedef RF_uint32	RF_DiskQueueDataFlags_t;
149 typedef RF_uint32	RF_DiskQueueFlags_t;
150 typedef RF_uint32	RF_RaidAccessFlags_t;
151 
152 #define	RF_DISKQUEUE_DATA_FLAGS_NONE	((RF_DiskQueueDataFlags_t)0)
153 
154 typedef struct RF_AccessStripeMap_s		RF_AccessStripeMap_t;
155 typedef struct RF_AccessStripeMapHeader_s	RF_AccessStripeMapHeader_t;
156 typedef struct RF_AllocListElem_s		RF_AllocListElem_t;
157 typedef struct RF_CallbackDesc_s		RF_CallbackDesc_t;
158 typedef struct RF_ChunkDesc_s			RF_ChunkDesc_t;
159 typedef struct RF_CommonLogData_s		RF_CommonLogData_t;
160 typedef struct RF_Config_s			RF_Config_t;
161 typedef struct RF_CumulativeStats_s		RF_CumulativeStats_t;
162 typedef struct RF_DagHeader_s			RF_DagHeader_t;
163 typedef struct RF_DagList_s			RF_DagList_t;
164 typedef struct RF_DagNode_s			RF_DagNode_t;
165 typedef struct RF_DeclusteredConfigInfo_s	RF_DeclusteredConfigInfo_t;
166 typedef struct RF_DiskId_s			RF_DiskId_t;
167 typedef struct RF_DiskMap_s			RF_DiskMap_t;
168 typedef struct RF_DiskQueue_s			RF_DiskQueue_t;
169 typedef struct RF_DiskQueueData_s		RF_DiskQueueData_t;
170 typedef struct RF_DiskQueueSW_s			RF_DiskQueueSW_t;
171 typedef struct RF_Etimer_s			RF_Etimer_t;
172 typedef struct RF_EventCreate_s			RF_EventCreate_t;
173 typedef struct RF_FreeList_s			RF_FreeList_t;
174 typedef struct RF_LockReqDesc_s			RF_LockReqDesc_t;
175 typedef struct RF_LockTableEntry_s		RF_LockTableEntry_t;
176 typedef struct RF_MCPair_s			RF_MCPair_t;
177 typedef struct RF_OwnerInfo_s			RF_OwnerInfo_t;
178 typedef struct RF_ParityLog_s			RF_ParityLog_t;
179 typedef struct RF_ParityLogAppendQueue_s	RF_ParityLogAppendQueue_t;
180 typedef struct RF_ParityLogData_s		RF_ParityLogData_t;
181 typedef struct RF_ParityLogDiskQueue_s		RF_ParityLogDiskQueue_t;
182 typedef struct RF_ParityLogQueue_s		RF_ParityLogQueue_t;
183 typedef struct RF_ParityLogRecord_s		RF_ParityLogRecord_t;
184 typedef struct RF_PerDiskReconCtrl_s		RF_PerDiskReconCtrl_t;
185 typedef struct RF_PSStatusHeader_s		RF_PSStatusHeader_t;
186 typedef struct RF_PhysDiskAddr_s		RF_PhysDiskAddr_t;
187 typedef struct RF_PropHeader_s			RF_PropHeader_t;
188 typedef struct RF_Raid_s			RF_Raid_t;
189 typedef struct RF_RaidAccessDesc_s		RF_RaidAccessDesc_t;
190 typedef struct RF_RaidDisk_s			RF_RaidDisk_t;
191 typedef struct RF_RaidLayout_s			RF_RaidLayout_t;
192 typedef struct RF_RaidReconDesc_s		RF_RaidReconDesc_t;
193 typedef struct RF_ReconBuffer_s			RF_ReconBuffer_t;
194 typedef struct RF_ReconConfig_s			RF_ReconConfig_t;
195 typedef struct RF_ReconCtrl_s			RF_ReconCtrl_t;
196 typedef struct RF_ReconDoneProc_s		RF_ReconDoneProc_t;
197 typedef struct RF_ReconEvent_s			RF_ReconEvent_t;
198 typedef struct RF_ReconMap_s			RF_ReconMap_t;
199 typedef struct RF_ReconMapListElem_s		RF_ReconMapListElem_t;
200 typedef struct RF_ReconParityStripeStatus_s	RF_ReconParityStripeStatus_t;
201 typedef struct RF_RedFuncs_s			RF_RedFuncs_t;
202 typedef struct RF_RegionBufferQueue_s		RF_RegionBufferQueue_t;
203 typedef struct RF_RegionInfo_s			RF_RegionInfo_t;
204 typedef struct RF_ShutdownList_s		RF_ShutdownList_t;
205 typedef struct RF_SpareTableEntry_s		RF_SpareTableEntry_t;
206 typedef struct RF_SparetWait_s			RF_SparetWait_t;
207 typedef struct RF_StripeLockDesc_s		RF_StripeLockDesc_t;
208 typedef struct RF_ThreadGroup_s			RF_ThreadGroup_t;
209 typedef struct RF_ThroughputStats_s		RF_ThroughputStats_t;
210 
211 /*
212  * Important assumptions regarding ordering of the states in this list
213  * have been made !!!
214  * Before disturbing this ordering, look at code in rf_states.c
215  */
216 typedef enum RF_AccessState_e {
217 	/* Original states. */
218 	rf_QuiesceState,	/* Handles quiescence for reconstruction. */
219 	rf_IncrAccessesCountState, /* Count accesses in flight. */
220 	rf_DecrAccessesCountState,
221 	rf_MapState,		/* Map access to disk addresses. */
222 	rf_LockState,		/* Take stripe locks. */
223 	rf_CreateDAGState,	/* Create DAGs. */
224 	rf_ExecuteDAGState,	/* Execute DAGs. */
225 	rf_ProcessDAGState,	/*
226 				 * DAGs are completing - check if correct, or
227 				 * if we need to retry.
228 				 */
229 	rf_CleanupState,	/* Release stripe locks, clean up. */
230 	rf_LastState		/* Must be the last state. */
231 }       RF_AccessState_t;
232 #define	RF_MAXROW	10	/*
233 				 * These are arbitrary and can be modified at
234 				 * will.
235 				 */
236 #define	RF_MAXCOL	40
237 #define	RF_MAXSPARE	10
238 #define	RF_MAXDBGV	75	/* Max number of debug variables. */
239 #define	RF_MAXDBGVLEN	50	/* Max length of debug variables. */
240 
241 union RF_GenericParam_u {
242 	void		*p;
243 	RF_uint64	 v;
244 };
245 typedef union RF_GenericParam_u	RF_DagParam_t;
246 typedef union RF_GenericParam_u	RF_CBParam_t;
247 
248 #endif	/* _RF__RF_TYPES_H_ */
249