Clean up reconstruction accounting a bit. While it worked before, it was

slightly broken in the case where the RAID set did not support reconstruction.
This commit is contained in:
oster 1999-08-13 01:43:33 +00:00
parent b7519caaf7
commit 5cab826918
1 changed files with 16 additions and 9 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: rf_reconstruct.c,v 1.5 1999/03/02 03:18:49 oster Exp $ */
/* $NetBSD: rf_reconstruct.c,v 1.6 1999/08/13 01:43:33 oster Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
* All rights reserved.
@ -299,14 +299,14 @@ rf_ReconstructFailedDisk(raidPtr, row, col)
raidPtr->reconInProgress++;
RF_UNLOCK_MUTEX(raidPtr->mutex);
rc = rf_ReconstructFailedDiskBasic(raidPtr, row, col);
RF_LOCK_MUTEX(raidPtr->mutex);
raidPtr->reconInProgress--;
RF_UNLOCK_MUTEX(raidPtr->mutex);
} else {
RF_ERRORMSG1("RECON: no way to reconstruct failed disk for arch %c\n",
lp->parityConfig);
rc = EIO;
}
RF_LOCK_MUTEX(raidPtr->mutex);
raidPtr->reconInProgress--;
RF_UNLOCK_MUTEX(raidPtr->mutex);
RF_SIGNAL_COND(raidPtr->waitForReconCond);
wakeup(&raidPtr->waitForReconCond); /* XXX Methinks this will be
* needed at some point... GO */
@ -464,6 +464,8 @@ rf_ReconstructInPlace(raidPtr, row, col)
RF_WAIT_COND(raidPtr->waitForReconCond, raidPtr->mutex);
}
raidPtr->reconInProgress++;
/* first look for a spare drive onto which to reconstruct
the data. spare disk descriptors are stored in row 0.
@ -478,6 +480,7 @@ rf_ReconstructInPlace(raidPtr, row, col)
if (raidPtr->Layout.map->flags & RF_DISTRIBUTE_SPARE) {
RF_ERRORMSG2("Unable to reconstruct to disk at row %d col %d: operation not supported for RF_DISTRIBUTE_SPARE\n", row, col);
raidPtr->reconInProgress--;
RF_UNLOCK_MUTEX(raidPtr->mutex);
return (EINVAL);
}
@ -513,8 +516,8 @@ rf_ReconstructInPlace(raidPtr, row, col)
raidPtr->Disks[row][col].devname, retcode);
/* XXX the component isn't responding properly...
must be
* still dead :-( */
must be still dead :-( */
raidPtr->reconInProgress--;
RF_UNLOCK_MUTEX(raidPtr->mutex);
return(retcode);
@ -525,12 +528,14 @@ rf_ReconstructInPlace(raidPtr, row, col)
if ((retcode = VOP_GETATTR(vp, &va, proc->p_ucred,
proc)) != 0) {
raidPtr->reconInProgress--;
RF_UNLOCK_MUTEX(raidPtr->mutex);
return(retcode);
}
retcode = VOP_IOCTL(vp, DIOCGPART, (caddr_t) & dpart,
FREAD, proc->p_ucred, proc);
if (retcode) {
raidPtr->reconInProgress--;
RF_UNLOCK_MUTEX(raidPtr->mutex);
return(retcode);
}
@ -563,8 +568,6 @@ rf_ReconstructInPlace(raidPtr, row, col)
printf(" row %d col %d -> spare at row %d col %d\n",
row, col, row, col);
raidPtr->reconInProgress++;
RF_UNLOCK_MUTEX(raidPtr->mutex);
reconDesc = AllocRaidReconDesc((void *) raidPtr, row, col,
@ -580,13 +583,17 @@ rf_ReconstructInPlace(raidPtr, row, col)
reconDesc->reconExecTicks = 0;
reconDesc->maxReconExecTicks = 0;
rc = rf_ContinueReconstructFailedDisk(reconDesc);
RF_LOCK_MUTEX(raidPtr->mutex);
raidPtr->reconInProgress--;
RF_UNLOCK_MUTEX(raidPtr->mutex);
} else {
RF_ERRORMSG1("RECON: no way to reconstruct failed disk for arch %c\n",
lp->parityConfig);
rc = EIO;
}
RF_LOCK_MUTEX(raidPtr->mutex);
raidPtr->reconInProgress--;
if (!rc) {
/* Need to set these here, as at this point it'll be claiming