Home | History | Annotate | Line # | Download | only in raidframe
raidframevar.h revision 1.1.2.2
      1  1.1.2.2  fvdl /*	$NetBSD: raidframevar.h,v 1.1.2.2 2001/10/11 00:02:15 fvdl Exp $ */
      2  1.1.2.2  fvdl /*-
      3  1.1.2.2  fvdl  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
      4  1.1.2.2  fvdl  * All rights reserved.
      5  1.1.2.2  fvdl  *
      6  1.1.2.2  fvdl  * This code is derived from software contributed to The NetBSD Foundation
      7  1.1.2.2  fvdl  * by Greg Oster
      8  1.1.2.2  fvdl  *
      9  1.1.2.2  fvdl  * Redistribution and use in source and binary forms, with or without
     10  1.1.2.2  fvdl  * modification, are permitted provided that the following conditions
     11  1.1.2.2  fvdl  * are met:
     12  1.1.2.2  fvdl  * 1. Redistributions of source code must retain the above copyright
     13  1.1.2.2  fvdl  *    notice, this list of conditions and the following disclaimer.
     14  1.1.2.2  fvdl  * 2. Redistributions in binary form must reproduce the above copyright
     15  1.1.2.2  fvdl  *    notice, this list of conditions and the following disclaimer in the
     16  1.1.2.2  fvdl  *    documentation and/or other materials provided with the distribution.
     17  1.1.2.2  fvdl  * 3. All advertising materials mentioning features or use of this software
     18  1.1.2.2  fvdl  *    must display the following acknowledgement:
     19  1.1.2.2  fvdl  *        This product includes software developed by the NetBSD
     20  1.1.2.2  fvdl  *        Foundation, Inc. and its contributors.
     21  1.1.2.2  fvdl  * 4. Neither the name of The NetBSD Foundation nor the names of its
     22  1.1.2.2  fvdl  *    contributors may be used to endorse or promote products derived
     23  1.1.2.2  fvdl  *    from this software without specific prior written permission.
     24  1.1.2.2  fvdl  *
     25  1.1.2.2  fvdl  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     26  1.1.2.2  fvdl  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     27  1.1.2.2  fvdl  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     28  1.1.2.2  fvdl  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     29  1.1.2.2  fvdl  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     30  1.1.2.2  fvdl  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     31  1.1.2.2  fvdl  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     32  1.1.2.2  fvdl  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     33  1.1.2.2  fvdl  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     34  1.1.2.2  fvdl  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     35  1.1.2.2  fvdl  * POSSIBILITY OF SUCH DAMAGE.
     36  1.1.2.2  fvdl  */
     37  1.1.2.2  fvdl /*
     38  1.1.2.2  fvdl  * Copyright (c) 1995 Carnegie-Mellon University.
     39  1.1.2.2  fvdl  * All rights reserved.
     40  1.1.2.2  fvdl  *
     41  1.1.2.2  fvdl  * Author: Mark Holland
     42  1.1.2.2  fvdl  *
     43  1.1.2.2  fvdl  * Permission to use, copy, modify and distribute this software and
     44  1.1.2.2  fvdl  * its documentation is hereby granted, provided that both the copyright
     45  1.1.2.2  fvdl  * notice and this permission notice appear in all copies of the
     46  1.1.2.2  fvdl  * software, derivative works or modified versions, and any portions
     47  1.1.2.2  fvdl  * thereof, and that both notices appear in supporting documentation.
     48  1.1.2.2  fvdl  *
     49  1.1.2.2  fvdl  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
     50  1.1.2.2  fvdl  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
     51  1.1.2.2  fvdl  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
     52  1.1.2.2  fvdl  *
     53  1.1.2.2  fvdl  * Carnegie Mellon requests users of this software to return to
     54  1.1.2.2  fvdl  *
     55  1.1.2.2  fvdl  *  Software Distribution Coordinator  or  Software.Distribution (at) CS.CMU.EDU
     56  1.1.2.2  fvdl  *  School of Computer Science
     57  1.1.2.2  fvdl  *  Carnegie Mellon University
     58  1.1.2.2  fvdl  *  Pittsburgh PA 15213-3890
     59  1.1.2.2  fvdl  *
     60  1.1.2.2  fvdl  * any improvements or extensions that they make and grant Carnegie the
     61  1.1.2.2  fvdl  * rights to redistribute these changes.
     62  1.1.2.2  fvdl  */
     63  1.1.2.2  fvdl 
     64  1.1.2.2  fvdl /*
     65  1.1.2.2  fvdl  * Copyright (c) 1995 Carnegie-Mellon University.
     66  1.1.2.2  fvdl  * All rights reserved.
     67  1.1.2.2  fvdl  *
     68  1.1.2.2  fvdl  * Author: Jim Zelenka
     69  1.1.2.2  fvdl  *
     70  1.1.2.2  fvdl  * Permission to use, copy, modify and distribute this software and
     71  1.1.2.2  fvdl  * its documentation is hereby granted, provided that both the copyright
     72  1.1.2.2  fvdl  * notice and this permission notice appear in all copies of the
     73  1.1.2.2  fvdl  * software, derivative works or modified versions, and any portions
     74  1.1.2.2  fvdl  * thereof, and that both notices appear in supporting documentation.
     75  1.1.2.2  fvdl  *
     76  1.1.2.2  fvdl  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
     77  1.1.2.2  fvdl  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
     78  1.1.2.2  fvdl  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
     79  1.1.2.2  fvdl  *
     80  1.1.2.2  fvdl  * Carnegie Mellon requests users of this software to return to
     81  1.1.2.2  fvdl  *
     82  1.1.2.2  fvdl  *  Software Distribution Coordinator  or  Software.Distribution (at) CS.CMU.EDU
     83  1.1.2.2  fvdl  *  School of Computer Science
     84  1.1.2.2  fvdl  *  Carnegie Mellon University
     85  1.1.2.2  fvdl  *  Pittsburgh PA 15213-3890
     86  1.1.2.2  fvdl  *
     87  1.1.2.2  fvdl  * any improvements or extensions that they make and grant Carnegie the
     88  1.1.2.2  fvdl  * rights to redistribute these changes.
     89  1.1.2.2  fvdl  */
     90  1.1.2.2  fvdl 
     91  1.1.2.2  fvdl /*****************************************************
     92  1.1.2.2  fvdl  *
     93  1.1.2.2  fvdl  * raidframevar.h
     94  1.1.2.2  fvdl  *
     95  1.1.2.2  fvdl  * main header file for using raidframe in the kernel.
     96  1.1.2.2  fvdl  *
     97  1.1.2.2  fvdl  *****************************************************/
     98  1.1.2.2  fvdl 
     99  1.1.2.2  fvdl 
    100  1.1.2.2  fvdl #ifndef _RF_RAIDFRAMEVAR_H_
    101  1.1.2.2  fvdl #define _RF_RAIDFRAMEVAR_H_
    102  1.1.2.2  fvdl 
    103  1.1.2.2  fvdl 
    104  1.1.2.2  fvdl #include <sys/ioctl.h>
    105  1.1.2.2  fvdl 
    106  1.1.2.2  fvdl #include <sys/errno.h>
    107  1.1.2.2  fvdl #include <sys/types.h>
    108  1.1.2.2  fvdl 
    109  1.1.2.2  fvdl #include <sys/uio.h>
    110  1.1.2.2  fvdl #include <sys/param.h>
    111  1.1.2.2  fvdl #include <sys/proc.h>
    112  1.1.2.2  fvdl #include <sys/lock.h>
    113  1.1.2.2  fvdl 
    114  1.1.2.2  fvdl /*
    115  1.1.2.2  fvdl  * First, define system-dependent types and constants.
    116  1.1.2.2  fvdl  *
    117  1.1.2.2  fvdl  * If the machine is big-endian, RF_BIG_ENDIAN should be 1.
    118  1.1.2.2  fvdl  * Otherwise, it should be 0.
    119  1.1.2.2  fvdl  *
    120  1.1.2.2  fvdl  * The various integer types should be self-explanatory; we
    121  1.1.2.2  fvdl  * use these elsewhere to avoid size confusion.
    122  1.1.2.2  fvdl  *
    123  1.1.2.2  fvdl  * LONGSHIFT is lg(sizeof(long)) (that is, log base two of sizeof(long)
    124  1.1.2.2  fvdl  *
    125  1.1.2.2  fvdl  */
    126  1.1.2.2  fvdl 
    127  1.1.2.2  fvdl #include <sys/types.h>
    128  1.1.2.2  fvdl #include <machine/endian.h>
    129  1.1.2.2  fvdl #include <machine/limits.h>
    130  1.1.2.2  fvdl 
    131  1.1.2.2  fvdl #if BYTE_ORDER == BIG_ENDIAN
    132  1.1.2.2  fvdl #define RF_IS_BIG_ENDIAN    1
    133  1.1.2.2  fvdl #elif BYTE_ORDER == LITTLE_ENDIAN
    134  1.1.2.2  fvdl #define RF_IS_BIG_ENDIAN    0
    135  1.1.2.2  fvdl #else
    136  1.1.2.2  fvdl #error byte order not defined
    137  1.1.2.2  fvdl #endif
    138  1.1.2.2  fvdl typedef int8_t RF_int8;
    139  1.1.2.2  fvdl typedef u_int8_t RF_uint8;
    140  1.1.2.2  fvdl typedef int16_t RF_int16;
    141  1.1.2.2  fvdl typedef u_int16_t RF_uint16;
    142  1.1.2.2  fvdl typedef int32_t RF_int32;
    143  1.1.2.2  fvdl typedef u_int32_t RF_uint32;
    144  1.1.2.2  fvdl typedef int64_t RF_int64;
    145  1.1.2.2  fvdl typedef u_int64_t RF_uint64;
    146  1.1.2.2  fvdl #if LONG_BIT == 32
    147  1.1.2.2  fvdl #define RF_LONGSHIFT        2
    148  1.1.2.2  fvdl #elif LONG_BIT == 64
    149  1.1.2.2  fvdl #define RF_LONGSHIFT        3
    150  1.1.2.2  fvdl #else
    151  1.1.2.2  fvdl #error word size not defined
    152  1.1.2.2  fvdl #endif
    153  1.1.2.2  fvdl 
    154  1.1.2.2  fvdl /*
    155  1.1.2.2  fvdl  * These are just zero and non-zero. We don't use "TRUE"
    156  1.1.2.2  fvdl  * and "FALSE" because there's too much nonsense trying
    157  1.1.2.2  fvdl  * to get them defined exactly once on every platform, given
    158  1.1.2.2  fvdl  * the different places they may be defined in system header
    159  1.1.2.2  fvdl  * files.
    160  1.1.2.2  fvdl  */
    161  1.1.2.2  fvdl #define RF_TRUE  1
    162  1.1.2.2  fvdl #define RF_FALSE 0
    163  1.1.2.2  fvdl 
    164  1.1.2.2  fvdl /*
    165  1.1.2.2  fvdl  * Now, some generic types
    166  1.1.2.2  fvdl  */
    167  1.1.2.2  fvdl typedef RF_uint64 RF_IoCount_t;
    168  1.1.2.2  fvdl typedef RF_uint64 RF_Offset_t;
    169  1.1.2.2  fvdl typedef RF_uint32 RF_PSSFlags_t;
    170  1.1.2.2  fvdl typedef RF_uint64 RF_SectorCount_t;
    171  1.1.2.2  fvdl typedef RF_uint64 RF_StripeCount_t;
    172  1.1.2.2  fvdl typedef RF_int64 RF_SectorNum_t;/* these are unsigned so we can set them to
    173  1.1.2.2  fvdl 				 * (-1) for "uninitialized" */
    174  1.1.2.2  fvdl typedef RF_int64 RF_StripeNum_t;
    175  1.1.2.2  fvdl typedef RF_int64 RF_RaidAddr_t;
    176  1.1.2.2  fvdl typedef int RF_RowCol_t;	/* unsigned so it can be (-1) */
    177  1.1.2.2  fvdl typedef RF_int64 RF_HeadSepLimit_t;
    178  1.1.2.2  fvdl typedef RF_int64 RF_ReconUnitCount_t;
    179  1.1.2.2  fvdl typedef int RF_ReconUnitNum_t;
    180  1.1.2.2  fvdl 
    181  1.1.2.2  fvdl typedef char RF_ParityConfig_t;
    182  1.1.2.2  fvdl 
    183  1.1.2.2  fvdl typedef char RF_DiskQueueType_t[1024];
    184  1.1.2.2  fvdl #define RF_DISK_QUEUE_TYPE_NONE ""
    185  1.1.2.2  fvdl 
    186  1.1.2.2  fvdl /* values for the 'type' field in a reconstruction buffer */
    187  1.1.2.2  fvdl typedef int RF_RbufType_t;
    188  1.1.2.2  fvdl #define RF_RBUF_TYPE_EXCLUSIVE   0	/* this buf assigned exclusively to
    189  1.1.2.2  fvdl 					 * one disk */
    190  1.1.2.2  fvdl #define RF_RBUF_TYPE_FLOATING    1	/* this is a floating recon buf */
    191  1.1.2.2  fvdl #define RF_RBUF_TYPE_FORCED      2	/* this rbuf was allocated to complete
    192  1.1.2.2  fvdl 					 * a forced recon */
    193  1.1.2.2  fvdl 
    194  1.1.2.2  fvdl typedef char RF_IoType_t;
    195  1.1.2.2  fvdl #define RF_IO_TYPE_READ          'r'
    196  1.1.2.2  fvdl #define RF_IO_TYPE_WRITE         'w'
    197  1.1.2.2  fvdl #define RF_IO_TYPE_NOP           'n'
    198  1.1.2.2  fvdl #define RF_IO_IS_R_OR_W(_type_) (((_type_) == RF_IO_TYPE_READ) \
    199  1.1.2.2  fvdl                                 || ((_type_) == RF_IO_TYPE_WRITE))
    200  1.1.2.2  fvdl 
    201  1.1.2.2  fvdl typedef void (*RF_VoidFuncPtr) (void *,...);
    202  1.1.2.2  fvdl 
    203  1.1.2.2  fvdl typedef RF_uint32 RF_AccessStripeMapFlags_t;
    204  1.1.2.2  fvdl typedef RF_uint32 RF_DiskQueueDataFlags_t;
    205  1.1.2.2  fvdl typedef RF_uint32 RF_DiskQueueFlags_t;
    206  1.1.2.2  fvdl typedef RF_uint32 RF_RaidAccessFlags_t;
    207  1.1.2.2  fvdl 
    208  1.1.2.2  fvdl #define RF_DISKQUEUE_DATA_FLAGS_NONE ((RF_DiskQueueDataFlags_t)0)
    209  1.1.2.2  fvdl 
    210  1.1.2.2  fvdl typedef struct RF_AccessStripeMap_s RF_AccessStripeMap_t;
    211  1.1.2.2  fvdl typedef struct RF_AccessStripeMapHeader_s RF_AccessStripeMapHeader_t;
    212  1.1.2.2  fvdl typedef struct RF_AllocListElem_s RF_AllocListElem_t;
    213  1.1.2.2  fvdl typedef struct RF_CallbackDesc_s RF_CallbackDesc_t;
    214  1.1.2.2  fvdl typedef struct RF_ChunkDesc_s RF_ChunkDesc_t;
    215  1.1.2.2  fvdl typedef struct RF_CommonLogData_s RF_CommonLogData_t;
    216  1.1.2.2  fvdl typedef struct RF_Config_s RF_Config_t;
    217  1.1.2.2  fvdl typedef struct RF_CumulativeStats_s RF_CumulativeStats_t;
    218  1.1.2.2  fvdl typedef struct RF_DagHeader_s RF_DagHeader_t;
    219  1.1.2.2  fvdl typedef struct RF_DagList_s RF_DagList_t;
    220  1.1.2.2  fvdl typedef struct RF_DagNode_s RF_DagNode_t;
    221  1.1.2.2  fvdl typedef struct RF_DeclusteredConfigInfo_s RF_DeclusteredConfigInfo_t;
    222  1.1.2.2  fvdl typedef struct RF_DiskId_s RF_DiskId_t;
    223  1.1.2.2  fvdl typedef struct RF_DiskMap_s RF_DiskMap_t;
    224  1.1.2.2  fvdl typedef struct RF_DiskQueue_s RF_DiskQueue_t;
    225  1.1.2.2  fvdl typedef struct RF_DiskQueueData_s RF_DiskQueueData_t;
    226  1.1.2.2  fvdl typedef struct RF_DiskQueueSW_s RF_DiskQueueSW_t;
    227  1.1.2.2  fvdl typedef struct RF_Etimer_s RF_Etimer_t;
    228  1.1.2.2  fvdl typedef struct RF_EventCreate_s RF_EventCreate_t;
    229  1.1.2.2  fvdl typedef struct RF_FreeList_s RF_FreeList_t;
    230  1.1.2.2  fvdl typedef struct RF_LockReqDesc_s RF_LockReqDesc_t;
    231  1.1.2.2  fvdl typedef struct RF_LockTableEntry_s RF_LockTableEntry_t;
    232  1.1.2.2  fvdl typedef struct RF_MCPair_s RF_MCPair_t;
    233  1.1.2.2  fvdl typedef struct RF_OwnerInfo_s RF_OwnerInfo_t;
    234  1.1.2.2  fvdl typedef struct RF_ParityLog_s RF_ParityLog_t;
    235  1.1.2.2  fvdl typedef struct RF_ParityLogAppendQueue_s RF_ParityLogAppendQueue_t;
    236  1.1.2.2  fvdl typedef struct RF_ParityLogData_s RF_ParityLogData_t;
    237  1.1.2.2  fvdl typedef struct RF_ParityLogDiskQueue_s RF_ParityLogDiskQueue_t;
    238  1.1.2.2  fvdl typedef struct RF_ParityLogQueue_s RF_ParityLogQueue_t;
    239  1.1.2.2  fvdl typedef struct RF_ParityLogRecord_s RF_ParityLogRecord_t;
    240  1.1.2.2  fvdl typedef struct RF_PerDiskReconCtrl_s RF_PerDiskReconCtrl_t;
    241  1.1.2.2  fvdl typedef struct RF_PSStatusHeader_s RF_PSStatusHeader_t;
    242  1.1.2.2  fvdl typedef struct RF_PhysDiskAddr_s RF_PhysDiskAddr_t;
    243  1.1.2.2  fvdl typedef struct RF_PropHeader_s RF_PropHeader_t;
    244  1.1.2.2  fvdl typedef struct RF_Raid_s RF_Raid_t;
    245  1.1.2.2  fvdl typedef struct RF_RaidAccessDesc_s RF_RaidAccessDesc_t;
    246  1.1.2.2  fvdl typedef struct RF_RaidDisk_s RF_RaidDisk_t;
    247  1.1.2.2  fvdl typedef struct RF_RaidLayout_s RF_RaidLayout_t;
    248  1.1.2.2  fvdl typedef struct RF_RaidReconDesc_s RF_RaidReconDesc_t;
    249  1.1.2.2  fvdl typedef struct RF_ReconBuffer_s RF_ReconBuffer_t;
    250  1.1.2.2  fvdl typedef struct RF_ReconConfig_s RF_ReconConfig_t;
    251  1.1.2.2  fvdl typedef struct RF_ReconCtrl_s RF_ReconCtrl_t;
    252  1.1.2.2  fvdl typedef struct RF_ReconDoneProc_s RF_ReconDoneProc_t;
    253  1.1.2.2  fvdl typedef struct RF_ReconEvent_s RF_ReconEvent_t;
    254  1.1.2.2  fvdl typedef struct RF_ReconMap_s RF_ReconMap_t;
    255  1.1.2.2  fvdl typedef struct RF_ReconMapListElem_s RF_ReconMapListElem_t;
    256  1.1.2.2  fvdl typedef struct RF_ReconParityStripeStatus_s RF_ReconParityStripeStatus_t;
    257  1.1.2.2  fvdl typedef struct RF_RedFuncs_s RF_RedFuncs_t;
    258  1.1.2.2  fvdl typedef struct RF_RegionBufferQueue_s RF_RegionBufferQueue_t;
    259  1.1.2.2  fvdl typedef struct RF_RegionInfo_s RF_RegionInfo_t;
    260  1.1.2.2  fvdl typedef struct RF_ShutdownList_s RF_ShutdownList_t;
    261  1.1.2.2  fvdl typedef struct RF_SpareTableEntry_s RF_SpareTableEntry_t;
    262  1.1.2.2  fvdl typedef struct RF_SparetWait_s RF_SparetWait_t;
    263  1.1.2.2  fvdl typedef struct RF_StripeLockDesc_s RF_StripeLockDesc_t;
    264  1.1.2.2  fvdl typedef struct RF_ThreadGroup_s RF_ThreadGroup_t;
    265  1.1.2.2  fvdl typedef struct RF_ThroughputStats_s RF_ThroughputStats_t;
    266  1.1.2.2  fvdl 
    267  1.1.2.2  fvdl /*
    268  1.1.2.2  fvdl  * Important assumptions regarding ordering of the states in this list
    269  1.1.2.2  fvdl  * have been made!!!  Before disturbing this ordering, look at code in
    270  1.1.2.2  fvdl  * sys/dev/raidframe/rf_states.c
    271  1.1.2.2  fvdl  */
    272  1.1.2.2  fvdl typedef enum RF_AccessState_e {
    273  1.1.2.2  fvdl 	/* original states */
    274  1.1.2.2  fvdl 	rf_QuiesceState,	    /* handles queisence for reconstruction */
    275  1.1.2.2  fvdl 	rf_IncrAccessesCountState,  /* count accesses in flight */
    276  1.1.2.2  fvdl 	rf_DecrAccessesCountState,
    277  1.1.2.2  fvdl 	rf_MapState,		    /* map access to disk addresses */
    278  1.1.2.2  fvdl 	rf_LockState,		    /* take stripe locks */
    279  1.1.2.2  fvdl 	rf_CreateDAGState,	    /* create DAGs */
    280  1.1.2.2  fvdl 	rf_ExecuteDAGState,	    /* execute DAGs */
    281  1.1.2.2  fvdl 	rf_ProcessDAGState,	    /* DAGs are completing- check if correct,
    282  1.1.2.2  fvdl 				     * or if we need to retry */
    283  1.1.2.2  fvdl 	rf_CleanupState,	    /* release stripe locks, clean up */
    284  1.1.2.2  fvdl 	rf_LastState		    /* must be the last state */
    285  1.1.2.2  fvdl }       RF_AccessState_t;
    286  1.1.2.2  fvdl 
    287  1.1.2.2  fvdl 
    288  1.1.2.2  fvdl /* Some constants related to RAIDframe.  These are arbitrary and
    289  1.1.2.2  fvdl    can be modified at will. */
    290  1.1.2.2  fvdl 
    291  1.1.2.2  fvdl #define RF_MAXROW    10
    292  1.1.2.2  fvdl #define RF_MAXCOL    40
    293  1.1.2.2  fvdl #define RF_MAXSPARE  10
    294  1.1.2.2  fvdl #define RF_MAXDBGV   75		    /* max number of debug variables */
    295  1.1.2.2  fvdl #define RF_MAX_DISKS 128	    /* max disks per array */
    296  1.1.2.2  fvdl #define RF_SPAREMAP_NAME_LEN 128
    297  1.1.2.2  fvdl #define RF_PROTECTED_SECTORS 64L    /* # of sectors at start of disk to
    298  1.1.2.2  fvdl 				       exclude from RAID address space */
    299  1.1.2.2  fvdl 
    300  1.1.2.2  fvdl struct RF_SpareTableEntry_s {
    301  1.1.2.2  fvdl         u_int   spareDisk;          /* disk to which this block is spared */
    302  1.1.2.2  fvdl         u_int   spareBlockOffsetInSUs;  /* offset into spare table for that
    303  1.1.2.2  fvdl                                          * disk */
    304  1.1.2.2  fvdl };
    305  1.1.2.2  fvdl 
    306  1.1.2.2  fvdl union RF_GenericParam_u {
    307  1.1.2.2  fvdl 	void   *p;
    308  1.1.2.2  fvdl 	RF_uint64 v;
    309  1.1.2.2  fvdl };
    310  1.1.2.2  fvdl typedef union RF_GenericParam_u RF_DagParam_t;
    311  1.1.2.2  fvdl typedef union RF_GenericParam_u RF_CBParam_t;
    312  1.1.2.2  fvdl 
    313  1.1.2.2  fvdl /* the raidframe configuration, passed down through an ioctl.
    314  1.1.2.2  fvdl  * the driver can be reconfigured (with total loss of data) at any time,
    315  1.1.2.2  fvdl  * but it must be shut down first.
    316  1.1.2.2  fvdl  */
    317  1.1.2.2  fvdl struct RF_Config_s {
    318  1.1.2.2  fvdl 	RF_RowCol_t numRow, numCol, numSpare;	/* number of rows, columns,
    319  1.1.2.2  fvdl 						 * and spare disks */
    320  1.1.2.2  fvdl 	dev_t   devs[RF_MAXROW][RF_MAXCOL];	/* device numbers for disks
    321  1.1.2.2  fvdl 						 * comprising array */
    322  1.1.2.2  fvdl 	char    devnames[RF_MAXROW][RF_MAXCOL][50];	/* device names */
    323  1.1.2.2  fvdl 	dev_t   spare_devs[RF_MAXSPARE];	/* device numbers for spare
    324  1.1.2.2  fvdl 						 * disks */
    325  1.1.2.2  fvdl 	char    spare_names[RF_MAXSPARE][50];	/* device names */
    326  1.1.2.2  fvdl 	RF_SectorNum_t sectPerSU;	/* sectors per stripe unit */
    327  1.1.2.2  fvdl 	RF_StripeNum_t SUsPerPU;/* stripe units per parity unit */
    328  1.1.2.2  fvdl 	RF_StripeNum_t SUsPerRU;/* stripe units per reconstruction unit */
    329  1.1.2.2  fvdl 	RF_ParityConfig_t parityConfig;	/* identifies the RAID architecture to
    330  1.1.2.2  fvdl 					 * be used */
    331  1.1.2.2  fvdl 	RF_DiskQueueType_t diskQueueType;	/* 'f' = fifo, 'c' = cvscan,
    332  1.1.2.2  fvdl 						 * not used in kernel */
    333  1.1.2.2  fvdl 	char    maxOutstandingDiskReqs;	/* # concurrent reqs to be sent to a
    334  1.1.2.2  fvdl 					 * disk.  not used in kernel. */
    335  1.1.2.2  fvdl 	char    debugVars[RF_MAXDBGV][50];	/* space for specifying debug
    336  1.1.2.2  fvdl 						 * variables & their values */
    337  1.1.2.2  fvdl 	unsigned int layoutSpecificSize;	/* size in bytes of
    338  1.1.2.2  fvdl 						 * layout-specific info */
    339  1.1.2.2  fvdl 	void   *layoutSpecific;	/* a pointer to a layout-specific structure to
    340  1.1.2.2  fvdl 				 * be copied in */
    341  1.1.2.2  fvdl 	int     force;                          /* if !0, ignore many fatal
    342  1.1.2.2  fvdl 						   configuration conditions */
    343  1.1.2.2  fvdl 	/*
    344  1.1.2.2  fvdl 	   "force" is used to override cases where the component labels would
    345  1.1.2.2  fvdl 	   indicate that configuration should not proceed without user
    346  1.1.2.2  fvdl 	   intervention
    347  1.1.2.2  fvdl 	 */
    348  1.1.2.2  fvdl };
    349  1.1.2.2  fvdl 
    350  1.1.2.2  fvdl typedef RF_uint32 RF_ReconReqFlags_t;
    351  1.1.2.2  fvdl /* flags that can be put in the rf_recon_req structure */
    352  1.1.2.2  fvdl #define RF_FDFLAGS_NONE   0x0	/* just fail the disk */
    353  1.1.2.2  fvdl #define RF_FDFLAGS_RECON  0x1	/* fail and initiate recon */
    354  1.1.2.2  fvdl 
    355  1.1.2.2  fvdl struct rf_recon_req {		/* used to tell the kernel to fail a disk */
    356  1.1.2.2  fvdl 	RF_RowCol_t row, col;
    357  1.1.2.2  fvdl 	RF_ReconReqFlags_t flags;
    358  1.1.2.2  fvdl 	void   *raidPtr;	/* used internally; need not be set at ioctl
    359  1.1.2.2  fvdl 				 * time */
    360  1.1.2.2  fvdl 	struct rf_recon_req *next;	/* used internally; need not be set at
    361  1.1.2.2  fvdl 					 * ioctl time */
    362  1.1.2.2  fvdl };
    363  1.1.2.2  fvdl 
    364  1.1.2.2  fvdl struct RF_SparetWait_s {
    365  1.1.2.2  fvdl 	int     C, G, fcol;	/* C = # disks in row, G = # units in stripe,
    366  1.1.2.2  fvdl 				 * fcol = which disk has failed */
    367  1.1.2.2  fvdl 
    368  1.1.2.2  fvdl 	RF_StripeCount_t SUsPerPU;	/* this stuff is the info required to
    369  1.1.2.2  fvdl 					 * create a spare table */
    370  1.1.2.2  fvdl 	int     TablesPerSpareRegion;
    371  1.1.2.2  fvdl 	int     BlocksPerTable;
    372  1.1.2.2  fvdl 	RF_StripeCount_t TableDepthInPUs;
    373  1.1.2.2  fvdl 	RF_StripeCount_t SpareSpaceDepthPerRegionInSUs;
    374  1.1.2.2  fvdl 
    375  1.1.2.2  fvdl 	RF_SparetWait_t *next;	/* used internally; need not be set at ioctl
    376  1.1.2.2  fvdl 				 * time */
    377  1.1.2.2  fvdl };
    378  1.1.2.2  fvdl /*
    379  1.1.2.2  fvdl  * A physical disk can be in one of several states:
    380  1.1.2.2  fvdl  * IF YOU ADD A STATE, CHECK TO SEE IF YOU NEED TO MODIFY RF_DEAD_DISK().
    381  1.1.2.2  fvdl  */
    382  1.1.2.2  fvdl enum RF_DiskStatus_e {
    383  1.1.2.2  fvdl         rf_ds_optimal,          /* no problems */
    384  1.1.2.2  fvdl         rf_ds_failed,           /* reconstruction ongoing */
    385  1.1.2.2  fvdl         rf_ds_reconstructing,   /* reconstruction complete to spare, dead disk
    386  1.1.2.2  fvdl                                  * not yet replaced */
    387  1.1.2.2  fvdl         rf_ds_dist_spared,      /* reconstruction complete to distributed
    388  1.1.2.2  fvdl                                  * spare space, dead disk not yet replaced */
    389  1.1.2.2  fvdl         rf_ds_spared,           /* reconstruction complete to distributed
    390  1.1.2.2  fvdl                                  * spare space, dead disk not yet replaced */
    391  1.1.2.2  fvdl         rf_ds_spare,            /* an available spare disk */
    392  1.1.2.2  fvdl         rf_ds_used_spare        /* a spare which has been used, and hence is
    393  1.1.2.2  fvdl                                  * not available */
    394  1.1.2.2  fvdl };
    395  1.1.2.2  fvdl typedef enum RF_DiskStatus_e RF_DiskStatus_t;
    396  1.1.2.2  fvdl 
    397  1.1.2.2  fvdl struct RF_RaidDisk_s {
    398  1.1.2.2  fvdl         char    devname[56];    /* name of device file */
    399  1.1.2.2  fvdl         RF_DiskStatus_t status; /* whether it is up or down */
    400  1.1.2.2  fvdl         RF_RowCol_t spareRow;   /* if in status "spared", this identifies the
    401  1.1.2.2  fvdl                                  * spare disk */
    402  1.1.2.2  fvdl         RF_RowCol_t spareCol;   /* if in status "spared", this identifies the
    403  1.1.2.2  fvdl                                  * spare disk */
    404  1.1.2.2  fvdl         RF_SectorCount_t numBlocks;     /* number of blocks, obtained via READ
    405  1.1.2.2  fvdl                                          * CAPACITY */
    406  1.1.2.2  fvdl         int     blockSize;
    407  1.1.2.2  fvdl         RF_SectorCount_t partitionSize; /* The *actual* and *full* size of
    408  1.1.2.2  fvdl                                            the partition, from the disklabel */
    409  1.1.2.2  fvdl         int     auto_configured;/* 1 if this component was autoconfigured.
    410  1.1.2.2  fvdl                                    0 otherwise. */
    411  1.1.2.2  fvdl         dev_t   dev;
    412  1.1.2.2  fvdl };
    413  1.1.2.2  fvdl /* The per-component label information that the user can set */
    414  1.1.2.2  fvdl typedef struct RF_ComponentInfo_s {
    415  1.1.2.2  fvdl 	int row;              /* the row number of this component */
    416  1.1.2.2  fvdl 	int column;           /* the column number of this component */
    417  1.1.2.2  fvdl 	int serial_number;    /* a user-specified serial number for this
    418  1.1.2.2  fvdl 				 RAID set */
    419  1.1.2.2  fvdl } RF_ComponentInfo_t;
    420  1.1.2.2  fvdl 
    421  1.1.2.2  fvdl /* The per-component label information */
    422  1.1.2.2  fvdl typedef struct RF_ComponentLabel_s {
    423  1.1.2.2  fvdl 	int version;          /* The version of this label. */
    424  1.1.2.2  fvdl 	int serial_number;    /* a user-specified serial number for this
    425  1.1.2.2  fvdl 				 RAID set */
    426  1.1.2.2  fvdl 	int mod_counter;      /* modification counter.  Changed (usually
    427  1.1.2.2  fvdl 				 by incrementing) every time the label
    428  1.1.2.2  fvdl 				 is changed */
    429  1.1.2.2  fvdl 	int row;              /* the row number of this component */
    430  1.1.2.2  fvdl 	int column;           /* the column number of this component */
    431  1.1.2.2  fvdl 	int num_rows;         /* number of rows in this RAID set */
    432  1.1.2.2  fvdl 	int num_columns;      /* number of columns in this RAID set */
    433  1.1.2.2  fvdl 	int clean;            /* 1 when clean, 0 when dirty */
    434  1.1.2.2  fvdl 	int status;           /* rf_ds_optimal, rf_ds_dist_spared, whatever. */
    435  1.1.2.2  fvdl 	/* stuff that will be in version 2 of the label */
    436  1.1.2.2  fvdl 	int sectPerSU;        /* Sectors per Stripe Unit */
    437  1.1.2.2  fvdl 	int SUsPerPU;         /* Stripe Units per Parity Units */
    438  1.1.2.2  fvdl 	int SUsPerRU;         /* Stripe Units per Reconstruction Units */
    439  1.1.2.2  fvdl 	int parityConfig;     /* '0' == RAID0, '1' == RAID1, etc. */
    440  1.1.2.2  fvdl 	int maxOutstanding;   /* maxOutstanding disk requests */
    441  1.1.2.2  fvdl 	int blockSize;        /* size of component block.
    442  1.1.2.2  fvdl 				 (disklabel->d_secsize) */
    443  1.1.2.2  fvdl 	int numBlocks;        /* number of blocks on this component.  May
    444  1.1.2.2  fvdl 			         be smaller than the partition size. */
    445  1.1.2.2  fvdl 	int partitionSize;    /* number of blocks on this *partition*.
    446  1.1.2.2  fvdl 				 Must exactly match the partition size
    447  1.1.2.2  fvdl 				 from the disklabel. */
    448  1.1.2.2  fvdl 	int future_use[33];   /* Future expansion */
    449  1.1.2.2  fvdl 	int autoconfigure;    /* automatically configure this RAID set.
    450  1.1.2.2  fvdl 				 0 == no, 1 == yes */
    451  1.1.2.2  fvdl 	int root_partition;   /* Use this set as /
    452  1.1.2.2  fvdl 				 0 == no, 1 == yes*/
    453  1.1.2.2  fvdl 	int last_unit;        /* last unit number (e.g. 0 for /dev/raid0)
    454  1.1.2.2  fvdl 				 of this component.  Used for autoconfigure
    455  1.1.2.2  fvdl 				 only. */
    456  1.1.2.2  fvdl 	int config_order;     /* 0 .. n.  The order in which the component
    457  1.1.2.2  fvdl 				 should be auto-configured.  E.g. 0 is will
    458  1.1.2.2  fvdl 				 done first, (and would become raid0).
    459  1.1.2.2  fvdl 				 This may be in conflict with last_unit!!?! */
    460  1.1.2.2  fvdl 	                      /* Not currently used. */
    461  1.1.2.2  fvdl 	int future_use2[44];  /* More future expansion */
    462  1.1.2.2  fvdl } RF_ComponentLabel_t;
    463  1.1.2.2  fvdl 
    464  1.1.2.2  fvdl typedef struct RF_SingleComponent_s {
    465  1.1.2.2  fvdl 	int row;
    466  1.1.2.2  fvdl 	int column;
    467  1.1.2.2  fvdl 	char component_name[50]; /* name of the component */
    468  1.1.2.2  fvdl } RF_SingleComponent_t;
    469  1.1.2.2  fvdl 
    470  1.1.2.2  fvdl typedef struct RF_DeviceConfig_s {
    471  1.1.2.2  fvdl 	u_int   rows;
    472  1.1.2.2  fvdl 	u_int   cols;
    473  1.1.2.2  fvdl 	u_int   maxqdepth;
    474  1.1.2.2  fvdl 	int     ndevs;
    475  1.1.2.2  fvdl 	RF_RaidDisk_t devs[RF_MAX_DISKS];
    476  1.1.2.2  fvdl 	int     nspares;
    477  1.1.2.2  fvdl 	RF_RaidDisk_t spares[RF_MAX_DISKS];
    478  1.1.2.2  fvdl }       RF_DeviceConfig_t;
    479  1.1.2.2  fvdl 
    480  1.1.2.2  fvdl typedef struct RF_ProgressInfo_s {
    481  1.1.2.2  fvdl 	RF_uint64 remaining;
    482  1.1.2.2  fvdl 	RF_uint64 completed;
    483  1.1.2.2  fvdl 	RF_uint64 total;
    484  1.1.2.2  fvdl } RF_ProgressInfo_t;
    485  1.1.2.2  fvdl 
    486  1.1.2.2  fvdl typedef struct RF_LayoutSW_s {
    487  1.1.2.2  fvdl 	RF_ParityConfig_t parityConfig;
    488  1.1.2.2  fvdl 	const char *configName;
    489  1.1.2.2  fvdl 
    490  1.1.2.2  fvdl #ifndef _KERNEL
    491  1.1.2.2  fvdl 	/* layout-specific parsing */
    492  1.1.2.2  fvdl 	int     (*MakeLayoutSpecific) (FILE * fp, RF_Config_t * cfgPtr,
    493  1.1.2.2  fvdl 				       void *arg);
    494  1.1.2.2  fvdl 	void   *makeLayoutSpecificArg;
    495  1.1.2.2  fvdl #else				/* !KERNEL */
    496  1.1.2.2  fvdl 
    497  1.1.2.2  fvdl 	/* initialization routine */
    498  1.1.2.2  fvdl 	int     (*Configure) (RF_ShutdownList_t ** shutdownListp,
    499  1.1.2.2  fvdl 			      RF_Raid_t * raidPtr, RF_Config_t * cfgPtr);
    500  1.1.2.2  fvdl 
    501  1.1.2.2  fvdl 	/* routine to map RAID sector address -> physical (row, col, offset) */
    502  1.1.2.2  fvdl 	void    (*MapSector) (RF_Raid_t * raidPtr, RF_RaidAddr_t raidSector,
    503  1.1.2.2  fvdl 			      RF_RowCol_t * row, RF_RowCol_t * col,
    504  1.1.2.2  fvdl 			      RF_SectorNum_t * diskSector, int remap);
    505  1.1.2.2  fvdl 
    506  1.1.2.2  fvdl 	/* routine to map RAID sector address -> physical (r,c,o) of parity
    507  1.1.2.2  fvdl 	 * unit */
    508  1.1.2.2  fvdl 	void    (*MapParity) (RF_Raid_t * raidPtr, RF_RaidAddr_t raidSector,
    509  1.1.2.2  fvdl 			      RF_RowCol_t * row, RF_RowCol_t * col,
    510  1.1.2.2  fvdl 			      RF_SectorNum_t * diskSector, int remap);
    511  1.1.2.2  fvdl 
    512  1.1.2.2  fvdl 	/* routine to map RAID sector address -> physical (r,c,o) of Q unit */
    513  1.1.2.2  fvdl 	void    (*MapQ) (RF_Raid_t * raidPtr, RF_RaidAddr_t raidSector,
    514  1.1.2.2  fvdl 			 RF_RowCol_t * row, RF_RowCol_t * col,
    515  1.1.2.2  fvdl 			 RF_SectorNum_t * diskSector, int remap);
    516  1.1.2.2  fvdl 
    517  1.1.2.2  fvdl 	/* routine to identify the disks comprising a stripe */
    518  1.1.2.2  fvdl 	void    (*IdentifyStripe) (RF_Raid_t * raidPtr, RF_RaidAddr_t addr,
    519  1.1.2.2  fvdl 				   RF_RowCol_t ** diskids,
    520  1.1.2.2  fvdl 				   RF_RowCol_t * outRow);
    521  1.1.2.2  fvdl 
    522  1.1.2.2  fvdl 	/* routine to select a dag */
    523  1.1.2.2  fvdl 	void    (*SelectionFunc) (RF_Raid_t * raidPtr, RF_IoType_t type,
    524  1.1.2.2  fvdl 				  RF_AccessStripeMap_t * asmap,
    525  1.1.2.2  fvdl 				  RF_VoidFuncPtr *);
    526  1.1.2.2  fvdl 
    527  1.1.2.2  fvdl 	/* map a stripe ID to a parity stripe ID.  This is typically the
    528  1.1.2.2  fvdl 	 * identity mapping */
    529  1.1.2.2  fvdl 	void    (*MapSIDToPSID) (RF_RaidLayout_t * layoutPtr,
    530  1.1.2.2  fvdl 				 RF_StripeNum_t stripeID,
    531  1.1.2.2  fvdl 				 RF_StripeNum_t * psID,
    532  1.1.2.2  fvdl 				 RF_ReconUnitNum_t * which_ru);
    533  1.1.2.2  fvdl 
    534  1.1.2.2  fvdl 	/* get default head separation limit (may be NULL) */
    535  1.1.2.2  fvdl 	RF_HeadSepLimit_t(*GetDefaultHeadSepLimit) (RF_Raid_t * raidPtr);
    536  1.1.2.2  fvdl 
    537  1.1.2.2  fvdl 	/* get default num recon buffers (may be NULL) */
    538  1.1.2.2  fvdl 	int     (*GetDefaultNumFloatingReconBuffers) (RF_Raid_t * raidPtr);
    539  1.1.2.2  fvdl 
    540  1.1.2.2  fvdl 	/* get number of spare recon units (may be NULL) */
    541  1.1.2.2  fvdl 	RF_ReconUnitCount_t(*GetNumSpareRUs) (RF_Raid_t * raidPtr);
    542  1.1.2.2  fvdl 
    543  1.1.2.2  fvdl 	/* spare table installation (may be NULL) */
    544  1.1.2.2  fvdl 	int     (*InstallSpareTable) (RF_Raid_t * raidPtr, RF_RowCol_t frow,
    545  1.1.2.2  fvdl 				      RF_RowCol_t fcol);
    546  1.1.2.2  fvdl 
    547  1.1.2.2  fvdl 	/* recon buffer submission function */
    548  1.1.2.2  fvdl 	int     (*SubmitReconBuffer) (RF_ReconBuffer_t * rbuf, int keep_it,
    549  1.1.2.2  fvdl 				      int use_committed);
    550  1.1.2.2  fvdl 
    551  1.1.2.2  fvdl 	/*
    552  1.1.2.2  fvdl          * verify that parity information for a stripe is correct
    553  1.1.2.2  fvdl          * see rf_parityscan.h for return vals
    554  1.1.2.2  fvdl          */
    555  1.1.2.2  fvdl 	int     (*VerifyParity) (RF_Raid_t * raidPtr, RF_RaidAddr_t raidAddr,
    556  1.1.2.2  fvdl 				 RF_PhysDiskAddr_t * parityPDA,
    557  1.1.2.2  fvdl 				 int correct_it, RF_RaidAccessFlags_t flags);
    558  1.1.2.2  fvdl 
    559  1.1.2.2  fvdl 	/* number of faults tolerated by this mapping */
    560  1.1.2.2  fvdl 	int     faultsTolerated;
    561  1.1.2.2  fvdl 
    562  1.1.2.2  fvdl 	/* states to step through in an access. Must end with "LastState". The
    563  1.1.2.2  fvdl 	 * default is DefaultStates in rf_layout.c */
    564  1.1.2.2  fvdl 	RF_AccessState_t *states;
    565  1.1.2.2  fvdl 
    566  1.1.2.2  fvdl 	RF_AccessStripeMapFlags_t flags;
    567  1.1.2.2  fvdl #endif				/* !KERNEL */
    568  1.1.2.2  fvdl }       RF_LayoutSW_t;
    569  1.1.2.2  fvdl 
    570  1.1.2.2  fvdl #endif				/* !_RF_RAIDFRAMEVAR_H_ */
    571