root/dev/raidframe/rf_layout.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. RF_LayoutSW_t

    1 /*      $OpenBSD: rf_layout.h,v 1.5 2002/12/16 07:01:04 tdeval Exp $    */
    2 /*      $NetBSD: rf_layout.h,v 1.4 2000/05/23 00:44:38 thorpej 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_layout.h -- Header file defining layout data structures.
   33  */
   34 
   35 #ifndef _RF__RF_LAYOUT_H_
   36 #define _RF__RF_LAYOUT_H_
   37 
   38 #include "rf_types.h"
   39 #include "rf_archs.h"
   40 #include "rf_alloclist.h"
   41 
   42 #ifndef _KERNEL
   43 #include <stdio.h>
   44 #endif
   45 
   46 /*****************************************************************************
   47  *
   48  * This structure identifies all layout-specific operations and parameters.
   49  *
   50  *****************************************************************************/
   51 
   52 typedef struct RF_LayoutSW_s {
   53         RF_ParityConfig_t         parityConfig;
   54         const char               *configName;
   55 
   56 #ifndef _KERNEL
   57         /* Layout-specific parsing. */
   58         int                     (*MakeLayoutSpecific)
   59                                 (FILE *, RF_Config_t *, void *);
   60         void                     *makeLayoutSpecificArg;
   61 #endif  /* !_KERNEL */
   62 
   63 #if     RF_UTILITY == 0
   64         /* Initialization routine. */
   65         int                     (*Configure)
   66                                 (RF_ShutdownList_t **, RF_Raid_t *,
   67                                     RF_Config_t *);
   68 
   69         /* Routine to map RAID sector address -> physical (row, col, offset). */
   70         void                    (*MapSector)
   71                                 (RF_Raid_t *, RF_RaidAddr_t, RF_RowCol_t *,
   72                                     RF_RowCol_t *, RF_SectorNum_t *, int);
   73 
   74         /*
   75          * Routine to map RAID sector address -> physical (r,c,o) of parity
   76          * unit.
   77          */
   78         void                    (*MapParity)
   79                                 (RF_Raid_t *, RF_RaidAddr_t, RF_RowCol_t *,
   80                                     RF_RowCol_t *, RF_SectorNum_t *, int);
   81 
   82         /* Routine to map RAID sector address -> physical (r,c,o) of Q unit. */
   83         void                    (*MapQ)
   84                                 (RF_Raid_t *, RF_RaidAddr_t, RF_RowCol_t *,
   85                                     RF_RowCol_t *, RF_SectorNum_t *, int);
   86 
   87         /* Routine to identify the disks comprising a stripe. */
   88         void                    (*IdentifyStripe)
   89                                 (RF_Raid_t *, RF_RaidAddr_t, RF_RowCol_t **,
   90                                     RF_RowCol_t *);
   91 
   92         /* Routine to select a dag. */
   93         void                    (*SelectionFunc)
   94                                 (RF_Raid_t *, RF_IoType_t,
   95                                     RF_AccessStripeMap_t *, RF_VoidFuncPtr *);
   96 #if 0
   97         void                    (**createFunc)
   98                                 (RF_Raid_t *, RF_AccessStripeMap_t *,
   99                                     RF_DagHeader_t *, void *,
  100                                     RF_RaidAccessFlags_t, RF_AllocListElem_t *);
  101 #endif
  102 
  103         /*
  104          * Map a stripe ID to a parity stripe ID. This is typically the
  105          * identity mapping.
  106          */
  107         void                    (*MapSIDToPSID)
  108                                 (RF_RaidLayout_t *, RF_StripeNum_t,
  109                                     RF_StripeNum_t *, RF_ReconUnitNum_t *);
  110 
  111         /* Get default head separation limit (may be NULL). */
  112         RF_HeadSepLimit_t       (*GetDefaultHeadSepLimit) (RF_Raid_t *);
  113 
  114         /* Get default num recon buffers (may be NULL). */
  115         int                     (*GetDefaultNumFloatingReconBuffers)
  116                                 (RF_Raid_t *);
  117 
  118         /* Get number of spare recon units (may be NULL). */
  119         RF_ReconUnitCount_t     (*GetNumSpareRUs) (RF_Raid_t *);
  120 
  121         /* Spare table installation (may be NULL). */
  122         int                     (*InstallSpareTable)
  123                                 (RF_Raid_t *, RF_RowCol_t, RF_RowCol_t);
  124 
  125         /* Recon buffer submission function. */
  126         int                     (*SubmitReconBuffer)
  127                                 (RF_ReconBuffer_t *, int, int);
  128 
  129         /*
  130          * Verify that parity information for a stripe is correct.
  131          * See rf_parityscan.h for return vals.
  132          */
  133         int                     (*VerifyParity)
  134                                 (RF_Raid_t *, RF_RaidAddr_t,
  135                                     RF_PhysDiskAddr_t *, int,
  136                                     RF_RaidAccessFlags_t);
  137 
  138         /* Number of faults tolerated by this mapping. */
  139         int                       faultsTolerated;
  140 
  141         /*
  142          * States to step through in an access. Must end with "LastState". The
  143          * default is DefaultStates in rf_layout.c .
  144          */
  145         RF_AccessState_t         *states;
  146 
  147         RF_AccessStripeMapFlags_t flags;
  148 #endif  /* RF_UTILITY == 0 */
  149 }       RF_LayoutSW_t;
  150 
  151 /* Enables remapping to spare location under dist sparing. */
  152 #define RF_REMAP                        1
  153 #define RF_DONT_REMAP                   0
  154 
  155 /*
  156  * Flags values for RF_AccessStripeMapFlags_t.
  157  */
  158 #define RF_NO_STRIPE_LOCKS         0x0001       /* Suppress stripe locks. */
  159 #define RF_DISTRIBUTE_SPARE        0x0002       /*
  160                                                  * Distribute spare space in
  161                                                  * archs that support it.
  162                                                  */
  163 #define RF_BD_DECLUSTERED          0x0004       /*
  164                                                  * Declustering uses block
  165                                                  * designs.
  166                                                  */
  167 
  168 /*************************************************************************
  169  *
  170  * This structure forms the layout component of the main Raid
  171  * structure. It describes everything needed to define and perform
  172  * the mapping of logical RAID addresses <-> physical disk addresses.
  173  *
  174  *************************************************************************/
  175 struct RF_RaidLayout_s {
  176         /* Configuration parameters. */
  177         RF_SectorCount_t         sectorsPerStripeUnit;
  178                                                 /*
  179                                                  * Number of sectors in one
  180                                                  * stripe unit.
  181                                                  */
  182         RF_StripeCount_t         SUsPerPU;      /*
  183                                                  * Stripe units per parity unit.
  184                                                  */
  185         RF_StripeCount_t         SUsPerRU;      /*
  186                                                  * Stripe units per
  187                                                  * reconstruction unit.
  188                                                  */
  189 
  190         /*
  191          * Redundant-but-useful info computed from the above, used in all
  192          * layouts.
  193          */
  194         RF_StripeCount_t         numStripe;     /*
  195                                                  * Total number of stripes
  196                                                  * in the array.
  197                                                  */
  198         RF_SectorCount_t         dataSectorsPerStripe;
  199         RF_StripeCount_t         dataStripeUnitsPerDisk;
  200         u_int                    bytesPerStripeUnit;
  201         u_int                    dataBytesPerStripe;
  202         RF_StripeCount_t         numDataCol;    /*
  203                                                  * Number of SUs of data per
  204                                                  * stripe.
  205                                                  * (name here is a la RAID4)
  206                                                  */
  207         RF_StripeCount_t         numParityCol;  /*
  208                                                  * Number of SUs of parity
  209                                                  * per stripe.
  210                                                  * Always 1 for now.
  211                                                  */
  212         RF_StripeCount_t         numParityLogCol;
  213                                                 /*
  214                                                  * Number of SUs of parity log
  215                                                  * per stripe.
  216                                                  * Always 1 for now.
  217                                                  */
  218         RF_StripeCount_t         stripeUnitsPerDisk;
  219 
  220         RF_LayoutSW_t           *map;           /*
  221                                                  * Pointer to struct holding
  222                                                  * mapping fns and information.
  223                                                  */
  224         void                    *layoutSpecificInfo;
  225                                                 /* Pointer to a struct holding
  226                                                  * layout-specific params.
  227                                                  */
  228 };
  229 
  230 /*****************************************************************************
  231  *
  232  * The mapping code returns a pointer to a list of AccessStripeMap
  233  * structures, which describes all the mapping information about an access.
  234  * The list contains one AccessStripeMap structure per stripe touched by
  235  * the access. Each element in the list contains a stripe identifier and
  236  * a pointer to a list of PhysDiskAddr structuress. Each element in this
  237  * latter list describes the physical location of a stripe unit accessed
  238  * within the corresponding stripe.
  239  *
  240  *****************************************************************************/
  241 
  242 #define RF_PDA_TYPE_DATA                0
  243 #define RF_PDA_TYPE_PARITY              1
  244 #define RF_PDA_TYPE_Q                   2
  245 
  246 struct RF_PhysDiskAddr_s {
  247         RF_RowCol_t              row, col;      /* Disk identifier. */
  248         RF_SectorNum_t           startSector;   /*
  249                                                  * Sector offset into the disk.
  250                                                  */
  251         RF_SectorCount_t         numSector;     /*
  252                                                  * Number of sectors accessed.
  253                                                  */
  254         int                      type;          /*
  255                                                  * Used by higher levels:
  256                                                  * currently data, parity,
  257                                                  * or q.
  258                                                  */
  259         caddr_t                  bufPtr;        /*
  260                                                  * Pointer to buffer
  261                                                  * supplying/receiving data.
  262                                                  */
  263         RF_RaidAddr_t            raidAddress;   /*
  264                                                  * Raid address corresponding
  265                                                  * to this physical disk
  266                                                  * address.
  267                                                  */
  268         RF_PhysDiskAddr_t       *next;
  269 };
  270 #define RF_MAX_FAILED_PDA               RF_MAXCOL
  271 
  272 struct RF_AccessStripeMap_s {
  273         RF_StripeNum_t           stripeID;      /* The stripe index. */
  274         RF_RaidAddr_t            raidAddress;   /*
  275                                                  * The starting raid address
  276                                                  * within this stripe.
  277                                                  */
  278         RF_RaidAddr_t            endRaidAddress;/*
  279                                                  * Raid address one sector past
  280                                                  * the end of the access.
  281                                                  */
  282         RF_SectorCount_t         totalSectorsAccessed;
  283                                                 /*
  284                                                  * Total num sectors
  285                                                  * identified in physInfo list.
  286                                                  */
  287         RF_StripeCount_t         numStripeUnitsAccessed;
  288                                                 /*
  289                                                  * Total num elements in
  290                                                  * physInfo list.
  291                                                  */
  292         int                      numDataFailed; /*
  293                                                  * Number of failed data disks
  294                                                  * accessed.
  295                                                  */
  296         int                      numParityFailed;
  297                                                 /*
  298                                                  * Number of failed parity
  299                                                  * disks accessed (0 or 1).
  300                                                  */
  301         int                      numQFailed;    /*
  302                                                  * Number of failed Q units
  303                                                  * accessed (0 or 1).
  304                                                  */
  305         RF_AccessStripeMapFlags_t flags;        /* Various flags. */
  306 #if 0
  307         RF_PhysDiskAddr_t       *failedPDA;     /*
  308                                                  * Points to the PDA that
  309                                                  * has failed.
  310                                                  */
  311         RF_PhysDiskAddr_t       *failedPDAtwo;  /*
  312                                                  * Points to the second PDA
  313                                                  * that has failed, if any.
  314                                                  */
  315 #else
  316         int                      numFailedPDAs; /*
  317                                                  * Number of failed phys addrs.
  318                                                  */
  319         RF_PhysDiskAddr_t       *failedPDAs[RF_MAX_FAILED_PDA];
  320                                                 /*
  321                                                  * Array of failed phys addrs.
  322                                                  */
  323 #endif
  324         RF_PhysDiskAddr_t       *physInfo;      /*
  325                                                  * A list of PhysDiskAddr
  326                                                  * structs.
  327                                                  */
  328         RF_PhysDiskAddr_t       *parityInfo;    /*
  329                                                  * List of physical addrs for
  330                                                  * the parity (P of P + Q).
  331                                                  */
  332         RF_PhysDiskAddr_t       *qInfo;         /*
  333                                                  * List of physical addrs for
  334                                                  * the Q of P + Q.
  335                                                  */
  336         RF_LockReqDesc_t         lockReqDesc;   /* Used for stripe locking. */
  337         RF_RowCol_t              origRow;       /*
  338                                                  * The original row:  we may
  339                                                  * redirect the acc to a
  340                                                  * different row.
  341                                                  */
  342         RF_AccessStripeMap_t    *next;
  343 };
  344 /* Flag values. */
  345 #define RF_ASM_REDIR_LARGE_WRITE        0x00000001      /*
  346                                                          * Allows large-write
  347                                                          * creation code to
  348                                                          * redirect failed
  349                                                          * accs.
  350                                                          */
  351 #define RF_ASM_BAILOUT_DAG_USED         0x00000002      /*
  352                                                          * Allows us to detect
  353                                                          * recursive calls to
  354                                                          * the bailout write
  355                                                          * dag.
  356                                                          */
  357 #define RF_ASM_FLAGS_LOCK_TRIED         0x00000004      /*
  358                                                          * We've acquired the
  359                                                          * lock on the first
  360                                                          * parity range in
  361                                                          * this parity stripe.
  362                                                          */
  363 #define RF_ASM_FLAGS_LOCK_TRIED2        0x00000008      /*
  364                                                          * we've acquired the
  365                                                          * lock on the 2nd
  366                                                          * parity range in this
  367                                                          * parity stripe.
  368                                                          */
  369 #define RF_ASM_FLAGS_FORCE_TRIED        0x00000010      /*
  370                                                          * We've done the
  371                                                          * force-recon call on
  372                                                          * this parity stripe.
  373                                                          */
  374 #define RF_ASM_FLAGS_RECON_BLOCKED      0x00000020      /*
  375                                                          * We blocked recon
  376                                                          * => we must unblock
  377                                                          * it later.
  378                                                          */
  379 
  380 struct RF_AccessStripeMapHeader_s {
  381         RF_StripeCount_t         numStripes;    /*
  382                                                  * Total number of stripes
  383                                                  * touched by this access.
  384                                                  */
  385         RF_AccessStripeMap_t    *stripeMap;     /*
  386                                                  * Pointer to the actual map.
  387                                                  * Also used for making lists.
  388                                                  */
  389         RF_AccessStripeMapHeader_t *next;
  390 };
  391 
  392 
  393 /*****************************************************************************
  394  *
  395  * Various routines mapping addresses in the RAID address space. These work
  396  * across all layouts. DON'T PUT ANY LAYOUT-SPECIFIC CODE HERE.
  397  *
  398  *****************************************************************************/
  399 
  400 /* Return the identifier of the stripe containing the given address. */
  401 #define rf_RaidAddressToStripeID(_layoutPtr_,_addr_)                    \
  402         (((_addr_) / (_layoutPtr_)->sectorsPerStripeUnit) /             \
  403          (_layoutPtr_)->numDataCol)
  404 
  405 /* Return the raid address of the start of the indicates stripe ID. */
  406 #define rf_StripeIDToRaidAddress(_layoutPtr_,_sid_)                     \
  407         (((_sid_) * (_layoutPtr_)->sectorsPerStripeUnit) *              \
  408          (_layoutPtr_)->numDataCol)
  409 
  410 /* Return the identifier of the stripe containing the given stripe unit ID. */
  411 #define rf_StripeUnitIDToStripeID(_layoutPtr_,_addr_)                   \
  412         ((_addr_) / (_layoutPtr_)->numDataCol)
  413 
  414 /* Return the identifier of the stripe unit containing the given address. */
  415 #define rf_RaidAddressToStripeUnitID(_layoutPtr_,_addr_)                \
  416         (((_addr_) / (_layoutPtr_)->sectorsPerStripeUnit))
  417 
  418 /* Return the RAID address of next stripe boundary beyond the given address. */
  419 #define rf_RaidAddressOfNextStripeBoundary(_layoutPtr_,_addr_)          \
  420         ((((_addr_) / (_layoutPtr_)->dataSectorsPerStripe) + 1) *       \
  421          (_layoutPtr_)->dataSectorsPerStripe)
  422 
  423 /*
  424  * Return the RAID address of the start of the stripe containing the
  425  * given address.
  426  */
  427 #define rf_RaidAddressOfPrevStripeBoundary(_layoutPtr_,_addr_)          \
  428         ((((_addr_) / (_layoutPtr_)->dataSectorsPerStripe) + 0) *       \
  429          (_layoutPtr_)->dataSectorsPerStripe)
  430 
  431 /*
  432  * Return the RAID address of next stripe unit boundary beyond the
  433  * given address.
  434  */
  435 #define rf_RaidAddressOfNextStripeUnitBoundary(_layoutPtr_,_addr_)      \
  436         ((((_addr_) / (_layoutPtr_)->sectorsPerStripeUnit) + 1L) *      \
  437          (_layoutPtr_)->sectorsPerStripeUnit)
  438 
  439 /*
  440  * Return the RAID address of the start of the stripe unit containing
  441  * RAID address _addr_.
  442  */
  443 #define rf_RaidAddressOfPrevStripeUnitBoundary(_layoutPtr_,_addr_)      \
  444         ((((_addr_) / (_layoutPtr_)->sectorsPerStripeUnit) + 0) *       \
  445          (_layoutPtr_)->sectorsPerStripeUnit)
  446 
  447 /* Returns the offset into the stripe. Used by RaidAddressStripeAligned. */
  448 #define rf_RaidAddressStripeOffset(_layoutPtr_,_addr_)                  \
  449         ((_addr_) % (_layoutPtr_)->dataSectorsPerStripe)
  450 
  451 /* Returns the offset into the stripe unit. */
  452 #define rf_StripeUnitOffset(_layoutPtr_,_addr_)                         \
  453         ((_addr_) % (_layoutPtr_)->sectorsPerStripeUnit)
  454 
  455 /* Returns nonzero if the given RAID address is stripe-aligned. */
  456 #define rf_RaidAddressStripeAligned(__layoutPtr__,__addr__)             \
  457         (rf_RaidAddressStripeOffset(__layoutPtr__, __addr__) == 0)
  458 
  459 /* Returns nonzero if the given address is stripe-unit aligned. */
  460 #define rf_StripeUnitAligned(__layoutPtr__,__addr__)                    \
  461         (rf_StripeUnitOffset(__layoutPtr__, __addr__) == 0)
  462 
  463 /*
  464  * Convert an address expressed in RAID blocks to/from an addr expressed
  465  * in bytes.
  466  */
  467 #define rf_RaidAddressToByte(_raidPtr_,_addr_)                          \
  468         ((_addr_) << (_raidPtr_)->logBytesPerSector)
  469 
  470 #define rf_ByteToRaidAddress(_raidPtr_,_addr_)                          \
  471         ((_addr_) >> (_raidPtr_)->logBytesPerSector)
  472 
  473 /*
  474  * Convert a raid address to/from a parity stripe ID. Conversion to raid
  475  * address is easy, since we're asking for the address of the first sector
  476  * in the parity stripe. Conversion to a parity stripe ID is more complex,
  477  * since stripes are not contiguously allocated in parity stripes.
  478  */
  479 #define rf_RaidAddressToParityStripeID(_layoutPtr_,_addr_,_ru_num_)     \
  480         rf_MapStripeIDToParityStripeID((_layoutPtr_),                   \
  481             rf_RaidAddressToStripeID((_layoutPtr_), (_addr_)), (_ru_num_))
  482 
  483 #define rf_ParityStripeIDToRaidAddress(_layoutPtr_,_psid_)              \
  484         ((_psid_) * (_layoutPtr_)->SUsPerPU *                           \
  485          (_layoutPtr_)->numDataCol * (_layoutPtr_)->sectorsPerStripeUnit)
  486 
  487 RF_LayoutSW_t *rf_GetLayout(RF_ParityConfig_t);
  488 int  rf_ConfigureLayout(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *);
  489 RF_StripeNum_t rf_MapStripeIDToParityStripeID(RF_RaidLayout_t *,
  490          RF_StripeNum_t, RF_ReconUnitNum_t *);
  491 
  492 #endif  /* !_RF__RF_LAYOUT_H_ */

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