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

Annotation of sys/dev/raidframe/rf_layout.h, Revision 1.1.1.1

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

CVSweb