[ENBD] (Fixed) FR1-2.15b and unknown symbol __udivdi3
Graham Clinch
g.clinch at lancaster.ac.uk
Fri Feb 17 13:55:14 MST 2006
Quick answer for people who don't want to read the whole lot.. I
fixed the problem by using FR1-2.17, rather than FR1-2.15b,,
On 17 Feb 2006, at 07:43, Peter T. Breuer wrote:
> "Also sprach Graham Clinch:"
>> I've tried to use the FR1-2.15b patch against 2.6.8, and the patch
>> applies happily, and indeed, compiles happily. However, when I try
>> to modprobe md:
>
> What architecture? And compiler?
This is x86, using gcc (GCC) 3.3.5 (Debian 1:3.3.5-13)
>> dtfsa301:~# nm /lib/modules/2.6.8/kernel/drivers/md/md.ko | grep udiv
>> U __udivdi3
>> dtfsa301:~#
>>
>> So it's definitely somewhere within md, rather than a dependency.
>>
>> Actually, might it be the line
>>
>> disk_events <<= 32;
>
> Shifts are not optimised to division, and this one would be a
> multiplicaton.
Good job I don't have to write C for a living!
>> (Line 1786 of the patch), as guess the compiler (gcc version 3.3.5
>> (Debian 1:3.3.5-13)) may be optimizing it to a lot of divide-by-
>> twos. My C is rusty, so even if it is this line, I'm not sure what
>> would make a good fixup..
>>
>> I've tried using md (raid1) without the FR1 patch applied, and
>> everything seems happy, the module loads and I can control arrays, so
>> I'm guessing it's got to be somewhere in the patch
>>
>> Any hints welcome!
>
> Well, I'd just be grepping for a "/" or a "%". You should be able to
> decompile the object module with objdump -disassemble and find out
> which
> function the udivdi3 is in. You can locate roughly where in the
> code it
> is by loking for calls to external routines in the disassembly and the
> source code. Then one can locate the line precisely by commmenting out
> bits of source and recmpiling.
>
> I'll just have a read of the md.c part of that patch ...
>
> I see nothing.
>
> Oh, it MUST be this line:
>
> realspeed = (j - mddev->resync_mark_cnt - atomic_read
> (&md_throttle[mddev->md_minor]))/2/((jiffies-mddev->resync_mark)/HZ
> +1) +1;
>
> I see that I changed it in 2.17 to
>
> realspeed = ((unsigned long)(j - mddev->resync_mark_cnt -
> atomic_read(&md_throttle[mddev->md_minor])))/2/((jiffies-mddev-
> >resync_mark)/HZ +1) +1;
>
> Even though I don't see a long long, why else would I have done that
> recasting?
Well, I've tried with 2.17 and I can now load md and it's all looking
good. This is entirely my fault for downloading 2.15b. From the
looks of it, I went for the link 'fr1-2.current.tgz', which is
currently pointing at 2.15b, rather than 2.17. This is a lesson in
not trusting symlinks..
Thanks for your help,
Graham
More information about the ENBD
mailing list