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

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