diff options
author | sos <sos@FreeBSD.org> | 2008-03-20 11:54:26 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2008-03-20 11:54:26 +0000 |
commit | c69ad0290e26f599bd79a92d1ad1ed33793187a7 (patch) | |
tree | 64514b2d451312eb09bf1c4f8930e58bc6c9cf2a /sys/dev/ata/ata-raid.c | |
parent | 735c62ce43b9438d0c6fe5b5068e036d45666d3f (diff) | |
download | FreeBSD-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.c | 30 |
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(×tamp); + if (!rdp->magic_0) { + microtime(×tamp); + 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); |