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);
 }

Reply via email to