summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe
diff options
context:
space:
mode:
authoroster <oster@NetBSD.org>1999-06-04 01:50:01 +0000
committeroster <oster@NetBSD.org>1999-06-04 01:50:01 +0000
commit3af0ce9e1983808ab6d655f5f9a09bb7a78a6664 (patch)
tree6e9933bac87a981ac08a8736022b3ad48b95dae2 /sys/dev/raidframe
parentb12fc4c3182cba521fac0fb1872f99a4425490e4 (diff)
Don't count two problems with a single component as two
component failures! Also: remember to configure the disk queues for the spares -- failure to do that is Bad(tm). Huge Thanks to Martin Laubach for helping track this down.
Diffstat (limited to 'sys/dev/raidframe')
-rw-r--r--sys/dev/raidframe/rf_disks.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/sys/dev/raidframe/rf_disks.c b/sys/dev/raidframe/rf_disks.c
index b0ec7121ee3..0df84d1775b 100644
--- a/sys/dev/raidframe/rf_disks.c
+++ b/sys/dev/raidframe/rf_disks.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_disks.c,v 1.8 1999/03/18 03:02:38 oster Exp $ */
+/* $NetBSD: rf_disks.c,v 1.9 1999/06/04 01:50:01 oster Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -692,10 +692,12 @@ rf_CheckLabels( raidPtr, cfgPtr )
/* we'll fail this component, as if there are
other major errors, we arn't forcing things
and we'll abort the config anyways */
- raidPtr->Disks[hosed_row][hosed_column].status
- = rf_ds_failed;
- raidPtr->numFailures++;
- raidPtr->status[hosed_row] = rf_rs_degraded;
+ if (raidPtr->Disks[hosed_row][hosed_column].status != rf_ds_failed) {
+ raidPtr->Disks[hosed_row][hosed_column].status
+ = rf_ds_failed;
+ raidPtr->numFailures++;
+ raidPtr->status[hosed_row] = rf_rs_degraded;
+ }
}
} else {
too_fatal = 1;
@@ -765,7 +767,11 @@ rf_CheckLabels( raidPtr, cfgPtr )
return(fatal_error);
}
-
+int config_disk_queue(RF_Raid_t *, RF_DiskQueue_t *, RF_RowCol_t,
+ RF_RowCol_t, RF_DiskQueueSW_t *,
+ RF_SectorCount_t, dev_t, int,
+ RF_ShutdownList_t **,
+ RF_AllocListElem_t *);
int rf_add_hot_spare(RF_Raid_t *, RF_SingleComponent_t *);
int
rf_add_hot_spare(raidPtr, sparePtr)
@@ -773,6 +779,7 @@ rf_add_hot_spare(raidPtr, sparePtr)
RF_SingleComponent_t *sparePtr;
{
RF_RaidDisk_t *disks;
+ RF_DiskQueue_t *spareQueues;
int ret;
unsigned int bs;
int spare_number;
@@ -783,7 +790,7 @@ rf_add_hot_spare(raidPtr, sparePtr)
RF_ERRORMSG1("Too many spares: %d\n", raidPtr->numSpare);
return(EINVAL);
}
-
+
/* the beginning of the spares... */
disks = &raidPtr->Disks[0][raidPtr->numCol];
@@ -835,8 +842,18 @@ rf_add_hot_spare(raidPtr, sparePtr)
}
}
- raidPtr->numSpare++;
+ spareQueues = &raidPtr->Queues[0][raidPtr->numCol];
+ ret = config_disk_queue( raidPtr, &spareQueues[spare_number],
+ 0, raidPtr->numCol + spare_number,
+ raidPtr->Queues[0][0].qPtr, /* XXX */
+ raidPtr->sectorsPerDisk,
+ raidPtr->Disks[0][raidPtr->numCol + spare_number].dev,
+ raidPtr->Queues[0][0].maxOutstanding, /* XXX */
+ &raidPtr->shutdownList,
+ raidPtr->cleanupList);
+
+ raidPtr->numSpare++;
return (0);
fail: