Re: After install - Fatal trap 18 ATA problem?

From: Anish Mistry <mistry.7_at_osu.edu>
Date: Fri, 30 Jun 2006 22:14:48 -0400
On Friday 30 June 2006 17:33, you wrote:
> Anish Mistry wrote:
> > On Friday 30 June 2006 16:54, you wrote:
> >> Anish Mistry wrote:
> >>>> No, it fell through the cracks somewhere...
> >>>>
> >>>> Do you still have the HW in question so tests can be done ?
> >>>
> >>> Yes, in the exact same configuration
> >>
> >> OK, so lets start over, I've not been following this, could you
> >> get me a dmesg from a verbose booted system please ?
> >> It fails because the disk geometry is invalid right ?
> >
> > http://am-productions.biz/docs/boot-panic-script.txt.gz
> >
> > The email I sent earlier today contains all of the details
> > including the above link.  Let me know if you need further
> > clarification.
>
> OK, in ata-disk.c::ad_attach the following lines is around line
> 100:
>
>     if (atadev->param.atavalid & ATA_FLAG_54_58) {
>         adp->heads = atadev->param.current_heads;
>         adp->sectors = atadev->param.current_sectors;
>         adp->total_secs = (u_int32_t)atadev->param.current_size_1 |
>                           ((u_int32_t)atadev->param.current_size_2
> << 16); }
>     else {
>         adp->heads = atadev->param.heads;
>         adp->sectors = atadev->param.sectors;
>         adp->total_secs = atadev->param.cylinders * adp->heads *
> adp->sectors;
>     }
>
> It would seem that the wrong way of getting at the cyl/head/sector
> is used for your disk.
> My guess is that ->param.current_* isn't set correctly in your disk
> (firmware / BIOS mishap), so we need to take the old defaults
> instead. That is instead of relying on good values as the
> ATA_FLAG_54_58 was supposed to say, we also need to check the
> values for sane settings.
>
> I just love how hard it is to understand the word "shall" in
> standards, sigh....
Changing that bit to the following fixed it and allows it to boot.

    if (atadev->param.atavalid & ATA_FLAG_54_58) {
	adp->heads = atadev->param.current_heads;
	adp->sectors = atadev->param.current_sectors;
	adp->total_secs = (u_int32_t)atadev->param.current_size_1 |
			  ((u_int32_t)atadev->param.current_size_2 << 16);
    }
    if (!(atadev->param.atavalid & ATA_FLAG_54_58) ||
	((atadev->param.atavalid & ATA_FLAG_54_58) && (adp->heads == 0 || 
adp->sectors == 0))) {
	adp->heads = atadev->param.heads;
	adp->sectors = atadev->param.sectors;
	adp->total_secs = atadev->param.cylinders * adp->heads * 
adp->sectors;  
    }

Thanks,

-- 
Anish Mistry

Received on Sat Jul 01 2006 - 00:15:07 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:57 UTC