int rf_State_Quiesce(RF_RaidAccessDesc_t *desc) { RF_AccTraceEntry_t *tracerec = &desc->tracerec; RF_Etimer_t timer; int suspended = RF_FALSE; RF_Raid_t *raidPtr; raidPtr = desc->raidPtr; RF_ETIMER_START(timer); RF_ETIMER_START(desc->timer); RF_LOCK_MUTEX(raidPtr->access_suspend_mutex); if (raidPtr->accesses_suspended) { RF_CallbackDesc_t *cb; cb = rf_AllocCallbackDesc(); /* * XXX The following cast is quite bogus... * rf_ContinueRaidAccess takes a (RF_RaidAccessDesc_t *) * as an argument... GO */ cb->callbackFunc = (void (*) (RF_CBParam_t)) rf_ContinueRaidAccess; cb->callbackArg.p = (void *) desc; cb->next = raidPtr->quiesce_wait_list; raidPtr->quiesce_wait_list = cb; suspended = RF_TRUE; } RF_UNLOCK_MUTEX(raidPtr->access_suspend_mutex); RF_ETIMER_STOP(timer); RF_ETIMER_EVAL(timer); tracerec->specific.user.suspend_ovhd_us += RF_ETIMER_VAL_US(timer); if (suspended && rf_quiesceDebug) printf("Stalling access due to quiescence lock.\n"); desc->state++; return suspended; }
int rf_State_Quiesce(RF_RaidAccessDesc_t *desc) { #if RF_ACC_TRACE > 0 RF_AccTraceEntry_t *tracerec = &desc->tracerec; RF_Etimer_t timer; #endif RF_CallbackDesc_t *cb; RF_Raid_t *raidPtr; int suspended = RF_FALSE; int need_cb, used_cb; raidPtr = desc->raidPtr; #if RF_ACC_TRACE > 0 RF_ETIMER_START(timer); RF_ETIMER_START(desc->timer); #endif need_cb = 0; used_cb = 0; cb = NULL; rf_lock_mutex2(raidPtr->access_suspend_mutex); /* Do an initial check to see if we might need a callback structure */ if (raidPtr->accesses_suspended) { need_cb = 1; } rf_unlock_mutex2(raidPtr->access_suspend_mutex); if (need_cb) { /* create a callback if we might need it... and we likely do. */ cb = rf_AllocCallbackDesc(); } rf_lock_mutex2(raidPtr->access_suspend_mutex); if (raidPtr->accesses_suspended) { cb->callbackFunc = (void (*) (RF_CBParam_t)) rf_ContinueRaidAccess; cb->callbackArg.p = (void *) desc; cb->next = raidPtr->quiesce_wait_list; raidPtr->quiesce_wait_list = cb; suspended = RF_TRUE; used_cb = 1; } rf_unlock_mutex2(raidPtr->access_suspend_mutex); if ((need_cb == 1) && (used_cb == 0)) { rf_FreeCallbackDesc(cb); } #if RF_ACC_TRACE > 0 RF_ETIMER_STOP(timer); RF_ETIMER_EVAL(timer); tracerec->specific.user.suspend_ovhd_us += RF_ETIMER_VAL_US(timer); #endif #if RF_DEBUG_QUIESCE if (suspended && rf_quiesceDebug) printf("Stalling access due to quiescence lock\n"); #endif desc->state++; return suspended; }