UBI: switch debugging tests knobs to debugfs
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Wed, 18 May 2011 13:21:43 +0000 (16:21 +0300)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Wed, 1 Jun 2011 08:23:12 +0000 (11:23 +0300)
Kill the UBI 'debug_tsts' module parameter and switch to debugfs. Create
per-test mode files there. E.g., to enable bit-flips emulation you may just do:

echo 1 > /sys/kernel/debug/ubi/ubi0/tst_emulate_bitflips

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
drivers/mtd/ubi/debug.c
drivers/mtd/ubi/debug.h

index dce1227..ab80c0d 100644 (file)
 #include <linux/debugfs.h>
 #include <linux/uaccess.h>
 #include <linux/module.h>
-#include <linux/moduleparam.h>
-
-unsigned int ubi_tst_flags;
-
-module_param_named(debug_tsts, ubi_tst_flags, uint, S_IRUGO | S_IWUSR);
-
-MODULE_PARM_DESC(debug_tsts, "Debug special test flags");
 
 /**
  * ubi_dbg_dump_ec_hdr - dump an erase counter header.
@@ -318,6 +311,12 @@ static ssize_t dfs_file_read(struct file *file, char __user *user_buf,
                val = d->chk_gen;
        else if (dent == d->dfs_chk_io)
                val = d->chk_io;
+       else if (dent == d->dfs_disable_bgt)
+               val = d->disable_bgt;
+       else if (dent == d->dfs_emulate_bitflips)
+               val = d->emulate_bitflips;
+       else if (dent == d->dfs_emulate_io_failures)
+               val = d->emulate_io_failures;
        else {
                count = -EINVAL;
                goto out;
@@ -373,6 +372,12 @@ static ssize_t dfs_file_write(struct file *file, const char __user *user_buf,
                d->chk_gen = val;
        else if (dent == d->dfs_chk_io)
                d->chk_io = val;
+       else if (dent == d->dfs_disable_bgt)
+               d->disable_bgt = val;
+       else if (dent == d->dfs_emulate_bitflips)
+               d->emulate_bitflips = val;
+       else if (dent == d->dfs_emulate_io_failures)
+               d->emulate_io_failures = val;
        else
                count = -EINVAL;
 
@@ -442,6 +447,27 @@ int ubi_debugfs_init_dev(struct ubi_device *ubi)
                goto out_remove;
        d->dfs_chk_io = dent;
 
+       fname = "tst_disable_bgt";
+       dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num,
+                                  &dfs_fops);
+       if (IS_ERR_OR_NULL(dent))
+               goto out_remove;
+       d->dfs_disable_bgt = dent;
+
+       fname = "tst_emulate_bitflips";
+       dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num,
+                                  &dfs_fops);
+       if (IS_ERR_OR_NULL(dent))
+               goto out_remove;
+       d->dfs_emulate_bitflips = dent;
+
+       fname = "tst_emulate_io_failures";
+       dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num,
+                                  &dfs_fops);
+       if (IS_ERR_OR_NULL(dent))
+               goto out_remove;
+       d->dfs_emulate_io_failures = dent;
+
        return 0;
 
 out_remove:
index ef97c12..65b5b76 100644 (file)
@@ -85,35 +85,30 @@ void ubi_debugfs_exit_dev(struct ubi_device *ubi);
  *
  * @chk_gen: if UBI general extra checks are enabled
  * @chk_io: if UBI I/O extra checks are enabled
+ * @disable_bgt: disable the background task for testing purposes
+ * @emulate_bitflips: emulate bit-flips for testing purposes
+ * @emulate_io_failures: emulate write/erase failures for testing purposes
  * @dfs_dir_name: name of debugfs directory containing files of this UBI device
  * @dfs_dir: direntry object of the UBI device debugfs directory
  * @dfs_chk_gen: debugfs knob to enable UBI general extra checks
  * @dfs_chk_io: debugfs knob to enable UBI I/O extra checks
+ * @dfs_disable_bgt: debugfs knob to disable the background task
+ * @dfs_emulate_bitflips: debugfs knob to emulate bit-flips
+ * @dfs_emulate_io_failures: debugfs knob to emulate write/erase failures
  */
 struct ubi_debug_info {
        unsigned int chk_gen:1;
        unsigned int chk_io:1;
+       unsigned int disable_bgt:1;
+       unsigned int emulate_bitflips:1;
+       unsigned int emulate_io_failures:1;
        char dfs_dir_name[UBI_DFS_DIR_LEN + 1];
        struct dentry *dfs_dir;
        struct dentry *dfs_chk_gen;
        struct dentry *dfs_chk_io;
-};
-
-extern unsigned int ubi_tst_flags;
-
-/*
- * Special testing flags.
- *
- * UBIFS_TST_DISABLE_BGT: disable the background thread
- * UBI_TST_EMULATE_BITFLIPS: emulate bit-flips
- * UBI_TST_EMULATE_WRITE_FAILURES: emulate write failures
- * UBI_TST_EMULATE_ERASE_FAILURES: emulate erase failures
- */
-enum {
-       UBI_TST_DISABLE_BGT            = 0x1,
-       UBI_TST_EMULATE_BITFLIPS       = 0x2,
-       UBI_TST_EMULATE_WRITE_FAILURES = 0x4,
-       UBI_TST_EMULATE_ERASE_FAILURES = 0x8,
+       struct dentry *dfs_disable_bgt;
+       struct dentry *dfs_emulate_bitflips;
+       struct dentry *dfs_emulate_io_failures;
 };
 
 /**
@@ -125,7 +120,7 @@ enum {
  */
 static inline int ubi_dbg_is_bgt_disabled(const struct ubi_device *ubi)
 {
-       return ubi_tst_flags & UBI_TST_DISABLE_BGT;
+       return ubi->dbg->disable_bgt;
 }
 
 /**
@@ -136,7 +131,7 @@ static inline int ubi_dbg_is_bgt_disabled(const struct ubi_device *ubi)
  */
 static inline int ubi_dbg_is_bitflip(const struct ubi_device *ubi)
 {
-       if (ubi_tst_flags & UBI_TST_EMULATE_BITFLIPS)
+       if (ubi->dbg->emulate_bitflips)
                return !(random32() % 200);
        return 0;
 }
@@ -150,7 +145,7 @@ static inline int ubi_dbg_is_bitflip(const struct ubi_device *ubi)
  */
 static inline int ubi_dbg_is_write_failure(const struct ubi_device *ubi)
 {
-       if (ubi_tst_flags & UBI_TST_EMULATE_WRITE_FAILURES)
+       if (ubi->dbg->emulate_io_failures)
                return !(random32() % 500);
        return 0;
 }
@@ -164,7 +159,7 @@ static inline int ubi_dbg_is_write_failure(const struct ubi_device *ubi)
  */
 static inline int ubi_dbg_is_erase_failure(const struct ubi_device *ubi)
 {
-       if (ubi_tst_flags & UBI_TST_EMULATE_ERASE_FAILURES)
+       if (ubi->dbg->emulate_io_failures)
                return !(random32() % 400);
        return 0;
 }