Annotation of sys/dev/raidframe/rf_evenodd_dags.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: rf_evenodd_dags.c,v 1.3 2002/12/16 07:01:04 tdeval Exp $ */
2: /* $NetBSD: rf_evenodd_dags.c,v 1.2 1999/02/05 00:06:11 oster Exp $ */
3:
4: /*
5: * rf_evenodd_dags.c
6: */
7: /*
8: * Copyright (c) 1996 Carnegie-Mellon University.
9: * All rights reserved.
10: *
11: * Author: Chang-Ming Wu
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: #include "rf_archs.h"
35:
36: #if RF_INCLUDE_EVENODD > 0
37:
38: #include "rf_types.h"
39: #include "rf_raid.h"
40: #include "rf_dag.h"
41: #include "rf_dagfuncs.h"
42: #include "rf_dagutils.h"
43: #include "rf_etimer.h"
44: #include "rf_acctrace.h"
45: #include "rf_general.h"
46: #include "rf_evenodd_dags.h"
47: #include "rf_evenodd.h"
48: #include "rf_evenodd_dagfuncs.h"
49: #include "rf_pq.h"
50: #include "rf_dagdegrd.h"
51: #include "rf_dagdegwr.h"
52: #include "rf_dagffwr.h"
53:
54:
55: /*
56: * Lost one data.
57: * Use P to reconstruct missing data.
58: */
59: RF_CREATE_DAG_FUNC_DECL(rf_EO_100_CreateReadDAG)
60: {
61: rf_CreateDegradedReadDAG(raidPtr, asmap, dag_h, bp, flags, allocList,
62: &rf_eoPRecoveryFuncs);
63: }
64:
65: /*
66: * Lost data + E.
67: * Use P to reconstruct missing data.
68: */
69: RF_CREATE_DAG_FUNC_DECL(rf_EO_101_CreateReadDAG)
70: {
71: rf_CreateDegradedReadDAG(raidPtr, asmap, dag_h, bp, flags, allocList,
72: &rf_eoPRecoveryFuncs);
73: }
74:
75: /*
76: * Lost data + P.
77: * Make E look like P, and use Eor for Xor, and we can
78: * use degraded read DAG.
79: */
80: RF_CREATE_DAG_FUNC_DECL(rf_EO_110_CreateReadDAG)
81: {
82: RF_PhysDiskAddr_t *temp;
83: /* Swap P and E pointers to fake out the DegradedReadDAG code. */
84: temp = asmap->parityInfo;
85: asmap->parityInfo = asmap->qInfo;
86: asmap->qInfo = temp;
87: rf_CreateDegradedReadDAG(raidPtr, asmap, dag_h, bp, flags, allocList,
88: &rf_eoERecoveryFuncs);
89: }
90:
91: /*
92: * Lost two data.
93: */
94: RF_CREATE_DAG_FUNC_DECL(rf_EOCreateDoubleDegradedReadDAG)
95: {
96: rf_EO_DoubleDegRead(raidPtr, asmap, dag_h, bp, flags, allocList);
97: }
98:
99: /*
100: * Lost two data.
101: */
102: RF_CREATE_DAG_FUNC_DECL(rf_EO_200_CreateReadDAG)
103: {
104: rf_EOCreateDoubleDegradedReadDAG(raidPtr, asmap, dag_h, bp, flags,
105: allocList);
106: }
107:
108: RF_CREATE_DAG_FUNC_DECL(rf_EO_100_CreateWriteDAG)
109: {
110: if (asmap->numStripeUnitsAccessed != 1 &&
111: asmap->failedPDAs[0]->numSector !=
112: raidPtr->Layout.sectorsPerStripeUnit)
113: RF_PANIC();
114: rf_CommonCreateSimpleDegradedWriteDAG(raidPtr, asmap, dag_h, bp,
115: flags, allocList, 2,
116: (int (*) (RF_DagNode_t *)) rf_Degraded_100_EOFunc, RF_TRUE);
117: }
118:
119: /*
120: * E is dead. Small write.
121: */
122: RF_CREATE_DAG_FUNC_DECL(rf_EO_001_CreateSmallWriteDAG)
123: {
124: rf_CommonCreateSmallWriteDAG(raidPtr, asmap, dag_h, bp, flags,
125: allocList, &rf_EOSmallWritePFuncs, NULL);
126: }
127:
128: /*
129: * E is dead. Large write.
130: */
131: RF_CREATE_DAG_FUNC_DECL(rf_EO_001_CreateLargeWriteDAG)
132: {
133: rf_CommonCreateLargeWriteDAG(raidPtr, asmap, dag_h, bp, flags,
134: allocList, 1, rf_RegularPFunc, RF_TRUE);
135: }
136:
137: /*
138: * P is dead. Small write.
139: * Swap E + P, use single-degraded stuff.
140: */
141: RF_CREATE_DAG_FUNC_DECL(rf_EO_010_CreateSmallWriteDAG)
142: {
143: RF_PhysDiskAddr_t *temp;
144: /* Swap P and E pointers to fake out the DegradedReadDAG code. */
145: temp = asmap->parityInfo;
146: asmap->parityInfo = asmap->qInfo;
147: asmap->qInfo = temp;
148: rf_CommonCreateSmallWriteDAG(raidPtr, asmap, dag_h, bp, flags,
149: allocList, &rf_EOSmallWriteEFuncs, NULL);
150: }
151:
152: /*
153: * P is dead. Large write.
154: * Swap E + P, use single-degraded stuff.
155: */
156: RF_CREATE_DAG_FUNC_DECL(rf_EO_010_CreateLargeWriteDAG)
157: {
158: RF_PhysDiskAddr_t *temp;
159: /* Swap P and E pointers to fake out the code. */
160: temp = asmap->parityInfo;
161: asmap->parityInfo = asmap->qInfo;
162: asmap->qInfo = temp;
163: rf_CommonCreateLargeWriteDAG(raidPtr, asmap, dag_h, bp, flags,
164: allocList, 1, rf_RegularEFunc, RF_FALSE);
165: }
166:
167: RF_CREATE_DAG_FUNC_DECL(rf_EO_011_CreateWriteDAG)
168: {
169: rf_CreateNonRedundantWriteDAG(raidPtr, asmap, dag_h, bp, flags,
170: allocList, RF_IO_TYPE_WRITE);
171: }
172:
173: RF_CREATE_DAG_FUNC_DECL(rf_EO_110_CreateWriteDAG)
174: {
175: RF_PhysDiskAddr_t *temp;
176:
177: if (asmap->numStripeUnitsAccessed != 1 &&
178: asmap->failedPDAs[0]->numSector !=
179: raidPtr->Layout.sectorsPerStripeUnit) {
180: RF_PANIC();
181: }
182: /* Swap P and E to fake out parity code. */
183: temp = asmap->parityInfo;
184: asmap->parityInfo = asmap->qInfo;
185: asmap->qInfo = temp;
186: rf_CommonCreateSimpleDegradedWriteDAG(raidPtr, asmap, dag_h, bp,
187: flags, allocList, 1,
188: (int (*) (RF_DagNode_t *)) rf_EO_DegradedWriteEFunc, RF_FALSE);
189: /* Is the regular E func the right one to call ? */
190: }
191:
192: RF_CREATE_DAG_FUNC_DECL(rf_EO_101_CreateWriteDAG)
193: {
194: if (asmap->numStripeUnitsAccessed != 1 &&
195: asmap->failedPDAs[0]->numSector !=
196: raidPtr->Layout.sectorsPerStripeUnit)
197: RF_PANIC();
198: rf_CommonCreateSimpleDegradedWriteDAG(raidPtr, asmap, dag_h, bp,
199: flags, allocList, 1, rf_RecoveryXorFunc, RF_TRUE);
200: }
201:
202: RF_CREATE_DAG_FUNC_DECL(rf_EO_DoubleDegRead)
203: {
204: rf_DoubleDegRead(raidPtr, asmap, dag_h, bp, flags, allocList,
205: "Re", "EvenOddRecovery", rf_EvenOddDoubleRecoveryFunc);
206: }
207:
208: RF_CREATE_DAG_FUNC_DECL(rf_EOCreateSmallWriteDAG)
209: {
210: rf_CommonCreateSmallWriteDAG(raidPtr, asmap, dag_h, bp, flags,
211: allocList, &rf_pFuncs, &rf_EOSmallWriteEFuncs);
212: }
213:
214: RF_CREATE_DAG_FUNC_DECL(rf_EOCreateLargeWriteDAG)
215: {
216: rf_CommonCreateLargeWriteDAG(raidPtr, asmap, dag_h, bp, flags,
217: allocList, 2, rf_RegularPEFunc, RF_FALSE);
218: }
219:
220: RF_CREATE_DAG_FUNC_DECL(rf_EO_200_CreateWriteDAG)
221: {
222: rf_DoubleDegSmallWrite(raidPtr, asmap, dag_h, bp, flags, allocList,
223: "Re", "We", "EOWrDDRecovery", rf_EOWriteDoubleRecoveryFunc);
224: }
225:
226: #endif /* RF_INCLUDE_EVENODD > 0 */
CVSweb