Merge tag 'for-linus-20130301' of git://git.infradead.org/linux-mtd
[linux-3.10.git] / drivers / mtd / tests / mtd_stresstest.c
index 811642f..787f539 100644 (file)
@@ -19,6 +19,8 @@
  * Author: Adrian Hunter <ext-adrian.hunter@nokia.com>
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
@@ -27,8 +29,7 @@
 #include <linux/slab.h>
 #include <linux/sched.h>
 #include <linux/vmalloc.h>
-
-#define PRINT_PREF KERN_INFO "mtd_stresstest: "
+#include <linux/random.h>
 
 static int dev = -EINVAL;
 module_param(dev, int, S_IRUGO);
@@ -48,28 +49,13 @@ static int pgsize;
 static int bufsize;
 static int ebcnt;
 static int pgcnt;
-static unsigned long next = 1;
-
-static inline unsigned int simple_rand(void)
-{
-       next = next * 1103515245 + 12345;
-       return (unsigned int)((next / 65536) % 32768);
-}
-
-static inline void simple_srand(unsigned long seed)
-{
-       next = seed;
-}
 
 static int rand_eb(void)
 {
-       int eb;
+       unsigned int eb;
 
 again:
-       if (ebcnt < 32768)
-               eb = simple_rand();
-       else
-               eb = (simple_rand() << 15) | simple_rand();
+       eb = prandom_u32();
        /* Read or write up 2 eraseblocks at a time - hence 'ebcnt - 1' */
        eb %= (ebcnt - 1);
        if (bbt[eb])
@@ -79,24 +65,18 @@ again:
 
 static int rand_offs(void)
 {
-       int offs;
+       unsigned int offs;
 
-       if (bufsize < 32768)
-               offs = simple_rand();
-       else
-               offs = (simple_rand() << 15) | simple_rand();
+       offs = prandom_u32();
        offs %= bufsize;
        return offs;
 }
 
 static int rand_len(int offs)
 {
-       int len;
+       unsigned int len;
 
-       if (bufsize < 32768)
-               len = simple_rand();
-       else
-               len = (simple_rand() << 15) | simple_rand();
+       len = prandom_u32();
        len %= (bufsize - offs);
        return len;
 }
@@ -112,14 +92,14 @@ static int erase_eraseblock(int ebnum)
        ei.addr = addr;
        ei.len  = mtd->erasesize;
 
-       err = mtd->erase(mtd, &ei);
+       err = mtd_erase(mtd, &ei);
        if (unlikely(err)) {
-               printk(PRINT_PREF "error %d while erasing EB %d\n", err, ebnum);
+               pr_err("error %d while erasing EB %d\n", err, ebnum);
                return err;
        }
 
        if (unlikely(ei.state == MTD_ERASE_FAILED)) {
-               printk(PRINT_PREF "some erase error occurred at EB %d\n",
+               pr_err("some erase error occurred at EB %d\n",
                       ebnum);
                return -EIO;
        }
@@ -132,15 +112,15 @@ static int is_block_bad(int ebnum)
        loff_t addr = ebnum * mtd->erasesize;
        int ret;
 
-       ret = mtd->block_isbad(mtd, addr);
+       ret = mtd_block_isbad(mtd, addr);
        if (ret)
-               printk(PRINT_PREF "block %d is bad\n", ebnum);
+               pr_info("block %d is bad\n", ebnum);
        return ret;
 }
 
 static int do_read(void)
 {
-       size_t read = 0;
+       size_t read;
        int eb = rand_eb();
        int offs = rand_offs();
        int len = rand_len(offs), err;
@@ -153,11 +133,11 @@ static int do_read(void)
                        len = mtd->erasesize - offs;
        }
        addr = eb * mtd->erasesize + offs;
-       err = mtd->read(mtd, addr, len, &read, readbuf);
+       err = mtd_read(mtd, addr, len, &read, readbuf);
        if (mtd_is_bitflip(err))
                err = 0;
        if (unlikely(err || read != len)) {
-               printk(PRINT_PREF "error: read failed at 0x%llx\n",
+               pr_err("error: read failed at 0x%llx\n",
                       (long long)addr);
                if (!err)
                        err = -EINVAL;
@@ -169,7 +149,7 @@ static int do_read(void)
 static int do_write(void)
 {
        int eb = rand_eb(), offs, err, len;
-       size_t written = 0;
+       size_t written;
        loff_t addr;
 
        offs = offsets[eb];
@@ -192,9 +172,9 @@ static int do_write(void)
                }
        }
        addr = eb * mtd->erasesize + offs;
-       err = mtd->write(mtd, addr, len, &written, writebuf);
+       err = mtd_write(mtd, addr, len, &written, writebuf);
        if (unlikely(err || written != len)) {
-               printk(PRINT_PREF "error: write failed at 0x%llx\n",
+               pr_err("error: write failed at 0x%llx\n",
                       (long long)addr);
                if (!err)
                        err = -EINVAL;
@@ -211,7 +191,7 @@ static int do_write(void)
 
 static int do_operation(void)
 {
-       if (simple_rand() & 1)
+       if (prandom_u32() & 1)
                return do_read();
        else
                return do_write();
@@ -223,22 +203,21 @@ static int scan_for_bad_eraseblocks(void)
 
        bbt = kzalloc(ebcnt, GFP_KERNEL);
        if (!bbt) {
-               printk(PRINT_PREF "error: cannot allocate memory\n");
+               pr_err("error: cannot allocate memory\n");
                return -ENOMEM;
        }
 
-       /* NOR flash does not implement block_isbad */
-       if (mtd->block_isbad == NULL)
+       if (!mtd_can_have_bb(mtd))
                return 0;
 
-       printk(PRINT_PREF "scanning for bad eraseblocks\n");
+       pr_info("scanning for bad eraseblocks\n");
        for (i = 0; i < ebcnt; ++i) {
                bbt[i] = is_block_bad(i) ? 1 : 0;
                if (bbt[i])
                        bad += 1;
                cond_resched();
        }
-       printk(PRINT_PREF "scanned %d eraseblocks, %d are bad\n", i, bad);
+       pr_info("scanned %d eraseblocks, %d are bad\n", i, bad);
        return 0;
 }
 
@@ -252,22 +231,22 @@ static int __init mtd_stresstest_init(void)
        printk(KERN_INFO "=================================================\n");
 
        if (dev < 0) {
-               printk(PRINT_PREF "Please specify a valid mtd-device via module paramter\n");
-               printk(KERN_CRIT "CAREFUL: This test wipes all data on the specified MTD device!\n");
+               pr_info("Please specify a valid mtd-device via module parameter\n");
+               pr_crit("CAREFUL: This test wipes all data on the specified MTD device!\n");
                return -EINVAL;
        }
 
-       printk(PRINT_PREF "MTD device: %d\n", dev);
+       pr_info("MTD device: %d\n", dev);
 
        mtd = get_mtd_device(NULL, dev);
        if (IS_ERR(mtd)) {
                err = PTR_ERR(mtd);
-               printk(PRINT_PREF "error: cannot get MTD device\n");
+               pr_err("error: cannot get MTD device\n");
                return err;
        }
 
        if (mtd->writesize == 1) {
-               printk(PRINT_PREF "not NAND flash, assume page size is 512 "
+               pr_info("not NAND flash, assume page size is 512 "
                       "bytes.\n");
                pgsize = 512;
        } else
@@ -278,14 +257,14 @@ static int __init mtd_stresstest_init(void)
        ebcnt = tmp;
        pgcnt = mtd->erasesize / pgsize;
 
-       printk(PRINT_PREF "MTD device size %llu, eraseblock size %u, "
+       pr_info("MTD device size %llu, eraseblock size %u, "
               "page size %u, count of eraseblocks %u, pages per "
               "eraseblock %u, OOB size %u\n",
               (unsigned long long)mtd->size, mtd->erasesize,
               pgsize, ebcnt, pgcnt, mtd->oobsize);
 
        if (ebcnt < 2) {
-               printk(PRINT_PREF "error: need at least 2 eraseblocks\n");
+               pr_err("error: need at least 2 eraseblocks\n");
                err = -ENOSPC;
                goto out_put_mtd;
        }
@@ -298,30 +277,28 @@ static int __init mtd_stresstest_init(void)
        writebuf = vmalloc(bufsize);
        offsets = kmalloc(ebcnt * sizeof(int), GFP_KERNEL);
        if (!readbuf || !writebuf || !offsets) {
-               printk(PRINT_PREF "error: cannot allocate memory\n");
+               pr_err("error: cannot allocate memory\n");
                goto out;
        }
        for (i = 0; i < ebcnt; i++)
                offsets[i] = mtd->erasesize;
-       simple_srand(current->pid);
-       for (i = 0; i < bufsize; i++)
-               writebuf[i] = simple_rand();
+       prandom_bytes(writebuf, bufsize);
 
        err = scan_for_bad_eraseblocks();
        if (err)
                goto out;
 
        /* Do operations */
-       printk(PRINT_PREF "doing operations\n");
+       pr_info("doing operations\n");
        for (op = 0; op < count; op++) {
                if ((op & 1023) == 0)
-                       printk(PRINT_PREF "%d operations done\n", op);
+                       pr_info("%d operations done\n", op);
                err = do_operation();
                if (err)
                        goto out;
                cond_resched();
        }
-       printk(PRINT_PREF "finished, %d operations done\n", op);
+       pr_info("finished, %d operations done\n", op);
 
 out:
        kfree(offsets);
@@ -331,7 +308,7 @@ out:
 out_put_mtd:
        put_mtd_device(mtd);
        if (err)
-               printk(PRINT_PREF "error %d occurred\n", err);
+               pr_info("error %d occurred\n", err);
        printk(KERN_INFO "=================================================\n");
        return err;
 }