Annotation of sys/dev/raidframe/rf_reconstruct.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: rf_reconstruct.h,v 1.5 2002/12/16 07:01:05 tdeval Exp $ */
2: /* $NetBSD: rf_reconstruct.h,v 1.5 2000/05/28 00:48:30 oster Exp $ */
3:
4: /*
5: * Copyright (c) 1995 Carnegie-Mellon University.
6: * All rights reserved.
7: *
8: * Author: Mark Holland
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: * rf_reconstruct.h -- Header file for reconstruction code.
33: ***********************************************************/
34:
35: #ifndef _RF__RF_RECONSTRUCT_H_
36: #define _RF__RF_RECONSTRUCT_H_
37:
38: #include "rf_types.h"
39: #include <sys/time.h>
40: #include "rf_reconmap.h"
41: #include "rf_psstatus.h"
42:
43: /* Reconstruction configuration information. */
44: struct RF_ReconConfig_s {
45: unsigned numFloatingReconBufs;
46: /*
47: * Number of floating recon
48: * bufs to use.
49: */
50: RF_HeadSepLimit_t headSepLimit; /*
51: * How far apart the heads are
52: * allowed to become, in parity
53: * stripes.
54: */
55: };
56:
57: /* A reconstruction buffer. */
58: struct RF_ReconBuffer_s {
59: RF_Raid_t *raidPtr; /*
60: * (void *) to avoid recursive
61: * includes.
62: */
63: caddr_t buffer; /* Points to the data. */
64: RF_StripeNum_t parityStripeID;/*
65: * The parity stripe that this
66: * data relates to.
67: */
68: int which_ru; /*
69: * Which reconstruction unit
70: * within the PSS.
71: */
72: RF_SectorNum_t failedDiskSectorOffset;
73: /*
74: * The offset into the failed
75: * disk.
76: */
77: RF_RowCol_t row, col; /*
78: * Which disk this buffer
79: * belongs to or is targeted at.
80: */
81: RF_StripeCount_t count; /*
82: * Counts the # of SUs
83: * installed so far.
84: */
85: int priority; /*
86: * Used to force high priority
87: * recon.
88: */
89: RF_RbufType_t type; /* FORCED or FLOATING. */
90: char *arrived; /*
91: * [x] = 1/0 if SU from disk x
92: * has/hasn't arrived.
93: */
94: RF_ReconBuffer_t *next; /*
95: * Used for buffer management.
96: */
97: void *arg; /*
98: * Generic field for general
99: * use.
100: */
101: RF_RowCol_t spRow, spCol; /*
102: * Spare disk to which this buf
103: * should be written.
104: */
105: /* If dist sparing off, always identifies the replacement disk */
106: RF_SectorNum_t spOffset; /*
107: * Offset into the spare disk.
108: */
109: /* If dist sparing off, identical to failedDiskSectorOffset */
110: RF_ReconParityStripeStatus_t *pssPtr; /*
111: * Debug pss associated with
112: * issue-pending write.
113: */
114: };
115:
116: /*
117: * A reconstruction event descriptor. The event types currently are:
118: * RF_REVENT_READDONE -- A read operation has completed.
119: * RF_REVENT_WRITEDONE -- A write operation has completed.
120: * RF_REVENT_BUFREADY -- The buffer manager has produced a
121: * full buffer.
122: * RF_REVENT_BLOCKCLEAR -- A reconstruction blockage has been cleared.
123: * RF_REVENT_BUFCLEAR -- The buffer manager has released a process
124: * blocked on submission.
125: * RF_REVENT_SKIP -- We need to skip the current RU and go on
126: * to the next one, typ. b/c we found recon
127: * forced.
128: * RF_REVENT_FORCEDREADONE -- A forced-reconstructoin read operation has
129: * completed.
130: */
131: typedef enum RF_Revent_e {
132: RF_REVENT_READDONE,
133: RF_REVENT_WRITEDONE,
134: RF_REVENT_BUFREADY,
135: RF_REVENT_BLOCKCLEAR,
136: RF_REVENT_BUFCLEAR,
137: RF_REVENT_HEADSEPCLEAR,
138: RF_REVENT_SKIP,
139: RF_REVENT_FORCEDREADDONE
140: } RF_Revent_t;
141:
142: struct RF_ReconEvent_s {
143: RF_Revent_t type; /* What kind of event has occurred. */
144: RF_RowCol_t col; /*
145: * Row ID is implicit in the queue in
146: * which the event is placed.
147: */
148: void *arg; /* A generic argument. */
149: RF_ReconEvent_t *next;
150: };
151:
152: /*
153: * Reconstruction control information maintained per-disk.
154: * (for surviving disks)
155: */
156: struct RF_PerDiskReconCtrl_s {
157: RF_ReconCtrl_t *reconCtrl;
158: RF_RowCol_t row, col; /*
159: * To make this structure
160: * self-identifying.
161: */
162: RF_StripeNum_t curPSID; /*
163: * The next parity stripe ID
164: * to check on this disk.
165: */
166: RF_HeadSepLimit_t headSepCounter;/*
167: * Counter used to control
168: * maximum head separation.
169: */
170: RF_SectorNum_t diskOffset; /*
171: * The offset into the
172: * indicated disk
173: * of the current PU.
174: */
175: RF_ReconUnitNum_t ru_count; /*
176: * This counts off the recon
177: * units within each parity
178: * unit.
179: */
180: RF_ReconBuffer_t *rbuf; /*
181: * The recon buffer assigned
182: * to this disk.
183: */
184: };
185:
186: /* Main reconstruction control structure. */
187: struct RF_ReconCtrl_s {
188: RF_RaidReconDesc_t *reconDesc;
189: RF_RowCol_t fcol; /* Which column has failed. */
190: RF_PerDiskReconCtrl_t *perDiskInfo; /*
191: * Information maintained
192: * per-disk.
193: */
194: RF_ReconMap_t *reconMap; /*
195: * Map of what has/has not
196: * been reconstructed.
197: */
198: RF_RowCol_t spareRow; /*
199: * Which of the spare disks
200: * we're using.
201: */
202: RF_RowCol_t spareCol;
203: RF_StripeNum_t lastPSID; /*
204: * The ID of the last
205: * parity stripe we want
206: * reconstructed.
207: */
208: int percentComplete;
209: /*
210: * Percentage completion of
211: * reconstruction.
212: */
213: int numRUsComplete;/*
214: * Number of Reconstruction
215: * Units done.
216: */
217: int numRUsTotal; /*
218: * Total number of
219: * Reconstruction Units.
220: */
221:
222: /* Reconstruction event queue. */
223: RF_ReconEvent_t *eventQueue; /*
224: * Queue of pending
225: * reconstruction events.
226: */
227: RF_DECLARE_MUTEX (eq_mutex); /*
228: * Mutex for locking event
229: * queue.
230: */
231: RF_DECLARE_COND (eq_cond); /*
232: * Condition variable for
233: * signalling recon events.
234: */
235: int eq_count; /* Debug only. */
236:
237: /* Reconstruction buffer management. */
238: RF_DECLARE_MUTEX (rb_mutex); /*
239: * Mutex for messing around
240: * with recon buffers.
241: */
242: RF_ReconBuffer_t *floatingRbufs; /*
243: * Available floating
244: * reconstruction buffers.
245: */
246: RF_ReconBuffer_t *committedRbufs;/*
247: * Recon buffers that have
248: * been committed to some
249: * waiting disk.
250: */
251: RF_ReconBuffer_t *fullBufferList;/*
252: * Full buffers waiting to be
253: * written out.
254: */
255: RF_ReconBuffer_t *priorityList; /*
256: * Full buffers that have been
257: * elevated to higher priority.
258: */
259: RF_CallbackDesc_t *bufferWaitList;/*
260: * Disks that are currently
261: * blocked waiting for buffers.
262: */
263:
264: /* Parity stripe status table. */
265: RF_PSStatusHeader_t *pssTable; /*
266: * Stores the reconstruction
267: * status of active parity
268: * stripes.
269: */
270:
271: /* Maximum-head separation control. */
272: RF_HeadSepLimit_t minHeadSepCounter;
273: /*
274: * The minimum hs counter over
275: * all disks.
276: */
277: RF_CallbackDesc_t *headSepCBList; /*
278: * List of callbacks to be
279: * done as minPSID advances.
280: */
281:
282: /* Performance monitoring. */
283: struct timeval starttime; /* Recon start time. */
284:
285: void (*continueFunc) (void *);
286: /*
287: * Function to call when io
288: * returns.
289: */
290: void *continueArg; /* Argument for Func. */
291: };
292:
293: /* The default priority for reconstruction accesses. */
294: #define RF_IO_RECON_PRIORITY RF_IO_LOW_PRIORITY
295:
296: int rf_ConfigureReconstruction(RF_ShutdownList_t **);
297: int rf_ReconstructFailedDisk(RF_Raid_t *, RF_RowCol_t, RF_RowCol_t);
298: int rf_ReconstructFailedDiskBasic(RF_Raid_t *, RF_RowCol_t, RF_RowCol_t);
299: int rf_ReconstructInPlace(RF_Raid_t *, RF_RowCol_t, RF_RowCol_t);
300: int rf_ContinueReconstructFailedDisk(RF_RaidReconDesc_t *);
301: int rf_ForceOrBlockRecon(RF_Raid_t *, RF_AccessStripeMap_t *,
302: void (*) (RF_Raid_t *, void *), void *);
303: int rf_UnblockRecon(RF_Raid_t *, RF_AccessStripeMap_t *);
304: int rf_RegisterReconDoneProc(RF_Raid_t *, void (*) (RF_Raid_t *, void *),
305: void *, RF_ReconDoneProc_t **);
306:
307: #endif /* !_RF__RF_RECONSTRUCT_H_ */
CVSweb