Kernel Bug in Journal.c

From: Wolfpaw - Dale Corse
Date: Mon Dec 15 2003 - 15:23:13 EST


Greetings,

We are getting this error using 2.4.23 on reiserfs, with the
reiser quota patches, and grsecurity patches. I have no idea
what it is :(

kernel BUG at journal.c:869!
invalid operand: 0000
CPU: 0
EIP: 0010:[<c02401c7>] Not tainted
EFLAGS: 00010246
eax: 00000000 ebx: 0161e62c ecx: df41c540 edx: de195480
esi: de195480 edi: 0161e62c ebp: dfe27000 esp: c15bddfc
ds: 0018 es: 0018 ss: 0018
Process kupdated (pid: 6, stackpage=c15bd000)
Stack: c0353330 c01d60a2 c010cb80 de195280 de195280 00000012 dfe27000
c023fc62
dfe27000 00000000 00000000 00000004 dfe27000 0161e62c 00000002
c0244723
dfe27000 de195480 00000001 de195298 de195480 00000004 00000002
00000000
Call Trace: [<c01d60a2>] [<c023fc62>] [<c0244723>] [<c02450f6>]
[<c02d40b3>]
[<c02438db>] [<c019dd36>] [<c024444a>] [<c0230caf>] [<c01da2db>]
[<c01d974c>]
[<c01d9a9e>] [<c019dd36>] [<c019f626>] [<c01d9990>] [<c019d9ae>]
[<c01d9990>]

Code: 0f 0b 65 03 99 29 35 c0 eb e4 8b 85 f8 00 00 00 3b 58 20 0f

It also causes kupdated to go defunct, and we lose the ability to use
sync,
or unmount a filesystem. (Reboot must be done with the reset switch
:()

If anyone has any ideas, please drop me a line. I am not subscribed,
so
please CC responses to admin@xxxxxxxxxxx

Thanks in advance for your time,
Dale.

The offending block of code is:

static int flush_commit_list(struct super_block *s, struct
reiserfs_journal_list *jl, int flushall) {
int i, count ;
int bn ;
int retry_count = 0 ;
int orig_commit_left = 0 ;
struct buffer_head *tbh = NULL ;
unsigned long trans_id = jl->j_trans_id;

reiserfs_check_lock_depth("flush_commit_list") ;

if (atomic_read(&jl->j_older_commits_done)) {
if (!list_empty(&jl->j_ordered_bh_list))
BUG();
if (!list_empty(&jl->j_tail_bh_list))
BUG();
return 0 ;
}

/* before we can put our commit blocks on disk, we have to make sure
everyone older than
** us is on disk too
*/
if (jl->j_len <= 0) {
--> BUG();
return 0 ;
}
if (trans_id == SB_JOURNAL(s)->j_trans_id)
BUG();

get_journal_list(jl);

/* write any buffers that must hit disk before the commit is done */
write_ordered_buffers(&jl->j_ordered_bh_list, &jl->j_wait_bh_list);

if (flushall) {
if (flush_older_commits(s, jl) == 1) {
/* list disappeared during flush_older_commits. return */
goto put_jl;
}
}

--------------------------------
Dale Corse
System Administrator
Wolfpaw Services Inc.
http://www.wolfpaw.net
(780) 474-4095

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/