desc->raidPtr->copyback_stripes_done = stripeAddr / desc->sectPerStripe;
rf_ContinueCopyback(desc)	RF_CopybackDesc_t *desc;{	RF_SectorNum_t testOffs, stripeAddr;	RF_Raid_t *raidPtr = desc->raidPtr;	RF_RaidAddr_t addr;	RF_RowCol_t testRow, testCol;	int     old_pctg, new_pctg, done;	struct timeval t, diff;	old_pctg = (-1);	while (1) {		stripeAddr = desc->stripeAddr;		if (rf_prReconSched) {			old_pctg = 100 * desc->stripeAddr / raidPtr->totalSectors;		}		desc->stripeAddr += desc->sectPerStripe;		if (rf_prReconSched) {			new_pctg = 100 * desc->stripeAddr / raidPtr->totalSectors;			if (new_pctg != old_pctg) {				RF_GETTIME(t);				RF_TIMEVAL_DIFF(&desc->starttime, &t, &diff);				printf("%d %d.%06d\n", new_pctg, (int) diff.tv_sec, (int) diff.tv_usec);			}		}		if (stripeAddr >= raidPtr->totalSectors) {			rf_CopybackComplete(desc, 0);			return;		}		/* walk through the current stripe, su-by-su */		for (done = 0, addr = stripeAddr; addr < stripeAddr + desc->sectPerStripe; addr += desc->sectPerSU) {			/* map the SU, disallowing remap to spare space */			(raidPtr->Layout.map->MapSector) (raidPtr, addr, &testRow, &testCol, &testOffs, RF_DONT_REMAP);			if (testRow == desc->frow && testCol == desc->fcol) {				rf_CopybackOne(desc, RF_COPYBACK_DATA, addr, testRow, testCol, testOffs);				done = 1;				break;			}		}		if (!done) {			/* we didn't find the failed disk in the data part.			 * check parity. */			/* map the parity for this stripe, disallowing remap			 * to spare space */			(raidPtr->Layout.map->MapParity) (raidPtr, stripeAddr, &testRow, &testCol, &testOffs, RF_DONT_REMAP);			if (testRow == desc->frow && testCol == desc->fcol) {				rf_CopybackOne(desc, RF_COPYBACK_PARITY, stripeAddr, testRow, testCol, testOffs);			}		}		/* check to see if the last read/write pair failed */		if (desc->status) {			rf_CopybackComplete(desc, 1);			return;		}		/* we didn't find any units to copy back in this stripe.		 * Continue with the next one */	}}