Lines Matching refs:raidPtr
150 RF_Raid_t *raidPtr; in rf_ShutdownReconstruction() local
152 raidPtr = (RF_Raid_t *) arg; in rf_ShutdownReconstruction()
154 pool_destroy(&raidPtr->pools.reconbuffer); in rf_ShutdownReconstruction()
158 rf_ConfigureReconstruction(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, in rf_ConfigureReconstruction() argument
162 …rf_pool_init(raidPtr, raidPtr->poolNames.reconbuffer, &raidPtr->pools.reconbuffer, sizeof(RF_Recon… in rf_ConfigureReconstruction()
164 rf_ShutdownCreate(listp, rf_ShutdownReconstruction, raidPtr); in rf_ConfigureReconstruction()
170 AllocRaidReconDesc(RF_Raid_t *raidPtr, RF_RowCol_t col, in AllocRaidReconDesc() argument
178 reconDesc->raidPtr = raidPtr; in AllocRaidReconDesc()
193 reconDesc->raidPtr->raidid, in FreeReconDesc()
198 reconDesc->raidPtr->raidid, in FreeReconDesc()
211 rf_ReconstructFailedDisk(RF_Raid_t *raidPtr, RF_RowCol_t col) in rf_ReconstructFailedDisk() argument
216 lp = raidPtr->Layout.map; in rf_ReconstructFailedDisk()
222 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDisk()
223 while (raidPtr->reconInProgress) { in rf_ReconstructFailedDisk()
224 rf_wait_cond2(raidPtr->waitForReconCond, raidPtr->mutex); in rf_ReconstructFailedDisk()
226 raidPtr->reconInProgress++; in rf_ReconstructFailedDisk()
227 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDisk()
228 rc = rf_ReconstructFailedDiskBasic(raidPtr, col); in rf_ReconstructFailedDisk()
229 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDisk()
230 raidPtr->reconInProgress--; in rf_ReconstructFailedDisk()
235 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDisk()
237 rf_signal_cond2(raidPtr->waitForReconCond); in rf_ReconstructFailedDisk()
238 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDisk()
243 rf_ReconstructFailedDiskBasic(RF_Raid_t *raidPtr, RF_RowCol_t col) in rf_ReconstructFailedDiskBasic() argument
255 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDiskBasic()
256 RF_ASSERT(raidPtr->Disks[col].status == rf_ds_failed); in rf_ReconstructFailedDiskBasic()
258 if (raidPtr->Layout.map->flags & RF_DISTRIBUTE_SPARE) { in rf_ReconstructFailedDiskBasic()
259 if (raidPtr->status != rf_rs_degraded) { in rf_ReconstructFailedDiskBasic()
261 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDiskBasic()
267 for (scol = raidPtr->numCol; scol < raidPtr->numCol + raidPtr->numSpare; scol++) { in rf_ReconstructFailedDiskBasic()
268 if (raidPtr->Disks[scol].status == rf_ds_spare) { in rf_ReconstructFailedDiskBasic()
269 spareDiskPtr = &raidPtr->Disks[scol]; in rf_ReconstructFailedDiskBasic()
276 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDiskBasic()
283 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDiskBasic()
285 reconDesc = AllocRaidReconDesc((void *) raidPtr, col, spareDiskPtr, numDisksDone, scol); in rf_ReconstructFailedDiskBasic()
286 raidPtr->reconDesc = (void *) reconDesc; in rf_ReconstructFailedDiskBasic()
301 c_label = raidget_component_label(raidPtr, col); in rf_ReconstructFailedDiskBasic()
303 raid_init_component_label(raidPtr, c_label); in rf_ReconstructFailedDiskBasic()
309 raidPtr->Disks[col].partitionSize); in rf_ReconstructFailedDiskBasic()
317 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDiskBasic()
324 raidPtr->parity_good = RF_RAID_CLEAN; in rf_ReconstructFailedDiskBasic()
325 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDiskBasic()
328 raidflush_component_label(raidPtr, col); in rf_ReconstructFailedDiskBasic()
332 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDiskBasic()
334 raidPtr->Disks[col].status = rf_ds_failed; in rf_ReconstructFailedDiskBasic()
338 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructFailedDiskBasic()
341 rf_update_component_labels(raidPtr, RF_NORMAL_COMPONENT_UPDATE); in rf_ReconstructFailedDiskBasic()
356 rf_ReconstructInPlace(RF_Raid_t *raidPtr, RF_RowCol_t col) in rf_ReconstructInPlace() argument
370 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
371 lp = raidPtr->Layout.map; in rf_ReconstructInPlace()
376 rf_signal_cond2(raidPtr->waitForReconCond); in rf_ReconstructInPlace()
377 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
386 if (raidPtr->Disks[col].status != rf_ds_failed) { in rf_ReconstructInPlace()
388 raidPtr->numFailures++; in rf_ReconstructInPlace()
389 raidPtr->Disks[col].status = rf_ds_failed; in rf_ReconstructInPlace()
390 raidPtr->status = rf_rs_degraded; in rf_ReconstructInPlace()
391 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
392 rf_update_component_labels(raidPtr, in rf_ReconstructInPlace()
394 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
397 while (raidPtr->reconInProgress) { in rf_ReconstructInPlace()
398 rf_wait_cond2(raidPtr->waitForReconCond, raidPtr->mutex); in rf_ReconstructInPlace()
401 raidPtr->reconInProgress++; in rf_ReconstructInPlace()
413 if (raidPtr->Layout.map->flags & RF_DISTRIBUTE_SPARE) { in rf_ReconstructInPlace()
416 raidPtr->reconInProgress--; in rf_ReconstructInPlace()
417 rf_signal_cond2(raidPtr->waitForReconCond); in rf_ReconstructInPlace()
418 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
426 if (raidPtr->raid_cinfo[col].ci_vp != NULL) { in rf_ReconstructInPlace()
429 raidPtr->Disks[col].devname); in rf_ReconstructInPlace()
431 vp = raidPtr->raid_cinfo[col].ci_vp; in rf_ReconstructInPlace()
432 ac = raidPtr->Disks[col].auto_configured; in rf_ReconstructInPlace()
433 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
434 rf_close_component(raidPtr, vp, ac); in rf_ReconstructInPlace()
435 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
436 raidPtr->raid_cinfo[col].ci_vp = NULL; in rf_ReconstructInPlace()
439 raidPtr->Disks[col].auto_configured = 0; in rf_ReconstructInPlace()
443 raidPtr->Disks[col].devname); in rf_ReconstructInPlace()
445 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
446 pb = pathbuf_create(raidPtr->Disks[col].devname); in rf_ReconstructInPlace()
455 printf("raid%d: rebuilding: open device: %s failed: %d!\n",raidPtr->raidid, in rf_ReconstructInPlace()
456 raidPtr->Disks[col].devname, retcode); in rf_ReconstructInPlace()
460 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
461 raidPtr->reconInProgress--; in rf_ReconstructInPlace()
462 rf_signal_cond2(raidPtr->waitForReconCond); in rf_ReconstructInPlace()
463 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
473 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
474 raidPtr->reconInProgress--; in rf_ReconstructInPlace()
475 rf_signal_cond2(raidPtr->waitForReconCond); in rf_ReconstructInPlace()
476 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
479 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
480 raidPtr->Disks[col].blockSize = secsize; in rf_ReconstructInPlace()
481 raidPtr->Disks[col].numBlocks = numsec - rf_protectedSectors; in rf_ReconstructInPlace()
483 raidPtr->raid_cinfo[col].ci_vp = vp; in rf_ReconstructInPlace()
484 raidPtr->raid_cinfo[col].ci_dev = vp->v_rdev; in rf_ReconstructInPlace()
486 raidPtr->Disks[col].dev = vp->v_rdev; in rf_ReconstructInPlace()
491 raidPtr->Disks[col].numBlocks = raidPtr->Disks[col].numBlocks * in rf_ReconstructInPlace()
493 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
495 spareDiskPtr = &raidPtr->Disks[col]; in rf_ReconstructInPlace()
499 raidPtr->raidid, col); in rf_ReconstructInPlace()
501 reconDesc = AllocRaidReconDesc((void *) raidPtr, col, spareDiskPtr, in rf_ReconstructInPlace()
503 raidPtr->reconDesc = (void *) reconDesc; in rf_ReconstructInPlace()
515 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
519 raidPtr->Disks[col].status = rf_ds_optimal; in rf_ReconstructInPlace()
520 raidPtr->status = rf_rs_optimal; in rf_ReconstructInPlace()
521 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
524 c_label = raidget_component_label(raidPtr, col); in rf_ReconstructInPlace()
526 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
527 raid_init_component_label(raidPtr, c_label); in rf_ReconstructInPlace()
538 raidPtr->parity_good = RF_RAID_CLEAN; in rf_ReconstructInPlace()
539 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
541 raidflush_component_label(raidPtr, col); in rf_ReconstructInPlace()
545 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
546 raidPtr->Disks[col].status = rf_ds_failed; in rf_ReconstructInPlace()
547 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
550 rf_update_component_labels(raidPtr, RF_NORMAL_COMPONENT_UPDATE); in rf_ReconstructInPlace()
552 rf_lock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
553 raidPtr->reconInProgress--; in rf_ReconstructInPlace()
554 rf_signal_cond2(raidPtr->waitForReconCond); in rf_ReconstructInPlace()
555 rf_unlock_mutex2(raidPtr->mutex); in rf_ReconstructInPlace()
564 RF_Raid_t *raidPtr = reconDesc->raidPtr; in rf_ContinueReconstructFailedDisk() local
581 raidPtr->accumXorTimeUs = 0; in rf_ContinueReconstructFailedDisk()
584 raidPtr->recon_tracerecs = in rf_ContinueReconstructFailedDisk()
585 RF_Malloc(raidPtr->numCol * sizeof(*raidPtr->recon_tracerecs)); in rf_ContinueReconstructFailedDisk()
593 rf_SuspendNewRequestsAndWait(raidPtr); in rf_ContinueReconstructFailedDisk()
599 rf_lock_mutex2(raidPtr->mutex); in rf_ContinueReconstructFailedDisk()
603 raidPtr->reconControl = tmp_reconctrl; in rf_ContinueReconstructFailedDisk()
604 mapPtr = raidPtr->reconControl->reconMap; in rf_ContinueReconstructFailedDisk()
605 raidPtr->reconControl->numRUsTotal = mapPtr->totalRUs; in rf_ContinueReconstructFailedDisk()
606 raidPtr->reconControl->numRUsComplete = 0; in rf_ContinueReconstructFailedDisk()
607 raidPtr->status = rf_rs_reconstructing; in rf_ContinueReconstructFailedDisk()
608 raidPtr->Disks[col].status = rf_ds_reconstructing; in rf_ContinueReconstructFailedDisk()
609 raidPtr->Disks[col].spareCol = scol; in rf_ContinueReconstructFailedDisk()
611 rf_unlock_mutex2(raidPtr->mutex); in rf_ContinueReconstructFailedDisk()
613 RF_GETTIME(raidPtr->reconControl->starttime); in rf_ContinueReconstructFailedDisk()
616 rf_ResumeNewRequests(raidPtr); in rf_ContinueReconstructFailedDisk()
619 mapPtr = raidPtr->reconControl->reconMap; in rf_ContinueReconstructFailedDisk()
622 lastPSID = raidPtr->Layout.numStripe / raidPtr->Layout.SUsPerPU - 1; in rf_ContinueReconstructFailedDisk()
623 RUsPerPU = raidPtr->Layout.SUsPerPU / raidPtr->Layout.SUsPerRU; in rf_ContinueReconstructFailedDisk()
627 raidPtr->reconControl->lastPSID = incPSID - 1; in rf_ContinueReconstructFailedDisk()
633 if (raidPtr->reconControl->lastPSID > lastPSID) in rf_ContinueReconstructFailedDisk()
634 raidPtr->reconControl->lastPSID = lastPSID; in rf_ContinueReconstructFailedDisk()
644 if (raidPtr->waitShutdown || in rf_ContinueReconstructFailedDisk()
645 raidPtr->abortRecon[col]) { in rf_ContinueReconstructFailedDisk()
652 raidPtr->abortRecon[col] = 0; in rf_ContinueReconstructFailedDisk()
672 if (raidPtr->Layout.numDataCol < in rf_ContinueReconstructFailedDisk()
673 raidPtr->numCol - raidPtr->Layout.numParityCol) { in rf_ContinueReconstructFailedDisk()
679 startPSID = raidPtr->reconControl->lastPSID - pending_writes + 1; in rf_ContinueReconstructFailedDisk()
680 endPSID = raidPtr->reconControl->lastPSID; in rf_ContinueReconstructFailedDisk()
682 offPSID = raidPtr->numCol - col - 1; in rf_ContinueReconstructFailedDisk()
684 aPSID = startPSID - startPSID % raidPtr->numCol + offPSID; in rf_ContinueReconstructFailedDisk()
686 aPSID += raidPtr->numCol; in rf_ContinueReconstructFailedDisk()
689 bPSID = endPSID - ((endPSID - offPSID) % raidPtr->numCol); in rf_ContinueReconstructFailedDisk()
692 num_writes = ((bPSID - aPSID) / raidPtr->numCol) + 1; in rf_ContinueReconstructFailedDisk()
704 for (i = 0; i < raidPtr->numCol; i++) { in rf_ContinueReconstructFailedDisk()
708 if (IssueNextReadRequest(raidPtr, i)) { in rf_ContinueReconstructFailedDisk()
718 while (reconDesc->numDisksDone < raidPtr->numCol - 1) { in rf_ContinueReconstructFailedDisk()
721 status = ProcessReconEvent(raidPtr, event); in rf_ContinueReconstructFailedDisk()
732 raidPtr->reconControl->error = 1; in rf_ContinueReconstructFailedDisk()
760 rf_WakeupHeadSepCBWaiters(raidPtr); in rf_ContinueReconstructFailedDisk()
763 raidPtr->reconControl->numRUsTotal = in rf_ContinueReconstructFailedDisk()
765 raidPtr->reconControl->numRUsComplete = in rf_ContinueReconstructFailedDisk()
770 raidPtr->reconControl->percentComplete = in rf_ContinueReconstructFailedDisk()
771 (raidPtr->reconControl->numRUsComplete * 100 / raidPtr->reconControl->numRUsTotal); in rf_ContinueReconstructFailedDisk()
773 rf_PrintReconSchedule(raidPtr->reconControl->reconMap, &(raidPtr->reconControl->starttime)); in rf_ContinueReconstructFailedDisk()
780 rf_WakeupHeadSepCBWaiters(raidPtr); in rf_ContinueReconstructFailedDisk()
784 status = ProcessReconEvent(raidPtr, event); in rf_ContinueReconstructFailedDisk()
789 raidPtr->reconControl->error = 1; in rf_ContinueReconstructFailedDisk()
796 (raidPtr->reconControl->lastPSID == lastPSID)) { in rf_ContinueReconstructFailedDisk()
801 prev = raidPtr->reconControl->lastPSID; in rf_ContinueReconstructFailedDisk()
802 raidPtr->reconControl->lastPSID += incPSID; in rf_ContinueReconstructFailedDisk()
804 if (raidPtr->reconControl->lastPSID > lastPSID) { in rf_ContinueReconstructFailedDisk()
806 raidPtr->reconControl->lastPSID = lastPSID; in rf_ContinueReconstructFailedDisk()
809 for (i = 0; i < raidPtr->numCol; i++) { in rf_ContinueReconstructFailedDisk()
811 raidPtr->reconControl->perDiskInfo[i].curPSID--; in rf_ContinueReconstructFailedDisk()
812 raidPtr->reconControl->perDiskInfo[i].ru_count = RUsPerPU - 1; in rf_ContinueReconstructFailedDisk()
817 mapPtr = raidPtr->reconControl->reconMap; in rf_ContinueReconstructFailedDisk()
824 while (!recon_error && rf_UnitsLeftToReconstruct(raidPtr->reconControl->reconMap) > 0) { in rf_ContinueReconstructFailedDisk()
827 status = ProcessReconEvent(raidPtr, event); in rf_ContinueReconstructFailedDisk()
831 raidPtr->reconControl->error = 1; in rf_ContinueReconstructFailedDisk()
835 …raidPtr->reconControl->percentComplete = 100 - (rf_UnitsLeftToReconstruct(mapPtr) * 100 / mapPtr->… in rf_ContinueReconstructFailedDisk()
837 rf_PrintReconSchedule(raidPtr->reconControl->reconMap, &(raidPtr->reconControl->starttime)); in rf_ContinueReconstructFailedDisk()
845 printf("raid%d: reconstruction failed.\n", raidPtr->raidid); in rf_ContinueReconstructFailedDisk()
848 rf_SuspendNewRequestsAndWait(raidPtr); in rf_ContinueReconstructFailedDisk()
850 rf_lock_mutex2(raidPtr->mutex); in rf_ContinueReconstructFailedDisk()
857 raidPtr->status = rf_rs_degraded; in rf_ContinueReconstructFailedDisk()
858 rf_unlock_mutex2(raidPtr->mutex); in rf_ContinueReconstructFailedDisk()
861 rf_ResumeNewRequests(raidPtr); in rf_ContinueReconstructFailedDisk()
879 while (raidPtr->reconControl->pending_writes > 0) { in rf_ContinueReconstructFailedDisk()
882 status = ProcessReconEvent(raidPtr, event); in rf_ContinueReconstructFailedDisk()
885 raidPtr->reconControl->error = 1; in rf_ContinueReconstructFailedDisk()
904 rf_FreeReconControl(raidPtr); in rf_ContinueReconstructFailedDisk()
907 RF_Free(raidPtr->recon_tracerecs, raidPtr->numCol * sizeof(RF_AccTraceEntry_t)); in rf_ContinueReconstructFailedDisk()
919 rf_SuspendNewRequestsAndWait(raidPtr); in rf_ContinueReconstructFailedDisk()
921 rf_lock_mutex2(raidPtr->mutex); in rf_ContinueReconstructFailedDisk()
922 raidPtr->numFailures--; in rf_ContinueReconstructFailedDisk()
923 ds = (raidPtr->Layout.map->flags & RF_DISTRIBUTE_SPARE); in rf_ContinueReconstructFailedDisk()
924 raidPtr->Disks[col].status = (ds) ? rf_ds_dist_spared : rf_ds_spared; in rf_ContinueReconstructFailedDisk()
925 raidPtr->status = (ds) ? rf_rs_reconfigured : rf_rs_optimal; in rf_ContinueReconstructFailedDisk()
929 rf_swap_components(raidPtr, col, scol); in rf_ContinueReconstructFailedDisk()
932 raidPtr->Disks[col].status = rf_ds_optimal; in rf_ContinueReconstructFailedDisk()
934 for (i = scol; i < raidPtr->numCol+raidPtr->numSpare-1; i++) { in rf_ContinueReconstructFailedDisk()
937 rf_swap_components(raidPtr, i, i+1); in rf_ContinueReconstructFailedDisk()
939 raidPtr->numSpare--; in rf_ContinueReconstructFailedDisk()
941 rf_unlock_mutex2(raidPtr->mutex); in rf_ContinueReconstructFailedDisk()
943 RF_TIMEVAL_DIFF(&(raidPtr->reconControl->starttime), &etime, &elpsd); in rf_ContinueReconstructFailedDisk()
945 rf_ResumeNewRequests(raidPtr); in rf_ContinueReconstructFailedDisk()
948 raidPtr->raidid, col); in rf_ContinueReconstructFailedDisk()
949 xor_s = raidPtr->accumXorTimeUs / 1000000; in rf_ContinueReconstructFailedDisk()
950 xor_resid_us = raidPtr->accumXorTimeUs % 1000000; in rf_ContinueReconstructFailedDisk()
952 raidPtr->raidid, in rf_ContinueReconstructFailedDisk()
954 raidPtr->accumXorTimeUs, xor_s, xor_resid_us); in rf_ContinueReconstructFailedDisk()
956 raidPtr->raidid, in rf_ContinueReconstructFailedDisk()
957 (int) raidPtr->reconControl->starttime.tv_sec, in rf_ContinueReconstructFailedDisk()
958 (int) raidPtr->reconControl->starttime.tv_usec, in rf_ContinueReconstructFailedDisk()
962 raidPtr->raidid, (int) reconDesc->hsStallCount); in rf_ContinueReconstructFailedDisk()
964 rf_FreeReconControl(raidPtr); in rf_ContinueReconstructFailedDisk()
966 RF_Free(raidPtr->recon_tracerecs, raidPtr->numCol * sizeof(RF_AccTraceEntry_t)); in rf_ContinueReconstructFailedDisk()
977 ProcessReconEvent(RF_Raid_t *raidPtr, RF_ReconEvent_t *event) in ProcessReconEvent() argument
991 rbuf = raidPtr->reconControl->perDiskInfo[event->col].rbuf; in ProcessReconEvent()
998 if (!raidPtr->reconControl->error) { in ProcessReconEvent()
1002 retcode = IssueNextReadRequest(raidPtr, event->col); in ProcessReconEvent()
1012 rf_CheckFloatingRbufCount(raidPtr, 1); in ProcessReconEvent()
1015 sectorsPerRU = raidPtr->Layout.sectorsPerStripeUnit * raidPtr->Layout.SUsPerRU; in ProcessReconEvent()
1019 rbuf->parityStripeID, rbuf->which_ru, raidPtr->reconControl->percentComplete); in ProcessReconEvent()
1020 rf_ReconMapUpdate(raidPtr, raidPtr->reconControl->reconMap, in ProcessReconEvent()
1022 rf_RemoveFromActiveReconTable(raidPtr, rbuf->parityStripeID, rbuf->which_ru); in ProcessReconEvent()
1024 rf_lock_mutex2(raidPtr->reconControl->rb_mutex); in ProcessReconEvent()
1025 raidPtr->reconControl->pending_writes--; in ProcessReconEvent()
1026 rf_unlock_mutex2(raidPtr->reconControl->rb_mutex); in ProcessReconEvent()
1029 rf_lock_mutex2(raidPtr->reconControl->rb_mutex); in ProcessReconEvent()
1030 while(raidPtr->reconControl->rb_lock) { in ProcessReconEvent()
1031 rf_wait_cond2(raidPtr->reconControl->rb_cv, in ProcessReconEvent()
1032 raidPtr->reconControl->rb_mutex); in ProcessReconEvent()
1034 raidPtr->reconControl->rb_lock = 1; in ProcessReconEvent()
1035 rf_unlock_mutex2(raidPtr->reconControl->rb_mutex); in ProcessReconEvent()
1037 raidPtr->numFullReconBuffers--; in ProcessReconEvent()
1038 rf_ReleaseFloatingReconBuffer(raidPtr, rbuf); in ProcessReconEvent()
1040 rf_lock_mutex2(raidPtr->reconControl->rb_mutex); in ProcessReconEvent()
1041 raidPtr->reconControl->rb_lock = 0; in ProcessReconEvent()
1042 rf_broadcast_cond2(raidPtr->reconControl->rb_cv); in ProcessReconEvent()
1043 rf_unlock_mutex2(raidPtr->reconControl->rb_mutex); in ProcessReconEvent()
1055 if (!raidPtr->reconControl->error) { in ProcessReconEvent()
1056 submitblocked = rf_SubmitReconBuffer(raidPtr->reconControl->perDiskInfo[event->col].rbuf, in ProcessReconEvent()
1061 retcode = IssueNextReadRequest(raidPtr, event->col); in ProcessReconEvent()
1068 if (!raidPtr->reconControl->error) { in ProcessReconEvent()
1069 retcode = TryToRead(raidPtr, event->col); in ProcessReconEvent()
1077 if (!raidPtr->reconControl->error) { in ProcessReconEvent()
1078 retcode = TryToRead(raidPtr, event->col); in ProcessReconEvent()
1085 if (!raidPtr->reconControl->error) { in ProcessReconEvent()
1086 retcode = IssueNextWriteRequest(raidPtr); in ProcessReconEvent()
1089 rf_CheckFloatingRbufCount(raidPtr, 1); in ProcessReconEvent()
1099 if (!raidPtr->reconControl->error) { in ProcessReconEvent()
1100 retcode = IssueNextReadRequest(raidPtr, event->col); in ProcessReconEvent()
1110 if (!raidPtr->reconControl->error) { in ProcessReconEvent()
1128 rf_lock_mutex2(raidPtr->reconControl->rb_mutex); in ProcessReconEvent()
1129 raidPtr->reconControl->pending_writes--; in ProcessReconEvent()
1130 rf_unlock_mutex2(raidPtr->reconControl->rb_mutex); in ProcessReconEvent()
1153 rf_FreeReconEventDesc(raidPtr, event); in ProcessReconEvent()
1175 IssueNextReadRequest(RF_Raid_t *raidPtr, RF_RowCol_t col) in IssueNextReadRequest() argument
1177 RF_PerDiskReconCtrl_t *ctrl = &raidPtr->reconControl->perDiskInfo[col]; in IssueNextReadRequest()
1178 RF_RaidLayout_t *layoutPtr = &raidPtr->Layout; in IssueNextReadRequest()
1186 if (ctrl->headSepCounter <= raidPtr->reconControl->minHeadSepCounter) in IssueNextReadRequest()
1200 if (ctrl->curPSID > raidPtr->reconControl->lastPSID) { in IssueNextReadRequest()
1201 CheckForNewMinHeadSep(raidPtr, ++(ctrl->headSepCounter)); in IssueNextReadRequest()
1208 …status = ComputePSDiskOffsets(raidPtr, ctrl->curPSID, col, &ctrl->diskOffset, &rbuf->failedDiskSec… in IssueNextReadRequest()
1218 if (rf_CheckRUReconstructed(raidPtr->reconControl->reconMap, rbuf->failedDiskSectorOffset)) { in IssueNextReadRequest()
1226 CheckForNewMinHeadSep(raidPtr, ctrl->headSepCounter); /* update min if needed */ in IssueNextReadRequest()
1234 memset(&raidPtr->recon_tracerecs[col], 0, in IssueNextReadRequest()
1235 sizeof(raidPtr->recon_tracerecs[col])); in IssueNextReadRequest()
1236 raidPtr->recon_tracerecs[col].reconacc = 1; in IssueNextReadRequest()
1237 RF_ETIMER_START(raidPtr->recon_tracerecs[col].recon_timer); in IssueNextReadRequest()
1239 retcode = TryToRead(raidPtr, col); in IssueNextReadRequest()
1253 TryToRead(RF_Raid_t *raidPtr, RF_RowCol_t col) in TryToRead() argument
1255 RF_PerDiskReconCtrl_t *ctrl = &raidPtr->reconControl->perDiskInfo[col]; in TryToRead()
1256 RF_SectorCount_t sectorsPerRU = raidPtr->Layout.sectorsPerStripeUnit * raidPtr->Layout.SUsPerRU; in TryToRead()
1265 if (CheckHeadSeparation(raidPtr, ctrl, col, ctrl->headSepCounter, which_ru)) in TryToRead()
1269 newpssPtr = rf_AllocPSStatus(raidPtr); in TryToRead()
1271 RF_LOCK_PSS_MUTEX(raidPtr, psid); in TryToRead()
1272 …pssPtr = rf_LookupRUStatus(raidPtr, raidPtr->reconControl->pssTable, psid, which_ru, RF_PSS_CREATE… in TryToRead()
1275 rf_FreePSStatus(raidPtr, newpssPtr); in TryToRead()
1281 status = CheckForcedOrBlockedReconstruction(raidPtr, pssPtr, ctrl, col, psid, which_ru); in TryToRead()
1287 rf_CauseReconEvent(raidPtr, col, NULL, RF_REVENT_SKIP); in TryToRead()
1297 if (rf_CheckRUReconstructed(raidPtr->reconControl->reconMap, ctrl->rbuf->failedDiskSectorOffset)) { in TryToRead()
1300 rf_PSStatusDelete(raidPtr, raidPtr->reconControl->pssTable, pssPtr); in TryToRead()
1301 rf_CauseReconEvent(raidPtr, col, NULL, RF_REVENT_SKIP); in TryToRead()
1308 RF_ETIMER_STOP(raidPtr->recon_tracerecs[col].recon_timer); in TryToRead()
1309 RF_ETIMER_EVAL(raidPtr->recon_tracerecs[col].recon_timer); in TryToRead()
1310 raidPtr->recon_tracerecs[col].specific.recon.recon_start_to_fetch_us = in TryToRead()
1311 RF_ETIMER_VAL_US(raidPtr->recon_tracerecs[col].recon_timer); in TryToRead()
1312 RF_ETIMER_START(raidPtr->recon_tracerecs[col].recon_timer); in TryToRead()
1319 &raidPtr->recon_tracerecs[col], in TryToRead()
1323 (void *) raidPtr, 0, NULL); in TryToRead()
1326 rf_DiskIOEnqueue(&raidPtr->Queues[col], req, RF_IO_RECON_PRIORITY); in TryToRead()
1330 RF_UNLOCK_PSS_MUTEX(raidPtr, psid); in TryToRead()
1369 ComputePSDiskOffsets(RF_Raid_t *raidPtr, RF_StripeNum_t psid, in ComputePSDiskOffsets() argument
1374 RF_RaidLayout_t *layoutPtr = &raidPtr->Layout; in ComputePSDiskOffsets()
1375 RF_RowCol_t fcol = raidPtr->reconControl->fcol; in ComputePSDiskOffsets()
1387 (layoutPtr->map->IdentifyStripe) (raidPtr, sosRaidAddress, &diskids); in ComputePSDiskOffsets()
1407 (layoutPtr->map->MapParity) (raidPtr, sosRaidAddress, &pcol, &poffset, RF_DONT_REMAP); in ComputePSDiskOffsets()
1440 …layoutPtr->map->MapParity(raidPtr, sosRaidAddress + i_offset * layoutPtr->sectorsPerStripeUnit, &t… in ComputePSDiskOffsets()
1442 …layoutPtr->map->MapSector(raidPtr, sosRaidAddress + i_offset * layoutPtr->sectorsPerStripeUnit, &t… in ComputePSDiskOffsets()
1447 …layoutPtr->map->MapParity(raidPtr, sosRaidAddress + j_offset * layoutPtr->sectorsPerStripeUnit, &t… in ComputePSDiskOffsets()
1449 …layoutPtr->map->MapSector(raidPtr, sosRaidAddress + j_offset * layoutPtr->sectorsPerStripeUnit, &t… in ComputePSDiskOffsets()
1456 …layoutPtr->map->MapParity(raidPtr, sosRaidAddress + j_offset * layoutPtr->sectorsPerStripeUnit, sp… in ComputePSDiskOffsets()
1458 …layoutPtr->map->MapSector(raidPtr, sosRaidAddress + j_offset * layoutPtr->sectorsPerStripeUnit, sp… in ComputePSDiskOffsets()
1461 *spCol = raidPtr->reconControl->spareCol; in ComputePSDiskOffsets()
1475 IssueNextWriteRequest(RF_Raid_t *raidPtr) in IssueNextWriteRequest() argument
1477 RF_RaidLayout_t *layoutPtr = &raidPtr->Layout; in IssueNextWriteRequest()
1480 RF_RowCol_t fcol = raidPtr->reconControl->fcol; in IssueNextWriteRequest()
1485 rbuf = rf_GetFullReconBuffer(raidPtr->reconControl); in IssueNextWriteRequest()
1507 &raidPtr->recon_tracerecs[fcol], in IssueNextWriteRequest()
1511 (void *) raidPtr, 0, NULL); in IssueNextWriteRequest()
1514 rf_lock_mutex2(raidPtr->reconControl->rb_mutex); in IssueNextWriteRequest()
1515 raidPtr->reconControl->pending_writes++; in IssueNextWriteRequest()
1516 rf_unlock_mutex2(raidPtr->reconControl->rb_mutex); in IssueNextWriteRequest()
1517 rf_DiskIOEnqueue(&raidPtr->Queues[rbuf->spCol], req, RF_IO_RECON_PRIORITY); in IssueNextWriteRequest()
1534 RF_Raid_t *raidPtr; in ReconReadDoneProc() local
1543 raidPtr = ctrl->reconCtrl->reconDesc->raidPtr; in ReconReadDoneProc()
1546 printf("raid%d: Recon read failed: %d\n", raidPtr->raidid, status); in ReconReadDoneProc()
1547 rf_CauseReconEvent(raidPtr, ctrl->col, NULL, RF_REVENT_READ_FAILED); in ReconReadDoneProc()
1551 RF_ETIMER_STOP(raidPtr->recon_tracerecs[ctrl->col].recon_timer); in ReconReadDoneProc()
1552 RF_ETIMER_EVAL(raidPtr->recon_tracerecs[ctrl->col].recon_timer); in ReconReadDoneProc()
1553 raidPtr->recon_tracerecs[ctrl->col].specific.recon.recon_fetch_to_return_us = in ReconReadDoneProc()
1554 RF_ETIMER_VAL_US(raidPtr->recon_tracerecs[ctrl->col].recon_timer); in ReconReadDoneProc()
1555 RF_ETIMER_START(raidPtr->recon_tracerecs[ctrl->col].recon_timer); in ReconReadDoneProc()
1557 rf_CauseReconEvent(raidPtr, ctrl->col, NULL, RF_REVENT_READDONE); in ReconReadDoneProc()
1574 if (rbuf->raidPtr->reconControl == NULL) in ReconWriteDoneProc()
1579 printf("raid%d: Recon write failed (status %d(0x%x))!\n", rbuf->raidPtr->raidid,status,status); in ReconWriteDoneProc()
1580 rf_CauseReconEvent(rbuf->raidPtr, rbuf->col, arg, RF_REVENT_WRITE_FAILED); in ReconWriteDoneProc()
1583 rf_CauseReconEvent(rbuf->raidPtr, rbuf->col, arg, RF_REVENT_WRITEDONE); in ReconWriteDoneProc()
1592 CheckForNewMinHeadSep(RF_Raid_t *raidPtr, RF_HeadSepLimit_t hsCtr) in CheckForNewMinHeadSep() argument
1594 RF_ReconCtrl_t *reconCtrlPtr = raidPtr->reconControl; in CheckForNewMinHeadSep()
1610 for (i = 0; i < raidPtr->numCol; i++) in CheckForNewMinHeadSep()
1625 rf_CauseReconEvent(raidPtr, p->col, NULL, RF_REVENT_HEADSEPCLEAR); in CheckForNewMinHeadSep()
1626 rf_FreeCallbackValueDesc(raidPtr, p); in CheckForNewMinHeadSep()
1649 CheckHeadSeparation(RF_Raid_t *raidPtr, RF_PerDiskReconCtrl_t *ctrl, in CheckHeadSeparation() argument
1653 RF_ReconCtrl_t *reconCtrlPtr = raidPtr->reconControl; in CheckHeadSeparation()
1671 if ((raidPtr->headSepLimit >= 0) && in CheckHeadSeparation()
1672 ((ctrl->headSepCounter - reconCtrlPtr->minHeadSepCounter) > raidPtr->headSepLimit)) { in CheckHeadSeparation()
1674 raidPtr->raidid, col, ctrl->headSepCounter, in CheckHeadSeparation()
1676 raidPtr->headSepLimit); in CheckHeadSeparation()
1677 cb = rf_AllocCallbackValueDesc(raidPtr); in CheckHeadSeparation()
1680 cb->v = (ctrl->headSepCounter - raidPtr->headSepLimit + raidPtr->headSepLimit / 5); in CheckHeadSeparation()
1718 CheckForcedOrBlockedReconstruction(RF_Raid_t *raidPtr, in CheckForcedOrBlockedReconstruction() argument
1733 cb = rf_AllocCallbackValueDesc(raidPtr); /* append ourselves to in CheckForcedOrBlockedReconstruction()
1756 rf_ForceOrBlockRecon(RF_Raid_t *raidPtr, RF_AccessStripeMap_t *asmap, in rf_ForceOrBlockRecon() argument
1761 …RF_SectorCount_t sectorsPerRU = raidPtr->Layout.sectorsPerStripeUnit * raidPtr->Layout.SUsPerRU; /… in rf_ForceOrBlockRecon()
1775 psid = rf_MapStripeIDToParityStripeID(&raidPtr->Layout, stripeID, &which_ru); in rf_ForceOrBlockRecon()
1778 newpssPtr = rf_AllocPSStatus(raidPtr); in rf_ForceOrBlockRecon()
1780 RF_LOCK_PSS_MUTEX(raidPtr, psid); in rf_ForceOrBlockRecon()
1782 …pssPtr = rf_LookupRUStatus(raidPtr, raidPtr->reconControl->pssTable, psid, which_ru, RF_PSS_CREATE… in rf_ForceOrBlockRecon()
1785 rf_FreePSStatus(raidPtr, newpssPtr); in rf_ForceOrBlockRecon()
1790 RF_UNLOCK_PSS_MUTEX(raidPtr, psid); in rf_ForceOrBlockRecon()
1804 fcol = raidPtr->reconControl->fcol; in rf_ForceOrBlockRecon()
1807 (raidPtr->Layout.map->IdentifyStripe) (raidPtr, asmap->raidAddress, &diskids); in rf_ForceOrBlockRecon()
1815 for (i = 0; i < raidPtr->Layout.numDataCol + raidPtr->Layout.numParityCol; i++) in rf_ForceOrBlockRecon()
1818 nPromoted = rf_DiskIOPromote(&raidPtr->Queues[diskno], psid, which_ru); in rf_ForceOrBlockRecon()
1820 printf("raid%d: promoted read from col %d\n", raidPtr->raidid, diskno); in rf_ForceOrBlockRecon()
1822 new_rbuf = rf_MakeReconBuffer(raidPtr, diskno, RF_RBUF_TYPE_FORCED); /* create new buf */ in rf_ForceOrBlockRecon()
1823 ComputePSDiskOffsets(raidPtr, psid, diskno, &offset, &fd_offset, in rf_ForceOrBlockRecon()
1837 NULL, (void *) raidPtr, 0, NULL); in rf_ForceOrBlockRecon()
1840 rf_DiskIOEnqueue(&raidPtr->Queues[diskno], req, RF_IO_NORMAL_PRIORITY); /* enqueue the I/O */ in rf_ForceOrBlockRecon()
1841 Dprintf2("raid%d: Issued new read req on col %d\n", raidPtr->raidid, diskno); in rf_ForceOrBlockRecon()
1846 if (rf_DiskIOPromote(&raidPtr->Queues[fcol], psid, which_ru)) in rf_ForceOrBlockRecon()
1849 raidPtr->raidid, fcol); in rf_ForceOrBlockRecon()
1853 cb = rf_AllocCallbackFuncDesc(raidPtr); in rf_ForceOrBlockRecon()
1859 raidPtr->raidid, psid); in rf_ForceOrBlockRecon()
1861 RF_UNLOCK_PSS_MUTEX(raidPtr, psid); in rf_ForceOrBlockRecon()
1877 if (rbuf->raidPtr->reconControl == NULL) in ForceReconReadDoneProc()
1881 printf("raid%d: Forced recon read failed!\n", rbuf->raidPtr->raidid); in ForceReconReadDoneProc()
1882 rf_CauseReconEvent(rbuf->raidPtr, rbuf->col, (void *) rbuf, RF_REVENT_FORCEDREAD_FAILED); in ForceReconReadDoneProc()
1885 rf_CauseReconEvent(rbuf->raidPtr, rbuf->col, (void *) rbuf, RF_REVENT_FORCEDREADDONE); in ForceReconReadDoneProc()
1889 rf_UnblockRecon(RF_Raid_t *raidPtr, RF_AccessStripeMap_t *asmap) in rf_UnblockRecon() argument
1897 psid = rf_MapStripeIDToParityStripeID(&raidPtr->Layout, stripeID, &which_ru); in rf_UnblockRecon()
1898 RF_LOCK_PSS_MUTEX(raidPtr, psid); in rf_UnblockRecon()
1899 …pssPtr = rf_LookupRUStatus(raidPtr, raidPtr->reconControl->pssTable, psid, which_ru, RF_PSS_NONE, … in rf_UnblockRecon()
1916 raidPtr->raidid, psid, pssPtr->blockCount); in rf_UnblockRecon()
1931 rf_CauseReconEvent(raidPtr, cb->col, NULL, RF_REVENT_BLOCKCLEAR); in rf_UnblockRecon()
1932 rf_FreeCallbackValueDesc(raidPtr, cb); in rf_UnblockRecon()
1936 rf_PSStatusDelete(raidPtr, raidPtr->reconControl->pssTable, pssPtr); in rf_UnblockRecon()
1940 RF_UNLOCK_PSS_MUTEX(raidPtr, psid); in rf_UnblockRecon()
1945 rf_WakeupHeadSepCBWaiters(RF_Raid_t *raidPtr) in rf_WakeupHeadSepCBWaiters() argument
1949 rf_lock_mutex2(raidPtr->reconControl->rb_mutex); in rf_WakeupHeadSepCBWaiters()
1950 while(raidPtr->reconControl->rb_lock) { in rf_WakeupHeadSepCBWaiters()
1951 rf_wait_cond2(raidPtr->reconControl->rb_cv, in rf_WakeupHeadSepCBWaiters()
1952 raidPtr->reconControl->rb_mutex); in rf_WakeupHeadSepCBWaiters()
1955 raidPtr->reconControl->rb_lock = 1; in rf_WakeupHeadSepCBWaiters()
1956 rf_unlock_mutex2(raidPtr->reconControl->rb_mutex); in rf_WakeupHeadSepCBWaiters()
1958 while (raidPtr->reconControl->headSepCBList) { in rf_WakeupHeadSepCBWaiters()
1959 p = raidPtr->reconControl->headSepCBList; in rf_WakeupHeadSepCBWaiters()
1960 raidPtr->reconControl->headSepCBList = p->next; in rf_WakeupHeadSepCBWaiters()
1962 rf_CauseReconEvent(raidPtr, p->col, NULL, RF_REVENT_HEADSEPCLEAR); in rf_WakeupHeadSepCBWaiters()
1963 rf_FreeCallbackValueDesc(raidPtr, p); in rf_WakeupHeadSepCBWaiters()
1965 rf_lock_mutex2(raidPtr->reconControl->rb_mutex); in rf_WakeupHeadSepCBWaiters()
1966 raidPtr->reconControl->rb_lock = 0; in rf_WakeupHeadSepCBWaiters()
1967 rf_broadcast_cond2(raidPtr->reconControl->rb_cv); in rf_WakeupHeadSepCBWaiters()
1968 rf_unlock_mutex2(raidPtr->reconControl->rb_mutex); in rf_WakeupHeadSepCBWaiters()