1 /*	$OpenBSD: rf_paritylog.h,v 1.3 2002/12/16 07:01:04 tdeval Exp $	*/
2 /*	$NetBSD: rf_paritylog.h,v 1.3 1999/02/05 00:06:14 oster Exp $	*/
3 
4 /*
5  * Copyright (c) 1995 Carnegie-Mellon University.
6  * All rights reserved.
7  *
8  * Author: William V. Courtright II
9  *
10  * Permission to use, copy, modify and distribute this software and
11  * its documentation is hereby granted, provided that both the copyright
12  * notice and this permission notice appear in all copies of the
13  * software, derivative works or modified versions, and any portions
14  * thereof, and that both notices appear in supporting documentation.
15  *
16  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19  *
20  * Carnegie Mellon requests users of this software to return to
21  *
22  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
23  *  School of Computer Science
24  *  Carnegie Mellon University
25  *  Pittsburgh PA 15213-3890
26  *
27  * any improvements or extensions that they make and grant Carnegie the
28  * rights to redistribute these changes.
29  */
30 
31 /*
32  * Header file for parity log.
33  */
34 
35 #ifndef	_RF__RF_PARITYLOG_H_
36 #define	_RF__RF_PARITYLOG_H_
37 
38 #include "rf_types.h"
39 
40 #define	RF_DEFAULT_NUM_SECTORS_PER_LOG		64
41 
42 typedef int RF_RegionId_t;
43 
44 typedef enum RF_ParityRecordType_e {
45 	RF_STOP,
46 	RF_UPDATE,
47 	RF_OVERWRITE
48 } RF_ParityRecordType_t;
49 
50 struct RF_CommonLogData_s {
51 	RF_DECLARE_MUTEX(mutex);	/* Protects cnt. */
52 	int			  cnt;	/* When 0, time to call wakeFunc. */
53 	RF_Raid_t		 *raidPtr;
54 /*	int			(*wakeFunc) (struct buf *); */
55 	int			(*wakeFunc) (RF_DagNode_t *, int);
56 	void			 *wakeArg;
57 	RF_AccTraceEntry_t	 *tracerec;
58 	RF_Etimer_t		  startTime;
59 	caddr_t			  bufPtr;
60 	RF_ParityRecordType_t	  operation;
61 	RF_CommonLogData_t	 *next;
62 };
63 
64 struct RF_ParityLogData_s {
65 	RF_RegionId_t		 regionID;	/*
66 						 * This struct guaranteed to
67 						 * span a single region.
68 						 */
69 	int			 bufOffset;	/*
70 						 * Offset from common->bufPtr.
71 						 */
72 	RF_PhysDiskAddr_t	 diskAddress;
73 	RF_CommonLogData_t	*common;	/*
74 						 * Info shared by one or more
75 						 * parityLogData structs.
76 						 */
77 	RF_ParityLogData_t	*next;
78 	RF_ParityLogData_t	*prev;
79 };
80 
81 struct RF_ParityLogAppendQueue_s {
82 	RF_DECLARE_MUTEX(mutex);
83 };
84 
85 struct RF_ParityLogRecord_s {
86 	RF_PhysDiskAddr_t	 parityAddr;
87 	RF_ParityRecordType_t	 operation;
88 };
89 
90 struct RF_ParityLog_s {
91 	RF_RegionId_t		 regionID;
92 	int			 numRecords;
93 	int			 diskOffset;
94 	RF_ParityLogRecord_t	*records;
95 	caddr_t			 bufPtr;
96 	RF_ParityLog_t		*next;
97 };
98 
99 struct RF_ParityLogQueue_s {
100 	RF_DECLARE_MUTEX(mutex);
101 	RF_ParityLog_t	*parityLogs;
102 };
103 
104 struct RF_RegionBufferQueue_s {
105 	RF_DECLARE_MUTEX(mutex);
106 	RF_DECLARE_COND(cond);
107 	int	 bufferSize;
108 	int	 totalBuffers;		/* Size of array 'buffers'. */
109 	int	 availableBuffers;	/* Num available 'buffers'. */
110 	int	 emptyBuffersIndex;	/* Stick next freed buffer here. */
111 	int	 availBuffersIndex;	/* Grab next buffer from here. */
112 	caddr_t	*buffers;		/* Array buffers used to hold parity. */
113 };
114 #define	RF_PLOG_CREATED		(1<<0)	/* Thread is created. */
115 #define	RF_PLOG_RUNNING		(1<<1)	/* Thread is running. */
116 #define	RF_PLOG_TERMINATE	(1<<2)	/* Thread is terminated (should exit).*/
117 #define	RF_PLOG_SHUTDOWN	(1<<3)	/* Thread is aware and exiting/exited.*/
118 
119 struct RF_ParityLogDiskQueue_s {
120 	RF_DECLARE_MUTEX(mutex);	/* Protects all vars in this struct. */
121 	RF_DECLARE_COND(cond);
122 	int			 threadState;	/*
123 						 * Is thread running, should it
124 						 * shutdown ?  (see above)
125 						 */
126 	RF_ParityLog_t		*flushQueue;	/*
127 						 * List of parity logs to be
128 						 * flushed to log disk.
129 						 */
130 	RF_ParityLog_t		*reintQueue;	/*
131 						 * List of parity logs waiting
132 						 * to be reintegrated.
133 						 */
134 	RF_ParityLogData_t	*bufHead;	/*
135 						 * Head of FIFO list of log
136 						 * data, waiting on a buffer.
137 						 */
138 	RF_ParityLogData_t	*bufTail;	/*
139 						 * Tail of FIFO list of log
140 						 * data, waiting on a buffer.
141 						 */
142 	RF_ParityLogData_t	*reintHead;	/*
143 						 * Head of FIFO list of
144 						 * log data, waiting on
145 						 * reintegration.
146 						 */
147 	RF_ParityLogData_t	*reintTail;	/*
148 						 * Tail of FIFO list of
149 						 * log data, waiting on
150 						 * reintegration.
151 						 */
152 	RF_ParityLogData_t	*logBlockHead;	/*
153 						 * Queue of work, blocked
154 						 * until a log is available.
155 						 */
156 	RF_ParityLogData_t	*logBlockTail;
157 	RF_ParityLogData_t	*reintBlockHead;/*
158 						 * Queue of work, blocked
159 						 * until reintegration is
160 						 * complete.
161 						 */
162 	RF_ParityLogData_t	*reintBlockTail;
163 	RF_CommonLogData_t	*freeCommonList;/*
164 						 * List of unused common
165 						 * data structs.
166 						 */
167 	RF_ParityLogData_t	*freeDataList;	/*
168 						 * List of unused log
169 						 * data structs.
170 						 */
171 };
172 
173 struct RF_DiskMap_s {
174 	RF_PhysDiskAddr_t	parityAddr;
175 	RF_ParityRecordType_t	operation;
176 };
177 
178 struct RF_RegionInfo_s {
179 	RF_DECLARE_MUTEX(mutex);		/*
180 						 * Protects: diskCount, diskMap,
181 						 * loggingEnabled, coreLog.
182 						 */
183 	RF_DECLARE_MUTEX(reintMutex);		/* Protects: reintInProgress. */
184 	int		 reintInProgress;	/*
185 						 * Flag used to suspend flushing
186 						 * operations.
187 						 */
188 	RF_SectorCount_t capacity;		/*
189 						 * Capacity of this region
190 						 * in sectors.
191 						*/
192 	RF_SectorNum_t	 regionStartAddr;	/*
193 						 * Starting disk address for
194 						 * this region.
195 						 */
196 	RF_SectorNum_t	 parityStartAddr;	/*
197 						 * Starting disk address for
198 						 * this region.
199 						 */
200 	RF_SectorCount_t numSectorsParity;	/*
201 						 * Number of parity sectors
202 						 * protected by this region.
203 						 */
204 	RF_SectorCount_t diskCount;		/*
205 						 * Num of sectors written to
206 						 * this region's disk log.
207 						 */
208 	RF_DiskMap_t	*diskMap;		/*
209 						 * In-core map of what's in
210 						 * this region's disk log.
211 						 */
212 	int		 loggingEnabled;	/*
213 						 * Logging enable for this
214 						 * region.
215 						 */
216 	RF_ParityLog_t	*coreLog;		/*
217 						 * In-core log for this region.
218 						 */
219 };
220 
221 RF_ParityLogData_t *rf_CreateParityLogData(RF_ParityRecordType_t,
222 	RF_PhysDiskAddr_t *, caddr_t, RF_Raid_t *,
223 	int (*) (RF_DagNode_t *, int), void *,
224 	RF_AccTraceEntry_t *, RF_Etimer_t);
225 RF_ParityLogData_t *rf_SearchAndDequeueParityLogData(RF_Raid_t *, RF_RegionId_t,
226 	RF_ParityLogData_t **, RF_ParityLogData_t **, int);
227 void rf_ReleaseParityLogs(RF_Raid_t *, RF_ParityLog_t *);
228 int  rf_ParityLogAppend(RF_ParityLogData_t *, int, RF_ParityLog_t **, int);
229 void rf_EnableParityLogging(RF_Raid_t *);
230 
231 #endif	/* !_RF__RF_PARITYLOG_H_ */
232