diff options
| author | Akinobu Mita <akinobu.mita@gmail.com> | 2013-08-03 05:52:13 -0400 |
|---|---|---|
| committer | David Woodhouse <David.Woodhouse@intel.com> | 2013-08-30 16:34:21 -0400 |
| commit | 5a78df69eeb34b560a92f64170625083018383de (patch) | |
| tree | 70644ebafeeca96667a213d650b73f203123d346 /drivers/mtd/tests | |
| parent | 59b0816d7c7de3c14d6dd59da3baa3deffb973da (diff) | |
mtd: mtd_stresstest: use mtd_test helpers
Use mtdtest_read(), mtdtest_write(), mtdtest_erase_eraseblock(), and
mtdtest_scan_for_bad_eraseblocks() in mtd_test helpers.
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Brian Norris <computersforpeace@gmail.com>
Cc: Vikram Narayanan <vikram186@gmail.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/tests')
| -rw-r--r-- | drivers/mtd/tests/stresstest.c | 86 |
1 files changed, 12 insertions, 74 deletions
diff --git a/drivers/mtd/tests/stresstest.c b/drivers/mtd/tests/stresstest.c index 3a95e61b535d..169524845401 100644 --- a/drivers/mtd/tests/stresstest.c +++ b/drivers/mtd/tests/stresstest.c | |||
| @@ -31,6 +31,8 @@ | |||
| 31 | #include <linux/vmalloc.h> | 31 | #include <linux/vmalloc.h> |
| 32 | #include <linux/random.h> | 32 | #include <linux/random.h> |
| 33 | 33 | ||
| 34 | #include "mtd_test.h" | ||
| 35 | |||
| 34 | static int dev = -EINVAL; | 36 | static int dev = -EINVAL; |
| 35 | module_param(dev, int, S_IRUGO); | 37 | module_param(dev, int, S_IRUGO); |
| 36 | MODULE_PARM_DESC(dev, "MTD device number to use"); | 38 | MODULE_PARM_DESC(dev, "MTD device number to use"); |
| @@ -81,46 +83,8 @@ static int rand_len(int offs) | |||
| 81 | return len; | 83 | return len; |
| 82 | } | 84 | } |
| 83 | 85 | ||
| 84 | static int erase_eraseblock(int ebnum) | ||
| 85 | { | ||
| 86 | int err; | ||
| 87 | struct erase_info ei; | ||
| 88 | loff_t addr = ebnum * mtd->erasesize; | ||
| 89 | |||
| 90 | memset(&ei, 0, sizeof(struct erase_info)); | ||
| 91 | ei.mtd = mtd; | ||
| 92 | ei.addr = addr; | ||
| 93 | ei.len = mtd->erasesize; | ||
| 94 | |||
| 95 | err = mtd_erase(mtd, &ei); | ||
| 96 | if (unlikely(err)) { | ||
| 97 | pr_err("error %d while erasing EB %d\n", err, ebnum); | ||
| 98 | return err; | ||
| 99 | } | ||
| 100 | |||
| 101 | if (unlikely(ei.state == MTD_ERASE_FAILED)) { | ||
| 102 | pr_err("some erase error occurred at EB %d\n", | ||
| 103 | ebnum); | ||
| 104 | return -EIO; | ||
| 105 | } | ||
| 106 | |||
| 107 | return 0; | ||
| 108 | } | ||
| 109 | |||
| 110 | static int is_block_bad(int ebnum) | ||
| 111 | { | ||
| 112 | loff_t addr = ebnum * mtd->erasesize; | ||
| 113 | int ret; | ||
| 114 | |||
| 115 | ret = mtd_block_isbad(mtd, addr); | ||
| 116 | if (ret) | ||
| 117 | pr_info("block %d is bad\n", ebnum); | ||
| 118 | return ret; | ||
| 119 | } | ||
| 120 | |||
| 121 | static int do_read(void) | 86 | static int do_read(void) |
| 122 | { | 87 | { |
| 123 | size_t read; | ||
| 124 | int eb = rand_eb(); | 88 | int eb = rand_eb(); |
| 125 | int offs = rand_offs(); | 89 | int offs = rand_offs(); |
| 126 | int len = rand_len(offs), err; | 90 | int len = rand_len(offs), err; |
| @@ -133,14 +97,10 @@ static int do_read(void) | |||
| 133 | len = mtd->erasesize - offs; | 97 | len = mtd->erasesize - offs; |
| 134 | } | 98 | } |
| 135 | addr = eb * mtd->erasesize + offs; | 99 | addr = eb * mtd->erasesize + offs; |
| 136 | err = mtd_read(mtd, addr, len, &read, readbuf); | 100 | err = mtdtest_read(mtd, addr, len, readbuf); |
| 137 | if (mtd_is_bitflip(err)) | 101 | if (unlikely(err)) { |
| 138 | err = 0; | ||
| 139 | if (unlikely(err || read != len)) { | ||
| 140 | pr_err("error: read failed at 0x%llx\n", | 102 | pr_err("error: read failed at 0x%llx\n", |
| 141 | (long long)addr); | 103 | (long long)addr); |
| 142 | if (!err) | ||
| 143 | err = -EINVAL; | ||
| 144 | return err; | 104 | return err; |
| 145 | } | 105 | } |
| 146 | return 0; | 106 | return 0; |
| @@ -149,12 +109,11 @@ static int do_read(void) | |||
| 149 | static int do_write(void) | 109 | static int do_write(void) |
| 150 | { | 110 | { |
| 151 | int eb = rand_eb(), offs, err, len; | 111 | int eb = rand_eb(), offs, err, len; |
| 152 | size_t written; | ||
| 153 | loff_t addr; | 112 | loff_t addr; |
| 154 | 113 | ||
| 155 | offs = offsets[eb]; | 114 | offs = offsets[eb]; |
| 156 | if (offs >= mtd->erasesize) { | 115 | if (offs >= mtd->erasesize) { |
| 157 | err = erase_eraseblock(eb); | 116 | err = mtdtest_erase_eraseblock(mtd, eb); |
| 158 | if (err) | 117 | if (err) |
| 159 | return err; | 118 | return err; |
| 160 | offs = offsets[eb] = 0; | 119 | offs = offsets[eb] = 0; |
| @@ -165,19 +124,17 @@ static int do_write(void) | |||
| 165 | if (bbt[eb + 1]) | 124 | if (bbt[eb + 1]) |
| 166 | len = mtd->erasesize - offs; | 125 | len = mtd->erasesize - offs; |
| 167 | else { | 126 | else { |
| 168 | err = erase_eraseblock(eb + 1); | 127 | err = mtdtest_erase_eraseblock(mtd, eb + 1); |
| 169 | if (err) | 128 | if (err) |
| 170 | return err; | 129 | return err; |
| 171 | offsets[eb + 1] = 0; | 130 | offsets[eb + 1] = 0; |
| 172 | } | 131 | } |
| 173 | } | 132 | } |
| 174 | addr = eb * mtd->erasesize + offs; | 133 | addr = eb * mtd->erasesize + offs; |
| 175 | err = mtd_write(mtd, addr, len, &written, writebuf); | 134 | err = mtdtest_write(mtd, addr, len, writebuf); |
| 176 | if (unlikely(err || written != len)) { | 135 | if (unlikely(err)) { |
| 177 | pr_err("error: write failed at 0x%llx\n", | 136 | pr_err("error: write failed at 0x%llx\n", |
| 178 | (long long)addr); | 137 | (long long)addr); |
| 179 | if (!err) | ||
| 180 | err = -EINVAL; | ||
| 181 | return err; | 138 | return err; |
| 182 | } | 139 | } |
| 183 | offs += len; | 140 | offs += len; |
| @@ -197,28 +154,6 @@ static int do_operation(void) | |||
| 197 | return do_write(); | 154 | return do_write(); |
| 198 | } | 155 | } |
| 199 | 156 | ||
| 200 | static int scan_for_bad_eraseblocks(void) | ||
| 201 | { | ||
| 202 | int i, bad = 0; | ||
| 203 | |||
| 204 | bbt = kzalloc(ebcnt, GFP_KERNEL); | ||
| 205 | if (!bbt) | ||
| 206 | return -ENOMEM; | ||
| 207 | |||
| 208 | if (!mtd_can_have_bb(mtd)) | ||
| 209 | return 0; | ||
| 210 | |||
| 211 | pr_info("scanning for bad eraseblocks\n"); | ||
| 212 | for (i = 0; i < ebcnt; ++i) { | ||
| 213 | bbt[i] = is_block_bad(i) ? 1 : 0; | ||
| 214 | if (bbt[i]) | ||
| 215 | bad += 1; | ||
| 216 | cond_resched(); | ||
| 217 | } | ||
| 218 | pr_info("scanned %d eraseblocks, %d are bad\n", i, bad); | ||
| 219 | return 0; | ||
| 220 | } | ||
| 221 | |||
| 222 | static int __init mtd_stresstest_init(void) | 157 | static int __init mtd_stresstest_init(void) |
| 223 | { | 158 | { |
| 224 | int err; | 159 | int err; |
| @@ -280,7 +215,10 @@ static int __init mtd_stresstest_init(void) | |||
| 280 | offsets[i] = mtd->erasesize; | 215 | offsets[i] = mtd->erasesize; |
| 281 | prandom_bytes(writebuf, bufsize); | 216 | prandom_bytes(writebuf, bufsize); |
| 282 | 217 | ||
| 283 | err = scan_for_bad_eraseblocks(); | 218 | bbt = kzalloc(ebcnt, GFP_KERNEL); |
| 219 | if (!bbt) | ||
| 220 | goto out; | ||
| 221 | err = mtdtest_scan_for_bad_eraseblocks(mtd, bbt, 0, ebcnt); | ||
| 284 | if (err) | 222 | if (err) |
| 285 | goto out; | 223 | goto out; |
| 286 | 224 | ||
