Re: Oops in get_hash_table

Linus Torvalds (torvalds@cs.helsinki.fi)
Fri, 26 Jul 1996 10:25:04 +0300 (EET DST)


On Thu, 25 Jul 1996, Uwe Bonnes wrote:
>
> Today I tried to install a ISDN teles 16.3 card. As
> Documentation/isdn/README gives wrong parameters, I loaded and
> unloaded the teles module many times. When I found out that README
> was out of sync with the code, I wanted to open emacs-19.31 to
> change readme. When doing so, I got a segmentation fault. Trying to
> open emacs another time then hanged.

Ok, this crash _looks_ like the internal kernel buffer cache data structures
got corrupted, and when the linked list of hash structures gets corrupted
you'll see ugly things when some process tries to look up a page. The problem
is that it's not the access itself that is the problem, the corruption
happened earlier.

I'm rather inclined to blame the ISDN code: I don't consider that really
stable. I should probably have put the ISDN question as a experimental
option, because it was added so late in the 1.3.x tree..

> Using `/usr/src/linux/System.map' to map addresses to symbols.
>
> >>EIP: 1229f4 <get_hash_table+30/b4>
> Trace: 124005 <brw_page+129/350>
> Trace: 155849 <ext2_bmap+d9/24c>
> Trace: 12443b <generic_readpage+7b/88>
> Trace: 11b58f <filemap_nopage+117/2ac>
> Trace: 11b699 <filemap_nopage+221/2ac>
> Trace: 118c30 <do_no_page+104/344>
> Trace: 10fbab <do_page_fault+13f/29c>
>
> Code: 1229f4 <get_hash_table+30/b4> cmpl %ebp,(%eax)
> Code: 1229f6 <get_hash_table+32/b4> jne 122a20 <get_hash_table+5c/b4>
> Code: 1229f8 <get_hash_table+34/b4> cmpw %bx,0x4(%eax)
> Code: 1229fc <get_hash_table+38/b4> jne 122a20 <get_hash_table+5c/b4>

This is the code in "find_buffer()" (which is a inline function, so
that's why it shows up in get_hash_table()) that just goes through the
linked list of buffer hashes and checks

if (tmp->b_blocknr == block && tmp->b_dev == dev)
...

where "tmp" is some corrupted pointer (I can't say what it looks like,
because you don't include the register information from the dump).

Linus