diff options
author | sos <sos@FreeBSD.org> | 2005-04-20 14:14:08 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2005-04-20 14:14:08 +0000 |
commit | 01d6e824de62a24048b68e35302cfc0f88350192 (patch) | |
tree | 69f1cafed3d4bd68b61dddd656c26883b489c410 | |
parent | 0719b14efba312a3f1bdf2a64192fd167fa2b3c3 (diff) | |
download | FreeBSD-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.c | 18 |
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) { |