git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mtd: tests: stresstest: bail out if device has not enough eraseblocks
[pandora-kernel.git]
/
drivers
/
mtd
/
tests
/
mtd_stresstest.c
diff --git
a/drivers/mtd/tests/mtd_stresstest.c
b/drivers/mtd/tests/mtd_stresstest.c
index
531625f
..
811642f
100644
(file)
--- a/
drivers/mtd/tests/mtd_stresstest.c
+++ b/
drivers/mtd/tests/mtd_stresstest.c
@@
-30,7
+30,7
@@
#define PRINT_PREF KERN_INFO "mtd_stresstest: "
#define PRINT_PREF KERN_INFO "mtd_stresstest: "
-static int dev;
+static int dev
= -EINVAL
;
module_param(dev, int, S_IRUGO);
MODULE_PARM_DESC(dev, "MTD device number to use");
module_param(dev, int, S_IRUGO);
MODULE_PARM_DESC(dev, "MTD device number to use");
@@
-154,7
+154,7
@@
static int do_read(void)
}
addr = eb * mtd->erasesize + offs;
err = mtd->read(mtd, addr, len, &read, readbuf);
}
addr = eb * mtd->erasesize + offs;
err = mtd->read(mtd, addr, len, &read, readbuf);
- if (
err == -EUCLEAN
)
+ if (
mtd_is_bitflip(err)
)
err = 0;
if (unlikely(err || read != len)) {
printk(PRINT_PREF "error: read failed at 0x%llx\n",
err = 0;
if (unlikely(err || read != len)) {
printk(PRINT_PREF "error: read failed at 0x%llx\n",
@@
-250,6
+250,13
@@
static int __init mtd_stresstest_init(void)
printk(KERN_INFO "\n");
printk(KERN_INFO "=================================================\n");
printk(KERN_INFO "\n");
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");
+ return -EINVAL;
+ }
+
printk(PRINT_PREF "MTD device: %d\n", dev);
mtd = get_mtd_device(NULL, dev);
printk(PRINT_PREF "MTD device: %d\n", dev);
mtd = get_mtd_device(NULL, dev);
@@
-277,6
+284,12
@@
static int __init mtd_stresstest_init(void)
(unsigned long long)mtd->size, mtd->erasesize,
pgsize, ebcnt, pgcnt, mtd->oobsize);
(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");
+ err = -ENOSPC;
+ goto out_put_mtd;
+ }
+
/* Read or write up 2 eraseblocks at a time */
bufsize = mtd->erasesize * 2;
/* Read or write up 2 eraseblocks at a time */
bufsize = mtd->erasesize * 2;
@@
-315,6
+328,7
@@
out:
kfree(bbt);
vfree(writebuf);
vfree(readbuf);
kfree(bbt);
vfree(writebuf);
vfree(readbuf);
+out_put_mtd:
put_mtd_device(mtd);
if (err)
printk(PRINT_PREF "error %d occurred\n", err);
put_mtd_device(mtd);
if (err)
printk(PRINT_PREF "error %d occurred\n", err);