Home | History | Annotate | Line # | Download | only in raidframe
rf_layout.c revision 1.2
      1  1.2  oster /*	$NetBSD: rf_layout.c,v 1.2 1999/01/26 02:33:58 oster Exp $	*/
      2  1.1  oster /*
      3  1.1  oster  * Copyright (c) 1995 Carnegie-Mellon University.
      4  1.1  oster  * All rights reserved.
      5  1.1  oster  *
      6  1.1  oster  * Author: Mark Holland
      7  1.1  oster  *
      8  1.1  oster  * Permission to use, copy, modify and distribute this software and
      9  1.1  oster  * its documentation is hereby granted, provided that both the copyright
     10  1.1  oster  * notice and this permission notice appear in all copies of the
     11  1.1  oster  * software, derivative works or modified versions, and any portions
     12  1.1  oster  * thereof, and that both notices appear in supporting documentation.
     13  1.1  oster  *
     14  1.1  oster  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
     15  1.1  oster  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
     16  1.1  oster  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
     17  1.1  oster  *
     18  1.1  oster  * Carnegie Mellon requests users of this software to return to
     19  1.1  oster  *
     20  1.1  oster  *  Software Distribution Coordinator  or  Software.Distribution (at) CS.CMU.EDU
     21  1.1  oster  *  School of Computer Science
     22  1.1  oster  *  Carnegie Mellon University
     23  1.1  oster  *  Pittsburgh PA 15213-3890
     24  1.1  oster  *
     25  1.1  oster  * any improvements or extensions that they make and grant Carnegie the
     26  1.1  oster  * rights to redistribute these changes.
     27  1.1  oster  */
     28  1.1  oster 
     29  1.1  oster /* rf_layout.c -- driver code dealing with layout and mapping issues
     30  1.1  oster  */
     31  1.1  oster 
     32  1.1  oster #include "rf_types.h"
     33  1.1  oster #include "rf_archs.h"
     34  1.1  oster #include "rf_raid.h"
     35  1.1  oster #include "rf_configure.h"
     36  1.1  oster #include "rf_dag.h"
     37  1.1  oster #include "rf_desc.h"
     38  1.1  oster #include "rf_decluster.h"
     39  1.1  oster #include "rf_pq.h"
     40  1.1  oster #include "rf_declusterPQ.h"
     41  1.1  oster #include "rf_raid0.h"
     42  1.1  oster #include "rf_raid1.h"
     43  1.1  oster #include "rf_raid4.h"
     44  1.1  oster #include "rf_raid5.h"
     45  1.1  oster #include "rf_states.h"
     46  1.1  oster #if RF_INCLUDE_RAID5_RS > 0
     47  1.1  oster #include "rf_raid5_rotatedspare.h"
     48  1.1  oster #endif /* RF_INCLUDE_RAID5_RS > 0 */
     49  1.1  oster #if RF_INCLUDE_CHAINDECLUSTER > 0
     50  1.1  oster #include "rf_chaindecluster.h"
     51  1.1  oster #endif /* RF_INCLUDE_CHAINDECLUSTER > 0 */
     52  1.1  oster #if RF_INCLUDE_INTERDECLUSTER > 0
     53  1.1  oster #include "rf_interdecluster.h"
     54  1.1  oster #endif /* RF_INCLUDE_INTERDECLUSTER > 0 */
     55  1.1  oster #if RF_INCLUDE_PARITYLOGGING > 0
     56  1.1  oster #include "rf_paritylogging.h"
     57  1.1  oster #endif /* RF_INCLUDE_PARITYLOGGING > 0 */
     58  1.1  oster #if RF_INCLUDE_EVENODD > 0
     59  1.1  oster #include "rf_evenodd.h"
     60  1.1  oster #endif /* RF_INCLUDE_EVENODD > 0 */
     61  1.1  oster #include "rf_general.h"
     62  1.1  oster #include "rf_driver.h"
     63  1.1  oster #include "rf_parityscan.h"
     64  1.1  oster #include "rf_reconbuffer.h"
     65  1.1  oster #include "rf_reconutil.h"
     66  1.1  oster 
     67  1.1  oster /***********************************************************************
     68  1.1  oster  *
     69  1.1  oster  * the layout switch defines all the layouts that are supported.
     70  1.1  oster  *    fields are: layout ID, init routine, shutdown routine, map
     71  1.1  oster  *    sector, map parity, identify stripe, dag selection, map stripeid
     72  1.1  oster  *    to parity stripe id (optional), num faults tolerated, special
     73  1.1  oster  *    flags.
     74  1.1  oster  *
     75  1.1  oster  ***********************************************************************/
     76  1.1  oster 
     77  1.1  oster static RF_AccessState_t DefaultStates[] = {rf_QuiesceState,
     78  1.1  oster 	rf_IncrAccessesCountState, rf_MapState, rf_LockState, rf_CreateDAGState,
     79  1.1  oster 	rf_ExecuteDAGState, rf_ProcessDAGState, rf_DecrAccessesCountState,
     80  1.1  oster 	rf_CleanupState, rf_LastState};
     81  1.1  oster 
     82  1.1  oster #if defined(__NetBSD__) && !defined(_KERNEL)
     83  1.1  oster /* XXX Gross hack to shutup gcc -- it complains that DefaultStates is not
     84  1.1  oster used when compiling this in userland..  I hate to burst it's bubble, but
     85  1.1  oster DefaultStates is used all over the place here in the initialization of
     86  1.1  oster lots of data structures.  GO */
     87  1.1  oster RF_AccessState_t *NothingAtAll = DefaultStates;
     88  1.1  oster #endif
     89  1.1  oster 
     90  1.1  oster #if defined(__NetBSD__) && defined(_KERNEL)
     91  1.1  oster /* XXX Remove static so GCC doesn't complain about these being unused! */
     92  1.1  oster int distSpareYes = 1;
     93  1.1  oster int distSpareNo  = 0;
     94  1.1  oster #else
     95  1.1  oster static int distSpareYes = 1;
     96  1.1  oster static int distSpareNo  = 0;
     97  1.1  oster #endif
     98  1.2  oster #ifdef _KERNEL
     99  1.1  oster #define RF_NK2(a,b)
    100  1.2  oster #else /* _KERNEL */
    101  1.1  oster #define RF_NK2(a,b) a,b,
    102  1.2  oster #endif /* _KERNEL */
    103  1.1  oster 
    104  1.1  oster #if RF_UTILITY > 0
    105  1.1  oster #define RF_NU(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)
    106  1.1  oster #else /* RF_UTILITY > 0 */
    107  1.1  oster #define RF_NU(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p
    108  1.1  oster #endif /* RF_UTILITY > 0 */
    109  1.1  oster 
    110  1.1  oster static RF_LayoutSW_t mapsw[] = {
    111  1.1  oster 	/* parity declustering */
    112  1.1  oster 	{'T', "Parity declustering",
    113  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificDeclustered, &distSpareNo)
    114  1.1  oster 	RF_NU(
    115  1.1  oster 	rf_ConfigureDeclustered,
    116  1.1  oster 	rf_MapSectorDeclustered, rf_MapParityDeclustered, NULL,
    117  1.1  oster 	rf_IdentifyStripeDeclustered,
    118  1.1  oster 	rf_RaidFiveDagSelect,
    119  1.1  oster 	rf_MapSIDToPSIDDeclustered,
    120  1.1  oster 	rf_GetDefaultHeadSepLimitDeclustered,
    121  1.1  oster 	rf_GetDefaultNumFloatingReconBuffersDeclustered,
    122  1.1  oster 	NULL, NULL,
    123  1.1  oster 	rf_SubmitReconBufferBasic,
    124  1.1  oster 	rf_VerifyParityBasic,
    125  1.1  oster 	1,
    126  1.1  oster 	DefaultStates,
    127  1.1  oster 	0)
    128  1.1  oster 	},
    129  1.1  oster 
    130  1.1  oster 	/* parity declustering with distributed sparing */
    131  1.1  oster 	{'D', "Distributed sparing parity declustering",
    132  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificDeclustered, &distSpareYes)
    133  1.1  oster 	RF_NU(
    134  1.1  oster 	rf_ConfigureDeclusteredDS,
    135  1.1  oster 	rf_MapSectorDeclustered, rf_MapParityDeclustered, NULL,
    136  1.1  oster 	rf_IdentifyStripeDeclustered,
    137  1.1  oster 	rf_RaidFiveDagSelect,
    138  1.1  oster 	rf_MapSIDToPSIDDeclustered,
    139  1.1  oster 	rf_GetDefaultHeadSepLimitDeclustered,
    140  1.1  oster 	rf_GetDefaultNumFloatingReconBuffersDeclustered,
    141  1.1  oster 	rf_GetNumSpareRUsDeclustered, rf_InstallSpareTable,
    142  1.1  oster 	rf_SubmitReconBufferBasic,
    143  1.1  oster 	rf_VerifyParityBasic,
    144  1.1  oster 	1,
    145  1.1  oster 	DefaultStates,
    146  1.1  oster 	RF_DISTRIBUTE_SPARE|RF_BD_DECLUSTERED)
    147  1.1  oster 	},
    148  1.1  oster 
    149  1.1  oster #if RF_INCLUDE_DECL_PQ > 0
    150  1.1  oster 	/* declustered P+Q */
    151  1.1  oster 	{'Q', "Declustered P+Q",
    152  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificDeclustered, &distSpareNo)
    153  1.1  oster 	RF_NU(
    154  1.1  oster 	rf_ConfigureDeclusteredPQ,
    155  1.1  oster 	rf_MapSectorDeclusteredPQ, rf_MapParityDeclusteredPQ, rf_MapQDeclusteredPQ,
    156  1.1  oster 	rf_IdentifyStripeDeclusteredPQ,
    157  1.1  oster 	rf_PQDagSelect,
    158  1.1  oster 	rf_MapSIDToPSIDDeclustered,
    159  1.1  oster 	rf_GetDefaultHeadSepLimitDeclustered,
    160  1.1  oster 	rf_GetDefaultNumFloatingReconBuffersPQ,
    161  1.1  oster 	NULL, NULL,
    162  1.1  oster 	NULL,
    163  1.1  oster 	rf_VerifyParityBasic,
    164  1.1  oster 	2,
    165  1.1  oster 	DefaultStates,
    166  1.1  oster 	0)
    167  1.1  oster 	},
    168  1.1  oster #endif /* RF_INCLUDE_DECL_PQ > 0 */
    169  1.1  oster 
    170  1.1  oster #if RF_INCLUDE_RAID5_RS > 0
    171  1.1  oster 	/* RAID 5 with rotated sparing */
    172  1.1  oster 	{'R', "RAID Level 5 rotated sparing",
    173  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificNULL, NULL)
    174  1.1  oster 	RF_NU(
    175  1.1  oster 	rf_ConfigureRAID5_RS,
    176  1.1  oster 	rf_MapSectorRAID5_RS, rf_MapParityRAID5_RS, NULL,
    177  1.1  oster 	rf_IdentifyStripeRAID5_RS,
    178  1.1  oster 	rf_RaidFiveDagSelect,
    179  1.1  oster 	rf_MapSIDToPSIDRAID5_RS,
    180  1.1  oster 	rf_GetDefaultHeadSepLimitRAID5,
    181  1.1  oster 	rf_GetDefaultNumFloatingReconBuffersRAID5,
    182  1.1  oster 	rf_GetNumSpareRUsRAID5_RS, NULL,
    183  1.1  oster 	rf_SubmitReconBufferBasic,
    184  1.1  oster 	rf_VerifyParityBasic,
    185  1.1  oster 	1,
    186  1.1  oster 	DefaultStates,
    187  1.1  oster 	RF_DISTRIBUTE_SPARE)
    188  1.1  oster 	},
    189  1.1  oster #endif /* RF_INCLUDE_RAID5_RS > 0 */
    190  1.1  oster 
    191  1.1  oster #if RF_INCLUDE_CHAINDECLUSTER > 0
    192  1.1  oster 	/* Chained Declustering */
    193  1.1  oster 	{'C', "Chained Declustering",
    194  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificNULL, NULL)
    195  1.1  oster 	RF_NU(
    196  1.1  oster 	rf_ConfigureChainDecluster,
    197  1.1  oster 	rf_MapSectorChainDecluster, rf_MapParityChainDecluster, NULL,
    198  1.1  oster 	rf_IdentifyStripeChainDecluster,
    199  1.1  oster 	rf_RAIDCDagSelect,
    200  1.1  oster 	rf_MapSIDToPSIDChainDecluster,
    201  1.1  oster 	NULL,
    202  1.1  oster 	NULL,
    203  1.1  oster 	rf_GetNumSpareRUsChainDecluster, NULL,
    204  1.1  oster 	rf_SubmitReconBufferBasic,
    205  1.1  oster 	rf_VerifyParityBasic,
    206  1.1  oster 	1,
    207  1.1  oster 	DefaultStates,
    208  1.1  oster 	0)
    209  1.1  oster 	},
    210  1.1  oster #endif /* RF_INCLUDE_CHAINDECLUSTER > 0 */
    211  1.1  oster 
    212  1.1  oster #if RF_INCLUDE_INTERDECLUSTER > 0
    213  1.1  oster 	/* Interleaved Declustering */
    214  1.1  oster 	{'I', "Interleaved Declustering",
    215  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificNULL, NULL)
    216  1.1  oster 	RF_NU(
    217  1.1  oster 	rf_ConfigureInterDecluster,
    218  1.1  oster 	rf_MapSectorInterDecluster, rf_MapParityInterDecluster, NULL,
    219  1.1  oster 	rf_IdentifyStripeInterDecluster,
    220  1.1  oster 	rf_RAIDIDagSelect,
    221  1.1  oster 	rf_MapSIDToPSIDInterDecluster,
    222  1.1  oster 	rf_GetDefaultHeadSepLimitInterDecluster,
    223  1.1  oster 	rf_GetDefaultNumFloatingReconBuffersInterDecluster,
    224  1.1  oster 	rf_GetNumSpareRUsInterDecluster, NULL,
    225  1.1  oster 	rf_SubmitReconBufferBasic,
    226  1.1  oster 	rf_VerifyParityBasic,
    227  1.1  oster 	1,
    228  1.1  oster 	DefaultStates,
    229  1.1  oster 	RF_DISTRIBUTE_SPARE)
    230  1.1  oster 	},
    231  1.1  oster #endif /* RF_INCLUDE_INTERDECLUSTER > 0 */
    232  1.1  oster 
    233  1.1  oster #if RF_INCLUDE_RAID0 > 0
    234  1.1  oster 	/* RAID level 0 */
    235  1.1  oster 	{'0', "RAID Level 0",
    236  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificNULL, NULL)
    237  1.1  oster 	RF_NU(
    238  1.1  oster 	rf_ConfigureRAID0,
    239  1.1  oster 	rf_MapSectorRAID0, rf_MapParityRAID0, NULL,
    240  1.1  oster 	rf_IdentifyStripeRAID0,
    241  1.1  oster 	rf_RAID0DagSelect,
    242  1.1  oster 	rf_MapSIDToPSIDRAID0,
    243  1.1  oster 	NULL,
    244  1.1  oster 	NULL,
    245  1.1  oster 	NULL, NULL,
    246  1.1  oster 	NULL,
    247  1.1  oster 	rf_VerifyParityRAID0,
    248  1.1  oster 	0,
    249  1.1  oster 	DefaultStates,
    250  1.1  oster 	0)
    251  1.1  oster 	},
    252  1.1  oster #endif /* RF_INCLUDE_RAID0 > 0 */
    253  1.1  oster 
    254  1.1  oster #if RF_INCLUDE_RAID1 > 0
    255  1.1  oster 	/* RAID level 1 */
    256  1.1  oster 	{'1', "RAID Level 1",
    257  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificNULL, NULL)
    258  1.1  oster 	RF_NU(
    259  1.1  oster 	rf_ConfigureRAID1,
    260  1.1  oster 	rf_MapSectorRAID1, rf_MapParityRAID1, NULL,
    261  1.1  oster 	rf_IdentifyStripeRAID1,
    262  1.1  oster 	rf_RAID1DagSelect,
    263  1.1  oster 	rf_MapSIDToPSIDRAID1,
    264  1.1  oster 	NULL,
    265  1.1  oster 	NULL,
    266  1.1  oster 	NULL, NULL,
    267  1.1  oster 	rf_SubmitReconBufferRAID1,
    268  1.1  oster 	rf_VerifyParityRAID1,
    269  1.1  oster 	1,
    270  1.1  oster 	DefaultStates,
    271  1.1  oster 	0)
    272  1.1  oster 	},
    273  1.1  oster #endif /* RF_INCLUDE_RAID1 > 0 */
    274  1.1  oster 
    275  1.1  oster #if RF_INCLUDE_RAID4 > 0
    276  1.1  oster 	/* RAID level 4 */
    277  1.1  oster 	{'4', "RAID Level 4",
    278  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificNULL, NULL)
    279  1.1  oster 	RF_NU(
    280  1.1  oster 	rf_ConfigureRAID4,
    281  1.1  oster 	rf_MapSectorRAID4, rf_MapParityRAID4, NULL,
    282  1.1  oster 	rf_IdentifyStripeRAID4,
    283  1.1  oster 	rf_RaidFiveDagSelect,
    284  1.1  oster 	rf_MapSIDToPSIDRAID4,
    285  1.1  oster 	rf_GetDefaultHeadSepLimitRAID4,
    286  1.1  oster 	rf_GetDefaultNumFloatingReconBuffersRAID4,
    287  1.1  oster 	NULL, NULL,
    288  1.1  oster 	rf_SubmitReconBufferBasic,
    289  1.1  oster 	rf_VerifyParityBasic,
    290  1.1  oster 	1,
    291  1.1  oster 	DefaultStates,
    292  1.1  oster 	0)
    293  1.1  oster 	},
    294  1.1  oster #endif /* RF_INCLUDE_RAID4 > 0 */
    295  1.1  oster 
    296  1.1  oster #if RF_INCLUDE_RAID5 > 0
    297  1.1  oster 	/* RAID level 5 */
    298  1.1  oster 	{'5', "RAID Level 5",
    299  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificNULL, NULL)
    300  1.1  oster 	RF_NU(
    301  1.1  oster 	rf_ConfigureRAID5,
    302  1.1  oster 	rf_MapSectorRAID5, rf_MapParityRAID5, NULL,
    303  1.1  oster 	rf_IdentifyStripeRAID5,
    304  1.1  oster 	rf_RaidFiveDagSelect,
    305  1.1  oster 	rf_MapSIDToPSIDRAID5,
    306  1.1  oster 	rf_GetDefaultHeadSepLimitRAID5,
    307  1.1  oster 	rf_GetDefaultNumFloatingReconBuffersRAID5,
    308  1.1  oster 	NULL, NULL,
    309  1.1  oster 	rf_SubmitReconBufferBasic,
    310  1.1  oster 	rf_VerifyParityBasic,
    311  1.1  oster 	1,
    312  1.1  oster 	DefaultStates,
    313  1.1  oster 	0)
    314  1.1  oster 	},
    315  1.1  oster #endif /* RF_INCLUDE_RAID5 > 0 */
    316  1.1  oster 
    317  1.1  oster #if RF_INCLUDE_EVENODD > 0
    318  1.1  oster 	/* Evenodd */
    319  1.1  oster 	{'E', "EvenOdd",
    320  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificNULL, NULL)
    321  1.1  oster 	RF_NU(
    322  1.1  oster 	rf_ConfigureEvenOdd,
    323  1.1  oster 	rf_MapSectorRAID5, rf_MapParityEvenOdd, rf_MapEEvenOdd,
    324  1.1  oster 	rf_IdentifyStripeEvenOdd,
    325  1.1  oster 	rf_EODagSelect,
    326  1.1  oster 	rf_MapSIDToPSIDRAID5,
    327  1.1  oster 	NULL,
    328  1.1  oster 	NULL,
    329  1.1  oster 	NULL, NULL,
    330  1.1  oster 	NULL, /* no reconstruction, yet */
    331  1.1  oster 	rf_VerifyParityEvenOdd,
    332  1.1  oster 	2,
    333  1.1  oster 	DefaultStates,
    334  1.1  oster 	0)
    335  1.1  oster 	},
    336  1.1  oster #endif /* RF_INCLUDE_EVENODD > 0 */
    337  1.1  oster 
    338  1.1  oster #if RF_INCLUDE_EVENODD > 0
    339  1.1  oster 	/* Declustered Evenodd */
    340  1.1  oster 	{'e', "Declustered EvenOdd",
    341  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificDeclustered, &distSpareNo)
    342  1.1  oster 	RF_NU(
    343  1.1  oster 	rf_ConfigureDeclusteredPQ,
    344  1.1  oster 	rf_MapSectorDeclusteredPQ, rf_MapParityDeclusteredPQ, rf_MapQDeclusteredPQ,
    345  1.1  oster 	rf_IdentifyStripeDeclusteredPQ,
    346  1.1  oster 	rf_EODagSelect,
    347  1.1  oster 	rf_MapSIDToPSIDRAID5,
    348  1.1  oster 	rf_GetDefaultHeadSepLimitDeclustered,
    349  1.1  oster 	rf_GetDefaultNumFloatingReconBuffersPQ,
    350  1.1  oster 	NULL, NULL,
    351  1.1  oster 	NULL, /* no reconstruction, yet */
    352  1.1  oster 	rf_VerifyParityEvenOdd,
    353  1.1  oster 	2,
    354  1.1  oster 	DefaultStates,
    355  1.1  oster 	0)
    356  1.1  oster 	},
    357  1.1  oster #endif /* RF_INCLUDE_EVENODD > 0 */
    358  1.1  oster 
    359  1.1  oster #if RF_INCLUDE_PARITYLOGGING > 0
    360  1.1  oster 	/* parity logging */
    361  1.1  oster 	{'L', "Parity logging",
    362  1.1  oster 	RF_NK2(rf_MakeLayoutSpecificNULL, NULL)
    363  1.1  oster 	RF_NU(
    364  1.1  oster 	rf_ConfigureParityLogging,
    365  1.1  oster 	rf_MapSectorParityLogging, rf_MapParityParityLogging, NULL,
    366  1.1  oster 	rf_IdentifyStripeParityLogging,
    367  1.1  oster 	rf_ParityLoggingDagSelect,
    368  1.1  oster 	rf_MapSIDToPSIDParityLogging,
    369  1.1  oster 	rf_GetDefaultHeadSepLimitParityLogging,
    370  1.1  oster 	rf_GetDefaultNumFloatingReconBuffersParityLogging,
    371  1.1  oster 	NULL, NULL,
    372  1.1  oster 	rf_SubmitReconBufferBasic,
    373  1.1  oster 	NULL,
    374  1.1  oster 	1,
    375  1.1  oster 	DefaultStates,
    376  1.1  oster 	0)
    377  1.1  oster 	},
    378  1.1  oster #endif /* RF_INCLUDE_PARITYLOGGING > 0 */
    379  1.1  oster 
    380  1.1  oster 	/* end-of-list marker */
    381  1.1  oster 	{ '\0', NULL,
    382  1.1  oster 	RF_NK2(NULL, NULL)
    383  1.1  oster 	RF_NU(
    384  1.1  oster 	NULL,
    385  1.1  oster 	NULL, NULL, NULL,
    386  1.1  oster 	NULL,
    387  1.1  oster 	NULL,
    388  1.1  oster 	NULL,
    389  1.1  oster 	NULL,
    390  1.1  oster 	NULL,
    391  1.1  oster 	NULL, NULL,
    392  1.1  oster 	NULL,
    393  1.1  oster 	NULL,
    394  1.1  oster 	0,
    395  1.1  oster 	NULL,
    396  1.1  oster 	0)
    397  1.1  oster 	}
    398  1.1  oster };
    399  1.1  oster 
    400  1.1  oster RF_LayoutSW_t *rf_GetLayout(RF_ParityConfig_t parityConfig)
    401  1.1  oster {
    402  1.1  oster   RF_LayoutSW_t *p;
    403  1.1  oster 
    404  1.1  oster   /* look up the specific layout */
    405  1.1  oster   for (p=&mapsw[0]; p->parityConfig; p++)
    406  1.1  oster     if (p->parityConfig == parityConfig)
    407  1.1  oster       break;
    408  1.1  oster   if (!p->parityConfig)
    409  1.1  oster     return(NULL);
    410  1.1  oster   RF_ASSERT(p->parityConfig == parityConfig);
    411  1.1  oster   return(p);
    412  1.1  oster }
    413  1.1  oster 
    414  1.1  oster #if RF_UTILITY == 0
    415  1.1  oster /*****************************************************************************************
    416  1.1  oster  *
    417  1.1  oster  * ConfigureLayout --
    418  1.1  oster  *
    419  1.1  oster  * read the configuration file and set up the RAID layout parameters.  After reading
    420  1.1  oster  * common params, invokes the layout-specific configuration routine to finish
    421  1.1  oster  * the configuration.
    422  1.1  oster  *
    423  1.1  oster  ****************************************************************************************/
    424  1.1  oster int rf_ConfigureLayout(
    425  1.1  oster   RF_ShutdownList_t  **listp,
    426  1.1  oster   RF_Raid_t           *raidPtr,
    427  1.1  oster   RF_Config_t         *cfgPtr)
    428  1.1  oster {
    429  1.1  oster   RF_RaidLayout_t *layoutPtr = &(raidPtr->Layout);
    430  1.1  oster   RF_ParityConfig_t parityConfig;
    431  1.1  oster   RF_LayoutSW_t *p;
    432  1.1  oster   int retval;
    433  1.1  oster 
    434  1.1  oster   layoutPtr->sectorsPerStripeUnit = cfgPtr->sectPerSU;
    435  1.1  oster   layoutPtr->SUsPerPU             = cfgPtr->SUsPerPU;
    436  1.1  oster   layoutPtr->SUsPerRU             = cfgPtr->SUsPerRU;
    437  1.1  oster   parityConfig                    = cfgPtr->parityConfig;
    438  1.1  oster 
    439  1.1  oster   layoutPtr->stripeUnitsPerDisk = raidPtr->sectorsPerDisk / layoutPtr->sectorsPerStripeUnit;
    440  1.1  oster 
    441  1.1  oster   p = rf_GetLayout(parityConfig);
    442  1.1  oster   if (p == NULL) {
    443  1.1  oster     RF_ERRORMSG1("Unknown parity configuration '%c'", parityConfig);
    444  1.1  oster     return(EINVAL);
    445  1.1  oster   }
    446  1.1  oster   RF_ASSERT(p->parityConfig == parityConfig);
    447  1.1  oster   layoutPtr->map = p;
    448  1.1  oster 
    449  1.1  oster   /* initialize the specific layout */
    450  1.1  oster 
    451  1.1  oster   retval = (p->Configure)(listp, raidPtr, cfgPtr);
    452  1.1  oster 
    453  1.1  oster   if (retval)
    454  1.1  oster     return(retval);
    455  1.1  oster 
    456  1.1  oster   layoutPtr->dataBytesPerStripe = layoutPtr->dataSectorsPerStripe << raidPtr->logBytesPerSector;
    457  1.1  oster   raidPtr->sectorsPerDisk = layoutPtr->stripeUnitsPerDisk * layoutPtr->sectorsPerStripeUnit;
    458  1.1  oster 
    459  1.1  oster   if (rf_forceNumFloatingReconBufs >= 0) {
    460  1.1  oster     raidPtr->numFloatingReconBufs = rf_forceNumFloatingReconBufs;
    461  1.1  oster   }
    462  1.1  oster   else {
    463  1.1  oster     raidPtr->numFloatingReconBufs = rf_GetDefaultNumFloatingReconBuffers(raidPtr);
    464  1.1  oster   }
    465  1.1  oster 
    466  1.1  oster   if (rf_forceHeadSepLimit >= 0) {
    467  1.1  oster     raidPtr->headSepLimit = rf_forceHeadSepLimit;
    468  1.1  oster   }
    469  1.1  oster   else {
    470  1.1  oster     raidPtr->headSepLimit = rf_GetDefaultHeadSepLimit(raidPtr);
    471  1.1  oster   }
    472  1.1  oster 
    473  1.1  oster   printf("RAIDFRAME: Configure (%s): total number of sectors is %lu (%lu MB)\n",
    474  1.1  oster      layoutPtr->map->configName,
    475  1.1  oster      (unsigned long)raidPtr->totalSectors,
    476  1.1  oster      (unsigned long)(raidPtr->totalSectors / 1024 * (1<<raidPtr->logBytesPerSector) / 1024));
    477  1.1  oster   if (raidPtr->headSepLimit >= 0) {
    478  1.1  oster     printf("RAIDFRAME(%s): Using %ld floating recon bufs with head sep limit %ld\n",
    479  1.1  oster       layoutPtr->map->configName, (long)raidPtr->numFloatingReconBufs, (long)raidPtr->headSepLimit);
    480  1.1  oster   }
    481  1.1  oster   else {
    482  1.1  oster     printf("RAIDFRAME(%s): Using %ld floating recon bufs with no head sep limit\n",
    483  1.1  oster       layoutPtr->map->configName, (long)raidPtr->numFloatingReconBufs);
    484  1.1  oster   }
    485  1.1  oster 
    486  1.1  oster   return(0);
    487  1.1  oster }
    488  1.1  oster 
    489  1.1  oster /* typically there is a 1-1 mapping between stripes and parity stripes.
    490  1.1  oster  * however, the declustering code supports packing multiple stripes into
    491  1.1  oster  * a single parity stripe, so as to increase the size of the reconstruction
    492  1.1  oster  * unit without affecting the size of the stripe unit.  This routine finds
    493  1.1  oster  * the parity stripe identifier associated with a stripe ID.  There is also
    494  1.1  oster  * a RaidAddressToParityStripeID macro in layout.h
    495  1.1  oster  */
    496  1.1  oster RF_StripeNum_t rf_MapStripeIDToParityStripeID(layoutPtr, stripeID, which_ru)
    497  1.1  oster   RF_RaidLayout_t    *layoutPtr;
    498  1.1  oster   RF_StripeNum_t      stripeID;
    499  1.1  oster   RF_ReconUnitNum_t  *which_ru;
    500  1.1  oster {
    501  1.1  oster   RF_StripeNum_t parityStripeID;
    502  1.1  oster 
    503  1.1  oster   /* quick exit in the common case of SUsPerPU==1 */
    504  1.1  oster   if ((layoutPtr->SUsPerPU == 1) || !layoutPtr->map->MapSIDToPSID) {
    505  1.1  oster     *which_ru = 0;
    506  1.1  oster     return(stripeID);
    507  1.1  oster   }
    508  1.1  oster   else {
    509  1.1  oster     (layoutPtr->map->MapSIDToPSID)(layoutPtr, stripeID, &parityStripeID, which_ru);
    510  1.1  oster   }
    511  1.1  oster   return(parityStripeID);
    512  1.1  oster }
    513  1.1  oster #endif /* RF_UTILITY == 0 */
    514