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_ */