1 1.13 christos /* $NetBSD: rf_paritylog.h,v 1.13 2019/10/10 03:43:59 christos 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: William V. Courtright II 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 /* header file for parity log 30 1.1 oster * 31 1.1 oster */ 32 1.1 oster 33 1.1 oster #ifndef _RF__RF_PARITYLOG_H_ 34 1.1 oster #define _RF__RF_PARITYLOG_H_ 35 1.1 oster 36 1.4 oster #include <dev/raidframe/raidframevar.h> 37 1.1 oster 38 1.1 oster #define RF_DEFAULT_NUM_SECTORS_PER_LOG 64 39 1.1 oster 40 1.1 oster typedef int RF_RegionId_t; 41 1.1 oster 42 1.1 oster typedef enum RF_ParityRecordType_e { 43 1.3 oster RF_STOP, 44 1.3 oster RF_UPDATE, 45 1.3 oster RF_OVERWRITE 46 1.3 oster } RF_ParityRecordType_t; 47 1.1 oster 48 1.1 oster struct RF_CommonLogData_s { 49 1.6 mrg rf_declare_mutex2(mutex); /* protects cnt */ 50 1.6 mrg int cnt; /* when 0, time to call wakeFunc */ 51 1.3 oster RF_Raid_t *raidPtr; 52 1.13 christos void (*wakeFunc) (void *, int); 53 1.3 oster void *wakeArg; 54 1.3 oster RF_AccTraceEntry_t *tracerec; 55 1.3 oster RF_Etimer_t startTime; 56 1.5 christos void *bufPtr; 57 1.3 oster RF_ParityRecordType_t operation; 58 1.3 oster RF_CommonLogData_t *next; 59 1.1 oster }; 60 1.1 oster 61 1.1 oster struct RF_ParityLogData_s { 62 1.3 oster RF_RegionId_t regionID; /* this struct guaranteed to span a single 63 1.3 oster * region */ 64 1.3 oster int bufOffset; /* offset from common->bufPtr */ 65 1.3 oster RF_PhysDiskAddr_t diskAddress; 66 1.3 oster RF_CommonLogData_t *common; /* info shared by one or more 67 1.3 oster * parityLogData structs */ 68 1.3 oster RF_ParityLogData_t *next; 69 1.3 oster RF_ParityLogData_t *prev; 70 1.1 oster }; 71 1.1 oster 72 1.1 oster struct RF_ParityLogAppendQueue_s { 73 1.12 mrg rf_declare_mutex2(mutex); 74 1.1 oster }; 75 1.1 oster 76 1.1 oster struct RF_ParityLogRecord_s { 77 1.3 oster RF_PhysDiskAddr_t parityAddr; 78 1.3 oster RF_ParityRecordType_t operation; 79 1.1 oster }; 80 1.1 oster 81 1.1 oster struct RF_ParityLog_s { 82 1.3 oster RF_RegionId_t regionID; 83 1.3 oster int numRecords; 84 1.3 oster int diskOffset; 85 1.3 oster RF_ParityLogRecord_t *records; 86 1.5 christos void *bufPtr; 87 1.3 oster RF_ParityLog_t *next; 88 1.1 oster }; 89 1.1 oster 90 1.1 oster struct RF_ParityLogQueue_s { 91 1.10 mrg rf_declare_mutex2(mutex); 92 1.3 oster RF_ParityLog_t *parityLogs; 93 1.1 oster }; 94 1.1 oster 95 1.1 oster struct RF_RegionBufferQueue_s { 96 1.11 mrg rf_declare_mutex2(mutex); 97 1.11 mrg rf_declare_cond2(cond); 98 1.3 oster int bufferSize; 99 1.3 oster int totalBuffers; /* size of array 'buffers' */ 100 1.3 oster int availableBuffers; /* num available 'buffers' */ 101 1.3 oster int emptyBuffersIndex; /* stick next freed buffer here */ 102 1.3 oster int availBuffersIndex; /* grab next buffer from here */ 103 1.5 christos void **buffers; /* array buffers used to hold parity */ 104 1.3 oster }; 105 1.3 oster #define RF_PLOG_CREATED (1<<0)/* thread is created */ 106 1.3 oster #define RF_PLOG_RUNNING (1<<1)/* thread is running */ 107 1.3 oster #define RF_PLOG_TERMINATE (1<<2)/* thread is terminated (should exit) */ 108 1.3 oster #define RF_PLOG_SHUTDOWN (1<<3)/* thread is aware and exiting/exited */ 109 1.1 oster 110 1.1 oster struct RF_ParityLogDiskQueue_s { 111 1.7 mrg rf_declare_mutex2(mutex);/* protects all vars in this struct */ 112 1.7 mrg rf_declare_cond2(cond); 113 1.3 oster int threadState; /* is thread running, should it shutdown (see 114 1.3 oster * above) */ 115 1.3 oster RF_ParityLog_t *flushQueue; /* list of parity logs to be flushed 116 1.3 oster * to log disk */ 117 1.3 oster RF_ParityLog_t *reintQueue; /* list of parity logs waiting to be 118 1.3 oster * reintegrated */ 119 1.3 oster RF_ParityLogData_t *bufHead; /* head of FIFO list of log data, 120 1.3 oster * waiting on a buffer */ 121 1.3 oster RF_ParityLogData_t *bufTail; /* tail of FIFO list of log data, 122 1.3 oster * waiting on a buffer */ 123 1.3 oster RF_ParityLogData_t *reintHead; /* head of FIFO list of log data, 124 1.3 oster * waiting on reintegration */ 125 1.3 oster RF_ParityLogData_t *reintTail; /* tail of FIFO list of log data, 126 1.3 oster * waiting on reintegration */ 127 1.3 oster RF_ParityLogData_t *logBlockHead; /* queue of work, blocked 128 1.3 oster * until a log is available */ 129 1.3 oster RF_ParityLogData_t *logBlockTail; 130 1.3 oster RF_ParityLogData_t *reintBlockHead; /* queue of work, blocked 131 1.3 oster * until reintegration is 132 1.3 oster * complete */ 133 1.3 oster RF_ParityLogData_t *reintBlockTail; 134 1.3 oster RF_CommonLogData_t *freeCommonList; /* list of unused common data 135 1.3 oster * structs */ 136 1.3 oster RF_ParityLogData_t *freeDataList; /* list of unused log data 137 1.3 oster * structs */ 138 1.1 oster }; 139 1.1 oster 140 1.1 oster struct RF_DiskMap_s { 141 1.3 oster RF_PhysDiskAddr_t parityAddr; 142 1.3 oster RF_ParityRecordType_t operation; 143 1.1 oster }; 144 1.1 oster 145 1.1 oster struct RF_RegionInfo_s { 146 1.9 mrg rf_declare_mutex2(mutex); /* protects: diskCount, diskMap, 147 1.9 mrg * loggingEnabled, coreLog */ 148 1.8 mrg rf_declare_mutex2(reintMutex); /* protects: reintInProgress */ 149 1.3 oster int reintInProgress;/* flag used to suspend flushing operations */ 150 1.3 oster RF_SectorCount_t capacity; /* capacity of this region in sectors */ 151 1.3 oster RF_SectorNum_t regionStartAddr; /* starting disk address for this 152 1.3 oster * region */ 153 1.3 oster RF_SectorNum_t parityStartAddr; /* starting disk address for this 154 1.3 oster * region */ 155 1.3 oster RF_SectorCount_t numSectorsParity; /* number of parity sectors 156 1.3 oster * protected by this region */ 157 1.3 oster RF_SectorCount_t diskCount; /* num of sectors written to this 158 1.3 oster * region's disk log */ 159 1.3 oster RF_DiskMap_t *diskMap; /* in-core map of what's in this region's disk 160 1.3 oster * log */ 161 1.3 oster int loggingEnabled; /* logging enable for this region */ 162 1.3 oster RF_ParityLog_t *coreLog;/* in-core log for this region */ 163 1.3 oster }; 164 1.3 oster 165 1.3 oster RF_ParityLogData_t * 166 1.3 oster rf_CreateParityLogData(RF_ParityRecordType_t operation, 167 1.5 christos RF_PhysDiskAddr_t * pda, void *bufPtr, RF_Raid_t * raidPtr, 168 1.13 christos void (*wakeFunc) (void *, int), 169 1.3 oster void *wakeArg, RF_AccTraceEntry_t * tracerec, 170 1.3 oster RF_Etimer_t startTime); 171 1.3 oster RF_ParityLogData_t *rf_SearchAndDequeueParityLogData(RF_Raid_t * raidPtr, 172 1.3 oster RF_RegionId_t regionID, RF_ParityLogData_t ** head, 173 1.3 oster RF_ParityLogData_t ** tail, int ignoreLocks); 174 1.3 oster void rf_ReleaseParityLogs(RF_Raid_t * raidPtr, RF_ParityLog_t * firstLog); 175 1.3 oster int rf_ParityLogAppend(RF_ParityLogData_t * logData, int finish, 176 1.3 oster RF_ParityLog_t ** incomingLog, int clearReintFlag); 177 1.3 oster void rf_EnableParityLogging(RF_Raid_t * raidPtr); 178 1.1 oster 179 1.3 oster #endif /* !_RF__RF_PARITYLOG_H_ */ 180