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