kern/72478: ata: dd destroy FreeBSD raid header
Daisuke Takahashi
takaha at mue.biglobe.ne.jp
Sun Oct 10 03:30:21 PDT 2004
>Number: 72478
>Category: kern
>Synopsis: ata: dd destroy FreeBSD raid header
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sun Oct 10 10:30:20 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator: Daisuke Takahashi
>Release: FreeBSD 5.3-BETA7
>Organization:
personal
>Environment:
FreeBSD mika-l.lodaldomain 5.3-BETA7 FreeBSD 5.3-BETA7 #1: Sun Oct 10 17:42:06 JST 2004 root at mika-l.lodaldomain:/usr/src/sys/i386/compile/GENERIC i386
- - -
Oct 10 16:33:58 mika-l kernel: ad1: 102MB <VMware Virtual IDE Hard Drive/00000001> [208/16/63] at ata0-slave UDMA33
Oct 10 16:33:58 mika-l kernel: ad3: 204MB <VMware Virtual IDE Hard Drive/00000001> [416/16/63] at ata1-slave UDMA33
>Description:
I created ar0 as follow.
# atacontrol create SPAN ad1 ad3
syslog as follow
Oct 10 16:36:31 mika-l kernel: ar0: 204MB <ATA SPAN array> [26/255/63] status: READY subdisks:
Oct 10 16:36:31 mika-l kernel: disk0 READY on ad1 at ata0-slave
Oct 10 16:36:31 mika-l kernel: disk1 READY on ad3 at ata1-slave
But when I use entire space of ar0, ar0 reports "ar0: ERROR - array broken" at next boot time.
Oct 10 16:39:41 mika-l kernel: ar0: ERROR - array broken
Oct 10 16:39:41 mika-l kernel: ar0: 204MB <ATA SPAN array> [26/255/63] status: BROKEN subdisks:
Oct 10 16:39:41 mika-l kernel: disk0 DOWN no device found for this disk
Oct 10 16:39:41 mika-l kernel: disk1 READY on ad3 at ata1-slave
>How-To-Repeat:
1. create ar0 as SPAN disk
# atacontrol create SPAN ad1 ad3
2. write '0' to entire ar0
# dd if=/dev/zero of=/dev/ar0 bs=64k
3. reboot
>Fix:
--- ata-raid.c.orig Tue Jan 27 14:53:19 2004
+++ ata-raid.c Thu Sep 30 15:55:23 2004
@@ -556,9 +560,9 @@
switch (rdp->flags & (AR_F_RAID0 | AR_F_RAID1 | AR_F_SPAN)) {
case AR_F_SPAN:
lba = blkno;
- while (lba >= AD_SOFTC(rdp->disks[drv])->total_secs-rdp->reserved)
- lba -= AD_SOFTC(rdp->disks[drv++])->total_secs-rdp->reserved;
- chunk = min(AD_SOFTC(rdp->disks[drv])->total_secs-rdp->reserved-lba,
+ while (lba >= rdp->disks[drv].disk_sectors)
+ lba -= rdp->disks[drv++].disk_sectors;
+ chunk = min(rdp->disks[drv].disk_sectors-lba,
count);
break;
@@ -670,9 +674,9 @@
switch (rdp->flags & (AR_F_RAID0 | AR_F_RAID1 | AR_F_SPAN)) {
case AR_F_SPAN:
lba = blkno;
- while (lba >= AD_SOFTC(rdp->disks[drv])->total_secs-rdp->reserved)
- lba -= AD_SOFTC(rdp->disks[drv++])->total_secs-rdp->reserved;
- chunk = min(AD_SOFTC(rdp->disks[drv])->total_secs-rdp->reserved-lba,
+ while (lba >= rdp->disks[drv].disk_sectors)
+ lba -= rdp->disks[drv++].disk_sectors;
+ chunk = min(rdp->disks[drv].disk_sectors-lba,
count);
break;
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list