Try this patch. It shouldn't oops now (at least not in the same place),
but check dmesg after every boot.
Thanks for your help!
Shaggy
--
David Kleikamp
IBM Linux Technology Center
diff -urp linux-2.6.15-rc1-mm2/fs/jfs/jfs_debug.c linux/fs/jfs/jfs_debug.c
--- linux-2.6.15-rc1-mm2/fs/jfs/jfs_debug.c 2005-10-27 19:02:08.000000000 -0500
+++ linux/fs/jfs/jfs_debug.c 2005-11-22 08:37:22.000000000 -0600
@@ -26,7 +26,6 @@
#include "jfs_filsys.h"
#include "jfs_debug.h"
-#ifdef CONFIG_JFS_DEBUG
void dump_mem(char *label, void *data, int length)
{
int i, j;
@@ -52,7 +51,6 @@ void dump_mem(char *label, void *data, i
printk("%s\n", line);
}
}
-#endif
#ifdef PROC_FS_JFS /* see jfs_debug.h */
diff -urp linux-2.6.15-rc1-mm2/fs/jfs/jfs_debug.h linux/fs/jfs/jfs_debug.h
--- linux-2.6.15-rc1-mm2/fs/jfs/jfs_debug.h 2005-10-27 19:02:08.000000000 -0500
+++ linux/fs/jfs/jfs_debug.h 2005-11-22 08:37:43.000000000 -0600
@@ -52,6 +52,7 @@ extern void jfs_proc_clean(void);
} while (0)
#endif
+extern void dump_mem(char *label, void *data, int length);
/*
* debug ON
* --------
@@ -67,7 +68,6 @@ extern void jfs_proc_clean(void);
extern int jfsloglevel;
-extern void dump_mem(char *label, void *data, int length);
extern int jfs_txanchor_read(char *, char **, off_t, int, int *, void *);
/* information message: e.g., configuration, major event */
@@ -99,7 +99,6 @@ extern int jfs_txanchor_read(char *, cha
* ---------
*/
#else /* CONFIG_JFS_DEBUG */
-#define dump_mem(label,data,length) do {} while (0)
#define ASSERT(p) do {} while (0)
#define jfs_info(fmt, arg...) do {} while (0)
#define jfs_debug(fmt, arg...) do {} while (0)
diff -urp linux-2.6.15-rc1-mm2/fs/jfs/jfs_logmgr.c linux/fs/jfs/jfs_logmgr.c
--- linux-2.6.15-rc1-mm2/fs/jfs/jfs_logmgr.c 2005-10-27 19:02:08.000000000 -0500
+++ linux/fs/jfs/jfs_logmgr.c 2005-11-22 08:34:48.000000000 -0600
@@ -1538,6 +1538,7 @@ int lmLogClose(struct super_block *sb)
void jfs_flush_journal(struct jfs_log *log, int wait)
{
int i;
+ int rc;
struct tblock *target = NULL;
struct jfs_sb_info *sbi;
@@ -1602,9 +1603,15 @@ void jfs_flush_journal(struct jfs_log *l
return;
list_for_each_entry(sbi, &log->sb_list, log_list) {
- filemap_fdatawrite(sbi->ipbmap->i_mapping);
- filemap_fdatawrite(sbi->ipimap->i_mapping);
- filemap_fdatawrite(sbi->direct_inode->i_mapping);
+ rc = filemap_fdatawrite(sbi->ipbmap->i_mapping);
+ if (rc)
+ printk(KERN_ERR "fdatawrite returned %d on bmap\n", rc);
+ rc = filemap_fdatawrite(sbi->ipimap->i_mapping);
+ if (rc)
+ printk(KERN_ERR "fdatawrite returned %d on imap\n", rc);
+ rc = filemap_fdatawrite(sbi->direct_inode->i_mapping);
+ if (rc)
+ printk(KERN_ERR "fdatawrite returned %d on direct_inode\n", rc);
}
/*
@@ -1619,9 +1626,17 @@ void jfs_flush_journal(struct jfs_log *l
break;
}
}
- assert(list_empty(&log->cqueue));
-#ifdef CONFIG_JFS_DEBUG
+ if (!list_empty(&log->cqueue)) {
+ struct tblock *tblk;
+
+ list_for_each_entry(tblk, &log->synclist, synclist) {
+ dump_mem("tblock on cqueue", tblk,
+ sizeof(struct tblock));
+ }
+ }
+ //assert(list_empty(&log->cqueue));
+
if (!list_empty(&log->synclist)) {
struct logsyncblk *lp;
@@ -1637,7 +1652,7 @@ void jfs_flush_journal(struct jfs_log *l
sizeof(struct tblock));
}
}
-#endif
+
//assert(list_empty(&log->synclist));
clear_bit(log_FLUSH, &log->flag);
}