root/dev/raidframe/rf_psstatus.h

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

INCLUDED FROM


    1 /*      $OpenBSD: rf_psstatus.h,v 1.3 2002/12/16 07:01:04 tdeval Exp $  */
    2 /*      $NetBSD: rf_psstatus.h,v 1.3 1999/02/05 00:06:15 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  *
   33  * psstatus.h
   34  *
   35  * The reconstruction code maintains a bunch of status related to the parity
   36  * stripes that are currently under reconstruction. This header file defines
   37  * the status structures.
   38  *
   39  *****************************************************************************/
   40 
   41 #ifndef _RF__RF_PSSTATUS_H_
   42 #define _RF__RF_PSSTATUS_H_
   43 
   44 #include "rf_types.h"
   45 #include "rf_threadstuff.h"
   46 #include "rf_callback.h"
   47 
   48 #define RF_PS_MAX_BUFS                   10     /*
   49                                                  * Max number of bufs we'll
   50                                                  * accumulate before we do
   51                                                  * an XOR.
   52                                                  */
   53 
   54 #define RF_PSS_DEFAULT_TABLESIZE        200
   55 
   56 /*
   57  * Macros to acquire/release the mutex lock on a parity stripe status
   58  * descriptor. Note that we use just one lock for the whole hash chain.
   59  */
   60 /* Simple hash function. */
   61 #define RF_HASH_PSID(_raid_,_psid_)     ((_psid_) % ((_raid_)->pssTableSize))
   62 
   63 #define RF_LOCK_PSS_MUTEX(_raidPtr,_row,_psid)                          \
   64         RF_LOCK_MUTEX((_raidPtr)->reconControl[_row]                    \
   65             ->pssTable[RF_HASH_PSID(_raidPtr, _psid)].mutex)
   66 #define RF_UNLOCK_PSS_MUTEX(_raidPtr, _row, _psid)                      \
   67         RF_UNLOCK_MUTEX((_raidPtr)->reconControl[_row]                  \
   68             ->pssTable[RF_HASH_PSID(_raidPtr, _psid)].mutex)
   69 
   70 struct RF_ReconParityStripeStatus_s {
   71         RF_StripeNum_t           parityStripeID;/* The parity stripe ID. */
   72         RF_ReconUnitNum_t        which_ru;      /*
   73                                                  * Which reconstruction unit
   74                                                  * with the indicated parity
   75                                                  * stripe.
   76                                                  */
   77         RF_PSSFlags_t            flags;         /*
   78                                                  * Flags indicating various
   79                                                  * conditions.
   80                                                  */
   81         void                    *rbuf;          /*
   82                                                  * This is the accumulating
   83                                                  * xor sum.
   84                                                  */
   85         void                    *writeRbuf;     /*
   86                                                  * DEBUG ONLY:  A pointer to
   87                                                  * the rbuf after it has filled
   88                                                  * & been sent to disk.
   89                                                  */
   90         void                    *rbufsForXor[RF_PS_MAX_BUFS];
   91                                                 /*
   92                                                  * These are buffers still to
   93                                                  * be xored into the
   94                                                  * accumulating sum.
   95                                                  */
   96         int                      xorBufCount;   /*
   97                                                  * Num buffers waiting to be
   98                                                  * xored.
   99                                                  */
  100         int                      blockCount;    /*
  101                                                  * Count of # proc that have
  102                                                  * blocked recon on this parity
  103                                                  * stripe.
  104                                                  */
  105         char                    *issued;        /*
  106                                                  * issued[i]==1 <=> column i
  107                                                  * has already issued a read
  108                                                  * request for the indicated
  109                                                  * RU.
  110                                                  */
  111         RF_CallbackDesc_t       *procWaitList;  /*
  112                                                  * List of user procs waiting
  113                                                  * for recon to be done.
  114                                                  */
  115         RF_CallbackDesc_t       *blockWaitList; /*
  116                                                  * List of disks blocked
  117                                                  * waiting for user write to
  118                                                  * complete.
  119                                                  */
  120         RF_CallbackDesc_t       *bufWaitList;   /*
  121                                                  * List of disks blocked
  122                                                  * waiting to acquire a buffer
  123                                                  * for this RU.
  124                                                  */
  125         RF_ReconParityStripeStatus_t *next;
  126 };
  127 
  128 struct RF_PSStatusHeader_s {
  129         RF_DECLARE_MUTEX(mutex);                /* Mutex for this hash chain. */
  130         RF_ReconParityStripeStatus_t *chain;    /* The hash chain. */
  131 };
  132 
  133 /* Masks for the "flags" field above. */
  134 #define RF_PSS_NONE             0x00000000      /* No flags. */
  135 #define RF_PSS_UNDER_RECON      0x00000001      /*
  136                                                  * This parity stripe is
  137                                                  * currently under
  138                                                  * reconstruction.
  139                                                  */
  140 #define RF_PSS_FORCED_ON_WRITE  0x00000002      /*
  141                                                  * Indicates a recon was
  142                                                  * forced due to a user-write
  143                                                  * operation.
  144                                                  */
  145 #define RF_PSS_FORCED_ON_READ   0x00000004      /*
  146                                                  * Ditto for read, but not
  147                                                  * currently implemented.
  148                                                  */
  149 #define RF_PSS_RECON_BLOCKED    0x00000008      /*
  150                                                  * Reconstruction is currently
  151                                                  * blocked due to a pending
  152                                                  * user I/O.
  153                                                  */
  154 #define RF_PSS_CREATE           0x00000010      /*
  155                                                  * Tells LookupRUStatus to
  156                                                  * create the entry.
  157                                                  */
  158 #define RF_PSS_BUFFERWAIT       0x00000020      /*
  159                                                  * Someone is waiting for a
  160                                                  * buffer for this RU.
  161                                                  */
  162 
  163 int  rf_ConfigurePSStatus(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *);
  164 RF_PSStatusHeader_t *rf_MakeParityStripeStatusTable(RF_Raid_t *);
  165 void rf_FreeParityStripeStatusTable(RF_Raid_t *, RF_PSStatusHeader_t *);
  166 RF_ReconParityStripeStatus_t *rf_LookupRUStatus(RF_Raid_t *,
  167         RF_PSStatusHeader_t *, RF_StripeNum_t, RF_ReconUnitNum_t,
  168         RF_PSSFlags_t, int *);
  169 void rf_PSStatusDelete(RF_Raid_t *, RF_PSStatusHeader_t *,
  170         RF_ReconParityStripeStatus_t *);
  171 void rf_RemoveFromActiveReconTable(RF_Raid_t *, RF_RowCol_t,
  172         RF_StripeNum_t, RF_ReconUnitNum_t);
  173 RF_ReconParityStripeStatus_t *rf_AllocPSStatus(RF_Raid_t *);
  174 void rf_FreePSStatus(RF_Raid_t *, RF_ReconParityStripeStatus_t *);
  175 void rf_PrintPSStatusTable(RF_Raid_t *, RF_RowCol_t);
  176 
  177 #endif  /* !_RF__RF_PSSTATUS_H_ */

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