█ ATAドライバによるHDD相性問題
ATA ドライバによる HD ドライブ相性問題
目次 †
技術情報 †
Seagate 製 Barracuda 7200.7 (160GB) / Barracuda 7200.7 Plus (200GB) 、日立 (HGST) 製 P7K500 シリーズ等と、Intel 製等の ATA ドライバとの相性問題が報告されている。
- 対象ドライブ
- Seagate: ST3160827AS / ST3160023AS / ST3160021AS 等
- Seagete: ST3200822A / ST3200021A 等
- HGST: HDP7250xxGLA360/380 等
- 原因
- LBA28/48bit を動的に切り替えるドライバで、LBA28 でセクタアドレス 0x0FFFFFFF (規格外)を指定した時にエラーとなる。
- HDDの仕様は規格に準拠しているが、ドライバが規格に違反したセクタアドレスを指定する為に発生する。
- 純粋にドライバ・ソフトの問題であり、チップセットとは無関係である。
- 障害内容
- ビッグ・ドライブ(通常137GB)境界を跨いでFormatするとフリーズする、CHKDSKでエラーになる等。
- DiskProbe にてセクタ 268435455 (0xFFFFFFF) を読むと、エラー/セクタ0と同じ内容/ランダムに内容が変わる等。
- CygwinやUNIX環境では「dd if=/dev/sda bs=512 count=128 skip=268435400 > /dev/null」でエラー?
- FreeBSD 系では 6.3-Release / 7.0-Release、FreeNAS 系では 0.69Beta 以降で、ソースコードが修正されている。
/sys/dev/ata/ata-all.c
--- src/sys/dev/ata/ata-all.c 2007/02/23 16:25:08 1.279
+++ src/sys/dev/ata/ata-all.c 2007/10/04 19:17:15 1.280
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/dev/ata/ata-all.c,v 1.279 2007/02/23 16:25:08 jhb Exp $");
+__FBSDID("$FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/dev/ata/ata-all.c,v 1.280 2007/10/04 19:17:15 sos Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -738,7 +738,7 @@ ata_modify_if_48bit(struct ata_request *
atadev->flags &= ~ATA_D_48BIT_ACTIVE;
- if ((request->u.ata.lba >= ATA_MAX_28BIT_LBA ||
+ if (((request->u.ata.lba + request->u.ata.count) >= ATA_MAX_28BIT_LBA ||
request->u.ata.count > 256) &&
atadev->param.support.command2 & ATA_SUPPORT_ADDRESS48) {
- FreeBSD 系では、2004年10月に Snap Shot で不具合が指摘されたが、正式のRelease版には盛り込まれないという不幸な歴史があった。
/usr/src/sys/dev/ata/ata-lowlevel.c
--- ata-lowlevel.c.orig Fri Oct 29 12:06:09 2004
+++ ata-lowlevel.c Fri Oct 29 12:05:38 2004
@@ -700,7 +700,7 @@
ATA_IDX_OUTB(atadev->channel, ATA_ALTSTAT, ATA_A_4BIT);
/* only use 48bit addressing if needed (avoid bugs and overhead) */
- if ((lba > 268435455 || count > 256) && atadev->param &&
+ if ((lba > 268435454 || count > 256) && atadev->param &&
atadev->param->support.command2 & ATA_SUPPORT_ADDRESS48) {
/* translate command into 48bit version */
2ch 過去ログ †
P7K500問題検証 2
html
【format X】P7K500問題検証【CHKDSK X】
html