aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ata
diff options
context:
space:
mode:
authorSøren Schmidt <sos@FreeBSD.org>2005-04-20 14:14:08 +0000
committerSøren Schmidt <sos@FreeBSD.org>2005-04-20 14:14:08 +0000
commit46917bb6f4204ae7ac1e2dd965d6f608f3e9d59b (patch)
tree69f1cafed3d4bd68b61dddd656c26883b489c410 /sys/dev/ata
parent3d5c30f7c2f787e4ac34403ce812a9b2d04b8841 (diff)
Notes
Diffstat (limited to 'sys/dev/ata')
-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 ecfa324ca281..fdf0541aa4d6 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) {