Re: After install - Fatal trap 18 ATA problem?

From: Søren Schmidt <sos_at_deepcore.dk>
Date: Sun, 16 Jul 2006 12:29:24 +0200
Anish Mistry wrote:
> On Friday 30 June 2006 22:14, Anish Mistry wrote:
>   
>> 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;
>>     }
>>     
> Do you have an ETA on committing this fix?  Or is there something 
> wrong with the change?
>   

I've been out-of-office for the last week so thats why...

It needs a bit more refinement to be on the safe side however, I'll get 
it in there, no worries...

-Søren
> Thanks,
>
>   
Received on Sun Jul 16 2006 - 08:29:26 UTC

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