diff options
| author | oster <oster@NetBSD.org> | 1999-06-04 01:50:01 +0000 |
|---|---|---|
| committer | oster <oster@NetBSD.org> | 1999-06-04 01:50:01 +0000 |
| commit | 3af0ce9e1983808ab6d655f5f9a09bb7a78a6664 (patch) | |
| tree | 6e9933bac87a981ac08a8736022b3ad48b95dae2 /sys/dev/raidframe | |
| parent | b12fc4c3182cba521fac0fb1872f99a4425490e4 (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.c | 33 |
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: |
