[BACK]Return to rf_evenodd_dags.c CVS log [TXT][DIR] Up to [local] / sys / dev / raidframe

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