]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] Add less-severe assert-failure form for ext3.
authorAndrew Morton <akpm@digeo.com>
Thu, 3 Apr 2003 00:29:06 +0000 (16:29 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Thu, 3 Apr 2003 00:29:06 +0000 (16:29 -0800)
From: Stephen Tweedie <sct@redhat.com>

Add a new form of assert failure in ext3 which allows us to flag events which
are *usually* bugs, but which can be legally triggered in the presence of IO
failures.  Don't panic the kernel on such errors unless we've defined
#JBD_PARANOID_IOFAIL, which will normally be set only for testing purposes.

include/linux/jbd.h

index 0ffe50ade606e299d363cf133d4c2240b9be0b12..34bf7c8787ecb30782838ed216a266e9fcb481ef 100644 (file)
 
 #define journal_oom_retry 1
 
+/*
+ * Define JBD_PARANIOD_IOFAIL to cause a kernel BUG() if ext3 finds
+ * certain classes of error which can occur due to failed IOs.  Under
+ * normal use we want ext3 to continue after such errors, because
+ * hardware _can_ fail, but for debugging purposes when running tests on
+ * known-good hardware we may want to trap these errors.
+ */
+#undef JBD_PARANOID_IOFAIL
+
 #ifdef CONFIG_JBD_DEBUG
 /*
  * Define JBD_EXPENSIVE_CHECKING to enable more expensive internal
@@ -257,6 +266,23 @@ void buffer_assertion_failure(struct buffer_head *bh);
 #define J_ASSERT(assert)       do { } while (0)
 #endif         /* JBD_ASSERTIONS */
 
+#if defined(JBD_PARANOID_IOFAIL)
+#define J_EXPECT(expr, why...)         J_ASSERT(expr)
+#define J_EXPECT_BH(bh, expr, why...)  J_ASSERT_BH(bh, expr)
+#define J_EXPECT_JH(jh, expr, why...)  J_ASSERT_JH(jh, expr)
+#else
+#define __journal_expect(expr, why...)                                      \
+       do {                                                                 \
+               if (!(expr)) {                                               \
+                       printk(KERN_ERR "EXT3-fs unexpected failure: %s;\n", # expr); \
+                       printk(KERN_ERR ## why);                             \
+               }                                                            \
+       } while (0)
+#define J_EXPECT(expr, why...)         __journal_expect(expr, ## why)
+#define J_EXPECT_BH(bh, expr, why...)  __journal_expect(expr, ## why)
+#define J_EXPECT_JH(jh, expr, why...)  __journal_expect(expr, ## why)
+#endif
+
 enum jbd_state_bits {
        BH_JBD                  /* Has an attached ext3 journal_head */
          = BH_PrivateStart,