kern/102210: [ar] reboot system makes rebuilding array ready
(ICH7)
Stef Walter
stef at memberwebs.com
Thu Mar 20 06:50:02 UTC 2008
The following reply was made to PR kern/102210; it has been noted by GNATS.
From: Stef Walter <stef at memberwebs.com>
To: bug-followup at FreeBSD.org, yoichi at FreeBSD.org
Cc:
Subject: Re: kern/102210: [ar] reboot system makes rebuilding array ready
(ICH7)
Date: Thu, 20 Mar 2008 06:25:56 +0000 (UTC)
This is a multi-part message in MIME format.
--------------090705010509010508020100
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
This occurs because when loading the intel matrix raid data, we don't
set the AR_DF_ONLINE and AR_DF_ASSIGNED correctly. Specifically:
* AR_DF_ONLINE should not be set on a disk just because a disk
serial number matches.
* AR_DF_ASSIGNED should be set for spares (see ata_raid_addspare)
Patch attached, intertwined with patch for kern/102211 (vital patch for
the nasty panic).
--------------090705010509010508020100
Content-Type: text/x-patch;
name="intel-matrix-raid-rebuild.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="intel-matrix-raid-rebuild.patch"
--- sys/dev/ata/ata-raid.c.orig 2008-03-19 11:20:15.000000000 +0000
+++ sys/dev/ata/ata-raid.c 2008-03-19 21:53:37.000000000 +0000
@@ -2157,22 +2165,23 @@
/* clear out any old info */
for (disk = 0; disk < raid->total_disks; disk++) {
+ u_int32_t disk_idx = map->disk_idx[disk] & 0xffff;
raid->disks[disk].dev = NULL;
- bcopy(meta->disk[map->disk_idx[disk]].serial,
+ bcopy(meta->disk[disk_idx].serial,
raid->disks[disk].serial,
sizeof(raid->disks[disk].serial));
raid->disks[disk].sectors =
- meta->disk[map->disk_idx[disk]].sectors;
+ meta->disk[disk_idx].sectors;
raid->disks[disk].flags = 0;
- if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_ONLINE)
+ if (meta->disk[disk_idx].flags & INTEL_F_ONLINE)
raid->disks[disk].flags |= AR_DF_ONLINE;
- if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_ASSIGNED)
+ if (meta->disk[disk_idx].flags & INTEL_F_ASSIGNED)
raid->disks[disk].flags |= AR_DF_ASSIGNED;
- if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_SPARE) {
- raid->disks[disk].flags &= ~(AR_DF_ONLINE | AR_DF_ASSIGNED);
- raid->disks[disk].flags |= AR_DF_SPARE;
+ if (meta->disk[disk_idx].flags & INTEL_F_SPARE) {
+ raid->disks[disk].flags &= ~AR_DF_ONLINE;
+ raid->disks[disk].flags |= (AR_DF_SPARE | AR_DF_ASSIGNED);
}
- if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_DOWN)
+ if (meta->disk[disk_idx].flags & INTEL_F_DOWN)
raid->disks[disk].flags &= ~AR_DF_ONLINE;
}
}
@@ -2183,7 +2192,7 @@
if (!strncmp(raid->disks[disk].serial, atadev->param.serial,
sizeof(raid->disks[disk].serial))) {
raid->disks[disk].dev = parent;
- raid->disks[disk].flags |= (AR_DF_PRESENT | AR_DF_ONLINE);
+ raid->disks[disk].flags |= AR_DF_PRESENT;
ars->raid[raid->volume] = raid;
ars->disk_number[raid->volume] = disk;
retval = 1;
--------------090705010509010508020100--
More information about the freebsd-bugs
mailing list