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); }
int rf_State_ProcessDAG(RF_RaidAccessDesc_t *desc) { RF_AccessStripeMapHeader_t *asmh = desc->asmap; RF_Raid_t *raidPtr = desc->raidPtr; RF_DagHeader_t *dag_h; int i, j, done = RF_TRUE; RF_DagList_t *dagList, *temp; /* check to see if this is the last dag */ dagList = desc->dagList; for (i = 0; i < desc->numStripes; i++) { if (dagList->numDags != dagList->numDagsDone) done = RF_FALSE; dagList = dagList->next; } if (done) { if (desc->status) { /* a dag failed, retry */ /* free all dags */ dagList = desc->dagList; for (i = 0; i < desc->numStripes; i++) { rf_FreeDAG(dagList->dags); temp = dagList; dagList = dagList->next; rf_FreeDAGList(temp); } desc->dagList = NULL; rf_MarkFailuresInASMList(raidPtr, asmh); /* note the retry so that we'll bail in rf_State_CreateDAG() once we've retired the IO RF_RETRY_THRESHOLD times */ desc->numRetries++; /* back up to rf_State_CreateDAG */ desc->state = desc->state - 2; return RF_FALSE; } else { /* move on to rf_State_Cleanup */ desc->state++; } return RF_FALSE; } else { /* more dags to execute */ /* see if any are ready to be fired. if so, fire them */ /* don't fire the initial dag in a list, it's fired in * rf_State_ExecuteDAG */ dagList = desc->dagList; for (i = 0; i < desc->numStripes; i++) { if ((dagList->numDagsDone < dagList->numDags) && (dagList->numDagsDone == dagList->numDagsFired) && (dagList->numDagsFired > 0)) { #if RF_ACC_TRACE > 0 RF_ETIMER_START(dagList->tracerec.timer); #endif /* fire next dag in this stripe */ /* first, skip to next dag awaiting execution */ dag_h = dagList->dags; for (j = 0; j < dagList->numDagsDone; j++) dag_h = dag_h->next; dagList->numDagsFired++; rf_DispatchDAG(dag_h, (void (*) (void *)) rf_ContinueDagAccess, dagList); } dagList = dagList->next; } return RF_TRUE; } }