#ifndef _RF__RF_PARITYLOG_H_
#define _RF__RF_PARITYLOG_H_
#include <dev/raidframe/raidframevar.h>
#define RF_DEFAULT_NUM_SECTORS_PER_LOG 64
typedef int RF_RegionId_t;
typedef enum RF_ParityRecordType_e {
RF_STOP,
RF_UPDATE,
RF_OVERWRITE
} RF_ParityRecordType_t;
struct RF_CommonLogData_s {
rf_declare_mutex2(mutex);
int cnt;
RF_Raid_t *raidPtr;
void (*wakeFunc) (void *, int);
void *wakeArg;
RF_AccTraceEntry_t *tracerec;
RF_Etimer_t startTime;
void *bufPtr;
RF_ParityRecordType_t operation;
RF_CommonLogData_t *next;
};
struct RF_ParityLogData_s {
RF_RegionId_t regionID;
int bufOffset;
RF_PhysDiskAddr_t diskAddress;
RF_CommonLogData_t *common;
RF_ParityLogData_t *next;
RF_ParityLogData_t *prev;
};
struct RF_ParityLogAppendQueue_s {
rf_declare_mutex2(mutex);
};
struct RF_ParityLogRecord_s {
RF_PhysDiskAddr_t parityAddr;
RF_ParityRecordType_t operation;
};
struct RF_ParityLog_s {
RF_RegionId_t regionID;
int numRecords;
int diskOffset;
RF_ParityLogRecord_t *records;
void *bufPtr;
RF_ParityLog_t *next;
};
struct RF_ParityLogQueue_s {
rf_declare_mutex2(mutex);
RF_ParityLog_t *parityLogs;
};
struct RF_RegionBufferQueue_s {
rf_declare_mutex2(mutex);
rf_declare_cond2(cond);
int bufferSize;
int totalBuffers;
int availableBuffers;
int emptyBuffersIndex;
int availBuffersIndex;
void **buffers;
};
#define RF_PLOG_CREATED (1<<0)
#define RF_PLOG_RUNNING (1<<1)
#define RF_PLOG_TERMINATE (1<<2)
#define RF_PLOG_SHUTDOWN (1<<3)
struct RF_ParityLogDiskQueue_s {
rf_declare_mutex2(mutex);
rf_declare_cond2(cond);
int threadState;
RF_ParityLog_t *flushQueue;
RF_ParityLog_t *reintQueue;
RF_ParityLogData_t *bufHead;
RF_ParityLogData_t *bufTail;
RF_ParityLogData_t *reintHead;
RF_ParityLogData_t *reintTail;
RF_ParityLogData_t *logBlockHead;
RF_ParityLogData_t *logBlockTail;
RF_ParityLogData_t *reintBlockHead;
RF_ParityLogData_t *reintBlockTail;
RF_CommonLogData_t *freeCommonList;
RF_ParityLogData_t *freeDataList;
};
struct RF_DiskMap_s {
RF_PhysDiskAddr_t parityAddr;
RF_ParityRecordType_t operation;
};
struct RF_RegionInfo_s {
rf_declare_mutex2(mutex);
rf_declare_mutex2(reintMutex);
int reintInProgress;
RF_SectorCount_t capacity;
RF_SectorNum_t regionStartAddr;
RF_SectorNum_t parityStartAddr;
RF_SectorCount_t numSectorsParity;
RF_SectorCount_t diskCount;
RF_DiskMap_t *diskMap;
int loggingEnabled;
RF_ParityLog_t *coreLog;
};
RF_ParityLogData_t *
rf_CreateParityLogData(RF_ParityRecordType_t operation,
RF_PhysDiskAddr_t * pda, void *bufPtr, RF_Raid_t * raidPtr,
void (*wakeFunc) (void *, int),
void *wakeArg, RF_AccTraceEntry_t * tracerec,
RF_Etimer_t startTime);
RF_ParityLogData_t *rf_SearchAndDequeueParityLogData(RF_Raid_t * raidPtr,
RF_RegionId_t regionID, RF_ParityLogData_t ** head,
RF_ParityLogData_t ** tail, int ignoreLocks);
void rf_ReleaseParityLogs(RF_Raid_t * raidPtr, RF_ParityLog_t * firstLog);
int rf_ParityLogAppend(RF_ParityLogData_t * logData, int finish,
RF_ParityLog_t ** incomingLog, int clearReintFlag);
void rf_EnableParityLogging(RF_Raid_t * raidPtr);
#endif