root/dev/raidframe/rf_reconstruct.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. RF_REVENT_READDONE
  2. RF_REVENT_WRITEDONE
  3. RF_REVENT_BUFREADY
  4. RF_REVENT_BLOCKCLEAR
  5. RF_REVENT_BUFCLEAR
  6. RF_REVENT_HEADSEPCLEAR
  7. RF_REVENT_SKIP
  8. RF_REVENT_FORCEDREADDONE
  9. RF_Revent_t

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

/* [<][>][^][v][top][bottom][index][help] */