1 /* $OpenBSD: rf_paritylog.h,v 1.3 2002/12/16 07:01:04 tdeval Exp $ */ 2 /* $NetBSD: rf_paritylog.h,v 1.3 1999/02/05 00:06:14 oster Exp $ */ 3 4 /* 5 * Copyright (c) 1995 Carnegie-Mellon University. 6 * All rights reserved. 7 * 8 * Author: William V. Courtright II 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 * Header file for parity log. 33 */ 34 35 #ifndef _RF__RF_PARITYLOG_H_ 36 #define _RF__RF_PARITYLOG_H_ 37 38 #include "rf_types.h" 39 40 #define RF_DEFAULT_NUM_SECTORS_PER_LOG 64 41 42 typedef int RF_RegionId_t; 43 44 typedef enum RF_ParityRecordType_e { 45 RF_STOP, 46 RF_UPDATE, 47 RF_OVERWRITE 48 } RF_ParityRecordType_t; 49 50 struct RF_CommonLogData_s { 51 RF_DECLARE_MUTEX(mutex); /* Protects cnt. */ 52 int cnt; /* When 0, time to call wakeFunc. */ 53 RF_Raid_t *raidPtr; 54 /* int (*wakeFunc) (struct buf *); */ 55 int (*wakeFunc) (RF_DagNode_t *, int); 56 void *wakeArg; 57 RF_AccTraceEntry_t *tracerec; 58 RF_Etimer_t startTime; 59 caddr_t bufPtr; 60 RF_ParityRecordType_t operation; 61 RF_CommonLogData_t *next; 62 }; 63 64 struct RF_ParityLogData_s { 65 RF_RegionId_t regionID; /* 66 * This struct guaranteed to 67 * span a single region. 68 */ 69 int bufOffset; /* 70 * Offset from common->bufPtr. 71 */ 72 RF_PhysDiskAddr_t diskAddress; 73 RF_CommonLogData_t *common; /* 74 * Info shared by one or more 75 * parityLogData structs. 76 */ 77 RF_ParityLogData_t *next; 78 RF_ParityLogData_t *prev; 79 }; 80 81 struct RF_ParityLogAppendQueue_s { 82 RF_DECLARE_MUTEX(mutex); 83 }; 84 85 struct RF_ParityLogRecord_s { 86 RF_PhysDiskAddr_t parityAddr; 87 RF_ParityRecordType_t operation; 88 }; 89 90 struct RF_ParityLog_s { 91 RF_RegionId_t regionID; 92 int numRecords; 93 int diskOffset; 94 RF_ParityLogRecord_t *records; 95 caddr_t bufPtr; 96 RF_ParityLog_t *next; 97 }; 98 99 struct RF_ParityLogQueue_s { 100 RF_DECLARE_MUTEX(mutex); 101 RF_ParityLog_t *parityLogs; 102 }; 103 104 struct RF_RegionBufferQueue_s { 105 RF_DECLARE_MUTEX(mutex); 106 RF_DECLARE_COND(cond); 107 int bufferSize; 108 int totalBuffers; /* Size of array 'buffers'. */ 109 int availableBuffers; /* Num available 'buffers'. */ 110 int emptyBuffersIndex; /* Stick next freed buffer here. */ 111 int availBuffersIndex; /* Grab next buffer from here. */ 112 caddr_t *buffers; /* Array buffers used to hold parity. */ 113 }; 114 #define RF_PLOG_CREATED (1<<0) /* Thread is created. */ 115 #define RF_PLOG_RUNNING (1<<1) /* Thread is running. */ 116 #define RF_PLOG_TERMINATE (1<<2) /* Thread is terminated (should exit).*/ 117 #define RF_PLOG_SHUTDOWN (1<<3) /* Thread is aware and exiting/exited.*/ 118 119 struct RF_ParityLogDiskQueue_s { 120 RF_DECLARE_MUTEX(mutex); /* Protects all vars in this struct. */ 121 RF_DECLARE_COND(cond); 122 int threadState; /* 123 * Is thread running, should it 124 * shutdown ? (see above) 125 */ 126 RF_ParityLog_t *flushQueue; /* 127 * List of parity logs to be 128 * flushed to log disk. 129 */ 130 RF_ParityLog_t *reintQueue; /* 131 * List of parity logs waiting 132 * to be reintegrated. 133 */ 134 RF_ParityLogData_t *bufHead; /* 135 * Head of FIFO list of log 136 * data, waiting on a buffer. 137 */ 138 RF_ParityLogData_t *bufTail; /* 139 * Tail of FIFO list of log 140 * data, waiting on a buffer. 141 */ 142 RF_ParityLogData_t *reintHead; /* 143 * Head of FIFO list of 144 * log data, waiting on 145 * reintegration. 146 */ 147 RF_ParityLogData_t *reintTail; /* 148 * Tail of FIFO list of 149 * log data, waiting on 150 * reintegration. 151 */ 152 RF_ParityLogData_t *logBlockHead; /* 153 * Queue of work, blocked 154 * until a log is available. 155 */ 156 RF_ParityLogData_t *logBlockTail; 157 RF_ParityLogData_t *reintBlockHead;/* 158 * Queue of work, blocked 159 * until reintegration is 160 * complete. 161 */ 162 RF_ParityLogData_t *reintBlockTail; 163 RF_CommonLogData_t *freeCommonList;/* 164 * List of unused common 165 * data structs. 166 */ 167 RF_ParityLogData_t *freeDataList; /* 168 * List of unused log 169 * data structs. 170 */ 171 }; 172 173 struct RF_DiskMap_s { 174 RF_PhysDiskAddr_t parityAddr; 175 RF_ParityRecordType_t operation; 176 }; 177 178 struct RF_RegionInfo_s { 179 RF_DECLARE_MUTEX(mutex); /* 180 * Protects: diskCount, diskMap, 181 * loggingEnabled, coreLog. 182 */ 183 RF_DECLARE_MUTEX(reintMutex); /* Protects: reintInProgress. */ 184 int reintInProgress; /* 185 * Flag used to suspend flushing 186 * operations. 187 */ 188 RF_SectorCount_t capacity; /* 189 * Capacity of this region 190 * in sectors. 191 */ 192 RF_SectorNum_t regionStartAddr; /* 193 * Starting disk address for 194 * this region. 195 */ 196 RF_SectorNum_t parityStartAddr; /* 197 * Starting disk address for 198 * this region. 199 */ 200 RF_SectorCount_t numSectorsParity; /* 201 * Number of parity sectors 202 * protected by this region. 203 */ 204 RF_SectorCount_t diskCount; /* 205 * Num of sectors written to 206 * this region's disk log. 207 */ 208 RF_DiskMap_t *diskMap; /* 209 * In-core map of what's in 210 * this region's disk log. 211 */ 212 int loggingEnabled; /* 213 * Logging enable for this 214 * region. 215 */ 216 RF_ParityLog_t *coreLog; /* 217 * In-core log for this region. 218 */ 219 }; 220 221 RF_ParityLogData_t *rf_CreateParityLogData(RF_ParityRecordType_t, 222 RF_PhysDiskAddr_t *, caddr_t, RF_Raid_t *, 223 int (*) (RF_DagNode_t *, int), void *, 224 RF_AccTraceEntry_t *, RF_Etimer_t); 225 RF_ParityLogData_t *rf_SearchAndDequeueParityLogData(RF_Raid_t *, RF_RegionId_t, 226 RF_ParityLogData_t **, RF_ParityLogData_t **, int); 227 void rf_ReleaseParityLogs(RF_Raid_t *, RF_ParityLog_t *); 228 int rf_ParityLogAppend(RF_ParityLogData_t *, int, RF_ParityLog_t **, int); 229 void rf_EnableParityLogging(RF_Raid_t *); 230 231 #endif /* !_RF__RF_PARITYLOG_H_ */ 232