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 | ||