summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-raid.c
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2008-03-20 11:54:26 +0000
committersos <sos@FreeBSD.org>2008-03-20 11:54:26 +0000
commitc69ad0290e26f599bd79a92d1ad1ed33793187a7 (patch)
tree64514b2d451312eb09bf1c4f8930e58bc6c9cf2a /sys/dev/ata/ata-raid.c
parent735c62ce43b9438d0c6fe5b5068e036d45666d3f (diff)
downloadFreeBSD-src-c69ad0290e26f599bd79a92d1ad1ed33793187a7.zip
FreeBSD-src-c69ad0290e26f599bd79a92d1ad1ed33793187a7.tar.gz
Fix Problem with Intel Matrix RAID.
Fix from PR/121899.
Diffstat (limited to 'sys/dev/ata/ata-raid.c')
-rw-r--r--sys/dev/ata/ata-raid.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c
index 2356d23..82a0f5a 100644
--- a/sys/dev/ata/ata-raid.c
+++ b/sys/dev/ata/ata-raid.c
@@ -199,9 +199,8 @@ ata_raid_attach(struct ar_softc *rdp, int writeback)
printf("using %s at ata%d-%s\n",
device_get_nameunit(rdp->disks[disk].dev),
device_get_unit(device_get_parent(rdp->disks[disk].dev)),
- (((struct ata_device *)
- device_get_softc(rdp->disks[disk].dev))->unit ==
- ATA_MASTER) ? "master" : "slave");
+ ata_unit2str((struct ata_device *)
+ device_get_softc(rdp->disks[disk].dev)));
}
else if (rdp->disks[disk].flags & AR_DF_ASSIGNED)
printf("DOWN\n");
@@ -856,6 +855,7 @@ ata_raid_config_changed(struct ar_softc *rdp, int writeback)
int disk, count, status;
mtx_lock(&rdp->lock);
+
/* set default all working mode */
status = rdp->status;
rdp->status &= ~AR_S_DEGRADED;
@@ -910,6 +910,11 @@ ata_raid_config_changed(struct ar_softc *rdp, int writeback)
}
if (rdp->status != status) {
+
+ /* raid status has changed, update metadata */
+ writeback = 1;
+
+ /* announce we have trouble ahead */
if (!(rdp->status & AR_S_READY)) {
printf("ar%d: FAILURE - %s array broken\n",
rdp->lun, ata_raid_type(rdp));
@@ -1660,7 +1665,7 @@ ata_raid_adaptec_read_meta(device_t dev, struct ar_softc **raidp)
struct ata_device *atadev = device_get_softc(parent);
struct ata_channel *ch = device_get_softc(GRANDPARENT(dev));
int disk_number = (ch->unit << !(ch->flags & ATA_NO_SLAVE)) +
- ATA_DEV(atadev->unit);
+ atadev->unit;
raid->disks[disk_number].dev = parent;
raid->disks[disk_number].sectors =
@@ -2272,11 +2277,14 @@ ata_raid_intel_write_meta(struct ar_softc *rdp)
}
rdp->generation++;
- microtime(&timestamp);
+ if (!rdp->magic_0) {
+ microtime(&timestamp);
+ rdp->magic_0 = timestamp.tv_sec ^ timestamp.tv_usec;
+ }
bcopy(INTEL_MAGIC, meta->intel_id, sizeof(meta->intel_id));
bcopy(INTEL_VERSION_1100, meta->version, sizeof(meta->version));
- meta->config_id = timestamp.tv_sec;
+ meta->config_id = rdp->magic_0;
meta->generation = rdp->generation;
meta->total_disks = rdp->total_disks;
meta->total_volumes = 1; /* XXX SOS */
@@ -2290,7 +2298,7 @@ ata_raid_intel_write_meta(struct ar_softc *rdp)
bcopy(atadev->param.serial, meta->disk[disk].serial,
sizeof(rdp->disks[disk].serial));
meta->disk[disk].sectors = rdp->disks[disk].sectors;
- meta->disk[disk].id = (ch->unit << 16) | ATA_DEV(atadev->unit);
+ meta->disk[disk].id = (ch->unit << 16) | atadev->unit;
}
else
meta->disk[disk].sectors = rdp->total_sectors / rdp->width;
@@ -3315,7 +3323,7 @@ ata_raid_promise_write_meta(struct ar_softc *rdp)
device_get_softc(device_get_parent(rdp->disks[disk].dev));
meta->raid.channel = ch->unit;
- meta->raid.device = ATA_DEV(atadev->unit);
+ meta->raid.device = atadev->unit;
meta->raid.disk_sectors = rdp->disks[disk].sectors;
meta->raid.disk_offset = rdp->offset_sectors;
}
@@ -3403,7 +3411,7 @@ ata_raid_promise_write_meta(struct ar_softc *rdp)
device_get_softc(rdp->disks[drive].dev);
meta->raid.disk[drive].channel = ch->unit;
- meta->raid.disk[drive].device = ATA_DEV(atadev->unit);
+ meta->raid.disk[drive].device = atadev->unit;
}
meta->raid.disk[drive].magic_0 =
PR_MAGIC0(meta->raid.disk[drive]) | timestamp.tv_sec;
@@ -3729,7 +3737,7 @@ ata_raid_sis_write_meta(struct ar_softc *rdp)
struct ata_channel *ch =
device_get_softc(device_get_parent(rdp->disks[disk].dev));
struct ata_device *atadev = device_get_softc(rdp->disks[disk].dev);
- int disk_number = 1 + ATA_DEV(atadev->unit) + (ch->unit << 1);
+ int disk_number = 1 + atadev->unit + (ch->unit << 1);
meta->disks |= disk_number << ((1 - disk) << 2);
}
@@ -3767,7 +3775,7 @@ ata_raid_sis_write_meta(struct ar_softc *rdp)
bcopy(atadev->param.model, meta->model, sizeof(meta->model));
/* XXX SOS if total_disks > 2 this may not float */
- meta->disk_number = 1 + ATA_DEV(atadev->unit) + (ch->unit << 1);
+ meta->disk_number = 1 + atadev->unit + (ch->unit << 1);
if (testing || bootverbose)
ata_raid_sis_print_meta(meta);
OpenPOWER on IntegriCloud