Btrfs: add support for asserts
authorJosef Bacik <jbacik@fusionio.com>
Mon, 26 Aug 2013 20:53:15 +0000 (16:53 -0400)
committerChris Mason <chris.mason@fusionio.com>
Sun, 1 Sep 2013 12:16:32 +0000 (08:16 -0400)
One of the complaints we get a lot is how many BUG_ON()'s we have.  So to help
with this I'm introducing a kconfig option to enable/disable a new ASSERT()
mechanism much like what XFS does.  This will allow us developers to still get
our nice panics but allow users/distros to compile them out.  With this we can
go through and convert any BUG_ON()'s that we have to catch actual programming
mistakes to the new ASSERT() and then fix everybody else to return errors.  This
will also allow developers to leave sanity checks in their new code to make sure
we don't trip over problems while testing stuff and vetting new features.
Thanks,

Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
fs/btrfs/Kconfig
fs/btrfs/ctree.h

index 2b3b83296977d2f10239c6c5b0a40b6af1673c97..398cbd517be218bbfc155f06e1bec5e5fe71717c 100644 (file)
@@ -72,3 +72,12 @@ config BTRFS_DEBUG
          performance, or export extra information via sysfs.
 
          If unsure, say N.
+
+config BTRFS_ASSERT
+       bool "Btrfs assert support"
+       depends on BTRFS_FS
+       help
+         Enable run-time assertion checking.  This will result in panics if
+         any of the assertions trip.  This is meant for btrfs developers only.
+
+         If unsure, say N.
index c90be01cbe674daadbd98c940a29b6e3ddc9899c..1f3fd584e5f4f10c552a1e4209fd6557b2c7f980 100644 (file)
@@ -3814,6 +3814,22 @@ void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
 #define btrfs_debug(fs_info, fmt, args...) \
        btrfs_printk(fs_info, KERN_DEBUG fmt, ##args)
 
+#ifdef CONFIG_BTRFS_ASSERT
+
+static inline void assfail(char *expr, char *file, int line)
+{
+       printk(KERN_ERR "BTRFS assertion failed: %s, file: %s, line: %d",
+              expr, file, line);
+       BUG();
+}
+
+#define ASSERT(expr)   \
+       (likely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__))
+#else
+#define ASSERT(expr)   ((void)0)
+#endif
+
+#define btrfs_assert()
 __printf(5, 6)
 void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
                     unsigned int line, int errno, const char *fmt, ...);