void rf_ReintLog(RF_Raid_t *raidPtr, int regionID, RF_ParityLog_t *log) { RF_ASSERT(log); /* * Insert an in-core parity log (log) into the disk queue of * reintegration work. Set the flag (reintInProgress) for the * specified region (regionID) to indicate that reintegration is in * progress for this region. NON-BLOCKING */ RF_LOCK_MUTEX(raidPtr->regionInfo[regionID].reintMutex); /* Cleared when reint complete. */ raidPtr->regionInfo[regionID].reintInProgress = RF_TRUE; if (rf_parityLogDebug) printf("[requesting reintegration of region %d]\n", log->regionID); /* Move record to reintegration queue. */ RF_LOCK_MUTEX(raidPtr->parityLogDiskQueue.mutex); log->next = raidPtr->parityLogDiskQueue.reintQueue; raidPtr->parityLogDiskQueue.reintQueue = log; RF_UNLOCK_MUTEX(raidPtr->regionInfo[regionID].reintMutex); RF_UNLOCK_MUTEX(raidPtr->parityLogDiskQueue.mutex); RF_SIGNAL_COND(raidPtr->parityLogDiskQueue.cond); }
void rf_FlushLog(RF_Raid_t *raidPtr, RF_ParityLog_t *log) { /* * Insert a core log (log) into a list of logs * (parityLogDiskQueue.flushQueue) waiting to be written to disk. * NON-BLOCKING */ RF_ASSERT(log); RF_ASSERT(log->numRecords == raidPtr->numSectorsPerLog); RF_ASSERT(log->next == NULL); /* Move log to flush queue. */ RF_LOCK_MUTEX(raidPtr->parityLogDiskQueue.mutex); log->next = raidPtr->parityLogDiskQueue.flushQueue; raidPtr->parityLogDiskQueue.flushQueue = log; RF_UNLOCK_MUTEX(raidPtr->parityLogDiskQueue.mutex); RF_SIGNAL_COND(raidPtr->parityLogDiskQueue.cond); }
void rf_FreeRaidAccDesc(RF_RaidAccessDesc_t *desc) { RF_Raid_t *raidPtr = desc->raidPtr; RF_DagList_t *dagList, *temp; RF_VoidPointerListElem_t *tmp; RF_ASSERT(desc); /* Cleanup the dagList(s) */ dagList = desc->dagList; while(dagList != NULL) { temp = dagList; dagList = dagList->next; rf_FreeDAGList(temp); } while (desc->iobufs) { tmp = desc->iobufs; desc->iobufs = desc->iobufs->next; rf_FreeIOBuffer(raidPtr, tmp); } while (desc->stripebufs) { tmp = desc->stripebufs; desc->stripebufs = desc->stripebufs->next; rf_FreeStripeBuffer(raidPtr, tmp); } pool_put(&rf_pools.rad, desc); RF_LOCK_MUTEX(rf_rad_lock); raidPtr->nAccOutstanding--; if (raidPtr->waitShutdown) { RF_SIGNAL_COND(raidPtr->outstandingCond); } RF_UNLOCK_MUTEX(rf_rad_lock); }