summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2005-04-20 14:14:08 +0000
committersos <sos@FreeBSD.org>2005-04-20 14:14:08 +0000
commit01d6e824de62a24048b68e35302cfc0f88350192 (patch)
tree69f1cafed3d4bd68b61dddd656c26883b489c410
parent0719b14efba312a3f1bdf2a64192fd167fa2b3c3 (diff)
downloadFreeBSD-src-01d6e824de62a24048b68e35302cfc0f88350192.zip
FreeBSD-src-01d6e824de62a24048b68e35302cfc0f88350192.tar.gz
When a rebuild is done, properly mark the arrays as functional again.
-rw-r--r--sys/dev/ata/ata-raid.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c
index ecfa324..fdf0541 100644
--- a/sys/dev/ata/ata-raid.c
+++ b/sys/dev/ata/ata-raid.c
@@ -690,8 +690,24 @@ ata_raid_done(struct ata_request *request)
printf("ar%d: unknown array type in ata_raid_done\n", rdp->lun);
}
- if (finished)
+ if (finished) {
+ if ((rdp->status & AR_S_REBUILDING) &&
+ rdp->rebuild_lba >= rdp->total_sectors) {
+ int disk;
+
+ for (disk = 0; disk < rdp->total_disks; disk++) {
+ if ((rdp->disks[disk].flags &
+ (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_SPARE)) ==
+ (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_SPARE)) {
+ rdp->disks[disk].flags &= ~AR_DF_SPARE;
+ rdp->disks[disk].flags |= AR_DF_ONLINE;
+ }
+ }
+ rdp->status &= ~AR_S_REBUILDING;
+ ata_raid_config_changed(rdp, 1);
+ }
biodone(bp);
+ }
if (composite) {
if (finished) {
OpenPOWER on IntegriCloud