Date: Thu, 20 Mar 2008 06:50:02 GMT From: Stef Walter <stef@memberwebs.com> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/102210: [ar] reboot system makes rebuilding array ready (ICH7) Message-ID: <200803200650.m2K6o2Z4002402@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/102210; it has been noted by GNATS. From: Stef Walter <stef@memberwebs.com> To: bug-followup@FreeBSD.org, yoichi@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--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803200650.m2K6o2Z4002402>