kern/102211: [ata] detach raid member and reboot will cause panic
(ICH7)
Yoichi NAKAYAMA
yoichi at FreeBSD.org
Fri Aug 18 03:00:31 UTC 2006
>Number: 102211
>Category: kern
>Synopsis: [ata] detach raid member and reboot will cause panic (ICH7)
>Confidential: no
>Severity: critical
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Aug 18 03:00:30 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator: Yoichi NAKAYAMA
>Release: 7-current
>Organization:
FreeBSD.org
>Environment:
FreeBSD suigei.local-net 7.0-CURRENT FreeBSD 7.0-CURRENT #11: Thu Aug 17 23:51:38 JST 2006 yoichi at suigei.local-net:/usr/obj/usr/src/sys/GENERIC_DEBUG i386
>Description:
I have raid array with ICH7.
Reboot system after detaching member disk will cause panic
(as noted in kern/97624).
The metadata on the left disk is:
********* ATA Intel MatrixRAID Metadata *********
intel_id <Intel Raid ISM Cfg Sig. >
version <1.1.00>
checksum 0x5f8caa2c
config_size 0x000001e0
config_id 0x44e526fa
generation 0x0000007e
total_disks 2
total_volumes 1
DISK# serial disk_sectors disk_id flags
0 <V591P8FG> 490234752 0x00000000 0x0000013a
1 <:0> 490229760 0xffffffff 0x00000006
name Volume0
total_sectors 490229760
state 12
reserved 0
offset 0
disk_sectors 490229760
stripe_count 1914960
stripe_sectors 128
status 2
type RAID1
total_disks 2
magic[0] 0x02
magic[1] 0x01
magic[2] 0x01
disk 0 at disk_idx 0x00000000
disk 1 at disk_idx 0x01000001
=================================================
where higher bits of disk_idx for detached one causes access vaiolation.
related part of dmesg:
atapci2: <Intel ICH7M SATA300 controller> port 0xe080-0xe087,0xe000-0xe003,0xdc00-0xdc07,0xd880-0xd883,0xd800-0xd80f mem 0xffa37800-0xffa37bff irq 19 at device 31.2 on pci0
ad10: 239372MB <Maxtor 7V250F0 VA111630> at ata5-master SATA150
ad14: 239372MB <Maxtor 7V250F0 VA111630> at ata7-master SATA150
ar0: disk0 READY (master) using ad10 at ata5-master
ar0: disk1 READY (mirror) using ad14 at ata7-master
attached change avoids panic, but detached disk forms separate volume as
ar0: WARNING - mirror protection lost. RAID1 array in DEGRADED mode
ar0: 239370MB <Intel MatrixRAID RAID1> status: DEGRADED
ar0: disk0 READY (master) using ad10 at ata5-master
ar0: disk1 DOWN no device found for this subdisk
ar1: WARNING - mirror protection lost. RAID1 array in DEGRADED mode
ar1: 239370MB <Intel MatrixRAID RAID1> status: DEGRADED
ar1: disk0 DOWN no device found for this subdisk
ar1: disk1 READY (mirror) using ad14 at ata7-master
so we have to call "atacontrol delete ar1" before addspare and rebuild,
while "Intel(R) Matrix Storage Manager option ROM v5.7.0.1005 ICH7MR" shows
single volume as:
RAID Volumes:
ID Name Level Strip Size Status Bootable
0 Volume0 RAID1(Mirror) N/A 233.8GB Degraded Yes
Physical Disks:
Port Drive Model Serial # Size Type/Status(Vol ID)
0 Maxtor 7V250F0 V591P8FG 233.8GB Member Disk(0)
2 Maxtor 7V250F0 V591PNAG 233.8GB Offline Member
On Windows XP, Intel Matrix Storage Console shows single RAID volume with one disk (port 0) and separate non-RAID disk (port 2).
>How-To-Repeat:
# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad10 ad14 status: READY
# atacontrol detach ata7
# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad10 DOWN status: DEGRADED
# reboot
>Fix:
Masking disk_idx avoids panic
*** /usr/src/sys/dev/ata/ata-raid.c.orig Sat Apr 15 19:27:41 2006
--- /usr/src/sys/dev/ata/ata-raid.c Thu Aug 10 07:37:28 2006
***************
*** 2122,2143 ****
/* clear out any old info */
for (disk = 0; disk < raid->total_disks; disk++) {
raid->disks[disk].dev = NULL;
! bcopy(meta->disk[map->disk_idx[disk]].serial,
raid->disks[disk].serial,
sizeof(raid->disks[disk].serial));
raid->disks[disk].sectors =
! meta->disk[map->disk_idx[disk]].sectors;
raid->disks[disk].flags = 0;
! if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_ONLINE)
raid->disks[disk].flags |= AR_DF_ONLINE;
! if (meta->disk[map->disk_idx[disk]].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[map->disk_idx[disk]].flags & INTEL_F_DOWN)
raid->disks[disk].flags &= ~AR_DF_ONLINE;
}
}
--- 2122,2144 ----
/* 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[disk_idx].serial,
raid->disks[disk].serial,
sizeof(raid->disks[disk].serial));
raid->disks[disk].sectors =
! meta->disk[disk_idx].sectors;
raid->disks[disk].flags = 0;
! if (meta->disk[disk_idx].flags & INTEL_F_ONLINE)
raid->disks[disk].flags |= AR_DF_ONLINE;
! if (meta->disk[disk_idx].flags & INTEL_F_ASSIGNED)
raid->disks[disk].flags |= AR_DF_ASSIGNED;
! if (meta->disk[disk_idx].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_DOWN)
raid->disks[disk].flags &= ~AR_DF_ONLINE;
}
}
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list