Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

hdparm oder Kernel - wer sagt die Wahrheit?

12 views
Skip to first unread message

Thomas Antepoth

unread,
Aug 29, 2006, 8:20:04 AM8/29/06
to
Hallo miteinander,


zwei hdparm-Aufrufe - zwei Ergebnisse - soweit es die Plattengeometrie
betrifft:

root@gitti:~# hdparm /dev/hda
/dev/hda:
multcount = 16 (on)
IO_support = 1 (32-bit)
unmaskirq = 1 (on)
using_dma = 1 (on)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 256 (on)
geometry = 65535/16/63, sectors = 78165361, start = 0

root@gitti:~# hdparm -I /dev/hda

/dev/hda:

ATA device, with non-removable media
Model Number: ST340823A
Serial Number: 7EF0Y1ET
Firmware Revision: 3.05
Standards:
Supported: 4 3 2
Likely used: 6
Configuration:
Logical max current
cylinders 16383 4047
heads 16 16
sectors/track 63 255
--
CHS current addressable sectors: 16511760
LBA user addressable sectors: 78165360


Anlass der Nachforschung: Diese Fehlermeldung hier taucht nur beim Booten
auf:

ide1 at 0x170-0x177,0x376 on irq 15
hda: max request size: 128KiB
hda: Host Protected Area detected.
current capacity is 78165360 sectors (40020 MB)
native capacity is 78165361 sectors (40020 MB)
hda: Host Protected Area disabled.
hda: 78165361 sectors (40020 MB) w/1024KiB Cache, CHS=65535/16/63, UDMA(100)
hda: hda1 hda2
hdc: ATAPI 48X DVD-ROM drive, 512kB Cache, UDMA(33)
Uniform CD-ROM driver Revision: 3.20
hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
hda: dma_intr: error=0x10 { SectorIdNotFound }, LBAsect=78165360, sector=78165360
ide: failed opcode was: unknown

Die Platte hat 0 reallocated Blocks, badblocks findet nichts, es ist ein
80-poliges Kabel an der Platte, sie ist das einzige Gerät am Bus und
eigentlich ist alles bestens.

Das Board ist ein ASROCK K7S8X Bios 2.60. Der Kernel ein 2.6.17
plain vanilla und das System Debian-Etch.

Bei der Angabe "sector=78165360" wird man stutzig. Das ist der letzte vom
User benutzbare Sektor der Platte - vorausgesetzt man fängt bei 1 zu
zählen an. Irgendwer sagt hier also dem Kernel nicht ganz die Wahrheit.

Oder ist hier noch ein Kernel-Bug beim Abschalten der HPA vergraben?

t++

Paul Puschmann

unread,
Aug 29, 2006, 8:40:06 AM8/29/06
to
Hi,
das Problem habe ich auch, allerdings nur mit zwei Platten an einem
Promise-IDE-Controller. Das Problem konnte ich bisher auch noch nicht
loesen und ich hatte ehrlich gesagt auch noch keine Lust dazu.

Die Meldungen tauchen bei mir auch nur sproradisch beim Booten auf.

Paul

signature.asc

Thomas Antepoth

unread,
Aug 29, 2006, 1:20:12 PM8/29/06
to
On Tue, 29 Aug 2006, Paul Puschmann wrote:

> > ide1 at 0x170-0x177,0x376 on irq 15
> > hda: max request size: 128KiB
> > hda: Host Protected Area detected.
> > current capacity is 78165360 sectors (40020 MB)
> > native capacity is 78165361 sectors (40020 MB)
> > hda: Host Protected Area disabled.

Das Datenblatt von Seagate[1] sagt, daß der obere Zahlenwert richtig ist:

SECTORS PER DRIVE (LBA mode) _____________78,165,360

Daher dürfte bei einer bei 0 beginnenden Zählung maximal der
Sektor 78.165.359 angesprochen werden. Außer der Host Protected-Kram wird
abgeschaltet (was irgendwie nicht zu funktionieren scheint). Dann wird
natürlich 78.165.360 adressiert.

Augenblicklich sieht das für mich wie ein Firmware-Bug in der Platte aus,
die einen um 1 zu hohen Wert zurückliefert.

Ich habe mal ein wenig in den Kernel-Sourcen gegraben und folgendes
herausgefunden:

Das Abschalten der HPA findet in der ide-disk.c in der Funktion
idedisk_set_max_address() bzw. in der idedisk_set_max_address_ext() statt.

Das Auslesen der Plattenparameter findet in
idedisk_read_native_max_address_ext() bzw. in
idedisk_read_native_max_address() statt.

In dem idedisk_read_*() ist in der Tat auch ein addr++ zu finden, das
einen um 1 erhöhten Wert des von der Platte gelieferten
maximalen Sektors zurückliefert. Auskommentieren von dem Inkrement ist
zwar eklig - aber etwas klügeres fiel mir erst mal nicht ein, da ich den
Wirkungszusammenhang in der ide-disk.c noch nicht so ganz im
Detail verstanden habe.


> > hda: 78165361 sectors (40020 MB) w/1024KiB Cache, CHS=65535/16/63, UDMA(100)
> > hda: hda1 hda2
> > hdc: ATAPI 48X DVD-ROM drive, 512kB Cache, UDMA(33)
> > Uniform CD-ROM driver Revision: 3.20
> > hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
> > hda: dma_intr: error=0x10 { SectorIdNotFound }, LBAsect=78165360, sector=78165360
> > ide: failed opcode was: unknown
> >
> Hi,
> das Problem habe ich auch, allerdings nur mit zwei Platten an einem
> Promise-IDE-Controller. Das Problem konnte ich bisher auch noch nicht
> loesen und ich hatte ehrlich gesagt auch noch keine Lust dazu.

Die Meldungen waren früher auch schon mal - aber der Rechner wurde nur 14
mal insgesamt gebootet. Da konnte man schon damit leben. Die Platte soll
nun aber in ein Desktop. Dort ist die Sichtbarkeit dieses Fehlers dann
schon etwas gravierender, wenn bei jedem Systemstart diese ziemlich
beängstigenden (aber harmlosen) Meldungen vorbeihuschen.

> Die Meldungen tauchen bei mir auch nur sproradisch beim Booten auf.

Reboots sind für Kernel-Updates und Hardware-Tausch. 14 x booten in ca.
drei Jahren sollten für sich sprechen... ;-)


t++


[1] http://www.seagate.com/support/disc/specs/ata/st340823a.html

Thomas Antepoth

unread,
Aug 29, 2006, 5:40:15 PM8/29/06
to
> Ich habe mal ein wenig in den Kernel-Sourcen gegraben und folgendes
> herausgefunden:
>
> Das Abschalten der HPA findet in der ide-disk.c in der Funktion
> idedisk_set_max_address() bzw. in der idedisk_set_max_address_ext() statt.
>
> Das Auslesen der Plattenparameter findet in
> idedisk_read_native_max_address_ext() bzw. in
> idedisk_read_native_max_address() statt.
>
> In dem idedisk_read_*() ist in der Tat auch ein addr++ zu finden, das
> einen um 1 erhöhten Wert des von der Platte gelieferten
> maximalen Sektors zurückliefert. Auskommentieren von dem Inkrement ist
> zwar eklig - aber etwas klügeres fiel mir erst mal nicht ein, da ich den
> Wirkungszusammenhang in der ide-disk.c noch nicht so ganz im
> Detail verstanden habe.


Egal ob eklig, unverstanden oder was auch immer: Der schnelle Erfolg gibt
einem Recht. ;-)

Die Meldungen vom Boot:

SIS5513: SiS 962/963 MuTIOL IDE UDMA133 controller
ide0: BM-DMA at 0xff00-0xff07, BIOS settings: hda:DMA, hdb:DMA
ide1: BM-DMA at 0xff08-0xff0f, BIOS settings: hdc:DMA, hdd:DMA
Probing IDE interface ide0...
hda: ST340823A, ATA DISK drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
Probing IDE interface ide1...
hdc: JLMS XJ-HD165H, ATAPI CD/DVD-ROM drive


ide1 at 0x170-0x177,0x376 on irq 15
hda: max request size: 128KiB

hda: 78165360 sectors (40020 MB) w/1024KiB Cache, CHS=65535/16/63,

UDMA(100)
hda: hda1 hda2
hdc: ATAPI 48X DVD-ROM drive, 512kB Cache, UDMA(33)
Uniform CD-ROM driver Revision: 3.20

Attempting manual resume
ReiserFS: hda1: found reiserfs format "3.6" with standard journal
ReiserFS: hda1: using ordered data mode
ReiserFS: hda1: journal params: device hda1, size 8192, journal first
block 18, max trans len 1024, max batch 900, max commit age 30, max trans age 30
ReiserFS: hda1: checking transaction log (hda1)
ReiserFS: hda1: Using r5 hash to sort names


war die Wirkungsweise von:

static unsigned long idedisk_read_native_max_address(ide_drive_t *drive)
...
/* addr++; since the return value is (maxlba - 1),

static unsigned long long idedisk_read_native_max_address_ext(ide_drive_t *drive)
...
/* addr++; since the return value is (maxlba - 1),

in der drivers/ide/ide-disk.c vom Kernel-Source in den beiden genannten
Funktionen.

Eigentlich gehört nun eine entsprechende Blacklist von Festplatten hier
implementiert, die den maximalen Sektor bei 1 statt bei 0 anfangen zu
zählen, aber für mich tut's der quick-fix wie oben angegeben.

Zu den in Frage kommenden Festplatten gehört mindestens mal die D540X-4K
von Maxtor auch dazu.


t++

Paul Puschmann

unread,
Aug 30, 2006, 6:40:09 AM8/30/06
to
Thomas Antepoth <t_ant...@antepoth.de> schrieb am Tue, Aug 29, 2006 at 11:11:39PM +0200:
> > Ich habe mal ein wenig in den Kernel-Sourcen gegraben und folgendes
> > herausgefunden:
> >
> > Das Abschalten der HPA findet in der ide-disk.c in der Funktion
> > idedisk_set_max_address() bzw. in der idedisk_set_max_address_ext() statt.
> >
> > Das Auslesen der Plattenparameter findet in
> > idedisk_read_native_max_address_ext() bzw. in
> > idedisk_read_native_max_address() statt.
> >
> > In dem idedisk_read_*() ist in der Tat auch ein addr++ zu finden, das
> > einen um 1 erhöhten Wert des von der Platte gelieferten
> > maximalen Sektors zurückliefert. Auskommentieren von dem Inkrement ist
> > zwar eklig - aber etwas klügeres fiel mir erst mal nicht ein, da ich den
> > Wirkungszusammenhang in der ide-disk.c noch nicht so ganz im
> > Detail verstanden habe.
>
>
> Egal ob eklig, unverstanden oder was auch immer: Der schnelle Erfolg gibt
> einem Recht. ;-)
>
> Die Meldungen vom Boot:
>

*snip*


>
> Eigentlich gehört nun eine entsprechende Blacklist von Festplatten hier
> implementiert, die den maximalen Sektor bei 1 statt bei 0 anfangen zu
> zählen, aber für mich tut's der quick-fix wie oben angegeben.
>
> Zu den in Frage kommenden Festplatten gehört mindestens mal die D540X-4K
> von Maxtor auch dazu.

Bei mir ist es auch eine Seagate, eine Hitachi und zwei WD800BB.

dann werd ich mal suchen.

Paul

signature.asc

Thomas Antepoth

unread,
Aug 31, 2006, 1:50:10 PM8/31/06
to
On Wed, 30 Aug 2006, Paul Puschmann wrote:

> > Eigentlich gehört nun eine entsprechende Blacklist von Festplatten hier
> > implementiert, die den maximalen Sektor bei 1 statt bei 0 anfangen zu
> > zählen, aber für mich tut's der quick-fix wie oben angegeben.
> >
> > Zu den in Frage kommenden Festplatten gehört mindestens mal die D540X-4K
> > von Maxtor auch dazu.
>
> Bei mir ist es auch eine Seagate, eine Hitachi und zwei WD800BB.
>
> dann werd ich mal suchen.

Und weil's Dir auch vor nix graust, bekommst Du auch gleich den Patch ;-)


root@gitti:/usr/src/linux/drivers/ide# diff -u ide-disk.c.orig ide-disk.c
--- ide-disk.c.orig 2006-08-30 14:54:34.000000000 +0200
+++ ide-disk.c 2006-08-30 14:55:12.000000000 +0200
@@ -355,7 +355,7 @@
| ((args.tfRegister[ IDE_HCYL_OFFSET] ) << 16)
| ((args.tfRegister[ IDE_LCYL_OFFSET] ) << 8)
| ((args.tfRegister[IDE_SECTOR_OFFSET] ));
- addr++; /* since the return value is (maxlba - 1), we add 1 */
+ /* addr++; since the return value is (maxlba - 1), we add 1 */
}
return addr;
}
@@ -384,7 +384,7 @@
((args.tfRegister[IDE_LCYL_OFFSET])<<8) |
(args.tfRegister[IDE_SECTOR_OFFSET]);
addr = ((__u64)high << 24) | low;
- addr++; /* since the return value is (maxlba - 1), we add 1 */
+ /* addr++; since the return value is (maxlba - 1), we add 1 */
}
return addr;
}

Seither ist zumindest mal beim Booten Schluss mit den SectorIdNotFound
Meldungen. Wie gesagt - eklig - aber pragmatisch.


t++

Paul Puschmann

unread,
Sep 4, 2006, 8:00:17 AM9/4/06
to

Danke. Wie war das nun, gab es schon einen Bugreport dafuer?
Waere doch sicherlich interessant, oder?

Gruss, Paul

signature.asc
0 new messages