Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Akinobu Mita and committed by
David Woodhouse
5a78df69 59b0816d

+12 -74
+12 -74
drivers/mtd/tests/stresstest.c
··· 31 31 #include <linux/vmalloc.h> 32 32 #include <linux/random.h> 33 33 34 + #include "mtd_test.h" 35 + 34 36 static int dev = -EINVAL; 35 37 module_param(dev, int, S_IRUGO); 36 38 MODULE_PARM_DESC(dev, "MTD device number to use"); ··· 83 81 return len; 84 82 } 85 83 86 - static int erase_eraseblock(int ebnum) 87 - { 88 - int err; 89 - struct erase_info ei; 90 - loff_t addr = ebnum * mtd->erasesize; 91 - 92 - memset(&ei, 0, sizeof(struct erase_info)); 93 - ei.mtd = mtd; 94 - ei.addr = addr; 95 - ei.len = mtd->erasesize; 96 - 97 - err = mtd_erase(mtd, &ei); 98 - if (unlikely(err)) { 99 - pr_err("error %d while erasing EB %d\n", err, ebnum); 100 - return err; 101 - } 102 - 103 - if (unlikely(ei.state == MTD_ERASE_FAILED)) { 104 - pr_err("some erase error occurred at EB %d\n", 105 - ebnum); 106 - return -EIO; 107 - } 108 - 109 - return 0; 110 - } 111 - 112 - static int is_block_bad(int ebnum) 113 - { 114 - loff_t addr = ebnum * mtd->erasesize; 115 - int ret; 116 - 117 - ret = mtd_block_isbad(mtd, addr); 118 - if (ret) 119 - pr_info("block %d is bad\n", ebnum); 120 - return ret; 121 - } 122 - 123 84 static int do_read(void) 124 85 { 125 - size_t read; 126 86 int eb = rand_eb(); 127 87 int offs = rand_offs(); 128 88 int len = rand_len(offs), err; ··· 97 133 len = mtd->erasesize - offs; 98 134 } 99 135 addr = eb * mtd->erasesize + offs; 100 - err = mtd_read(mtd, addr, len, &read, readbuf); 101 - if (mtd_is_bitflip(err)) 102 - err = 0; 103 - if (unlikely(err || read != len)) { 136 + err = mtdtest_read(mtd, addr, len, readbuf); 137 + if (unlikely(err)) { 104 138 pr_err("error: read failed at 0x%llx\n", 105 139 (long long)addr); 106 - if (!err) 107 - err = -EINVAL; 108 140 return err; 109 141 } 110 142 return 0; ··· 109 149 static int do_write(void) 110 150 { 111 151 int eb = rand_eb(), offs, err, len; 112 - size_t written; 113 152 loff_t addr; 114 153 115 154 offs = offsets[eb]; 116 155 if (offs >= mtd->erasesize) { 117 - err = erase_eraseblock(eb); 156 + err = mtdtest_erase_eraseblock(mtd, eb); 118 157 if (err) 119 158 return err; 120 159 offs = offsets[eb] = 0; ··· 124 165 if (bbt[eb + 1]) 125 166 len = mtd->erasesize - offs; 126 167 else { 127 - err = erase_eraseblock(eb + 1); 168 + err = mtdtest_erase_eraseblock(mtd, eb + 1); 128 169 if (err) 129 170 return err; 130 171 offsets[eb + 1] = 0; 131 172 } 132 173 } 133 174 addr = eb * mtd->erasesize + offs; 134 - err = mtd_write(mtd, addr, len, &written, writebuf); 135 - if (unlikely(err || written != len)) { 175 + err = mtdtest_write(mtd, addr, len, writebuf); 176 + if (unlikely(err)) { 136 177 pr_err("error: write failed at 0x%llx\n", 137 178 (long long)addr); 138 - if (!err) 139 - err = -EINVAL; 140 179 return err; 141 180 } 142 181 offs += len; ··· 152 195 return do_read(); 153 196 else 154 197 return do_write(); 155 - } 156 - 157 - static int scan_for_bad_eraseblocks(void) 158 - { 159 - int i, bad = 0; 160 - 161 - bbt = kzalloc(ebcnt, GFP_KERNEL); 162 - if (!bbt) 163 - return -ENOMEM; 164 - 165 - if (!mtd_can_have_bb(mtd)) 166 - return 0; 167 - 168 - pr_info("scanning for bad eraseblocks\n"); 169 - for (i = 0; i < ebcnt; ++i) { 170 - bbt[i] = is_block_bad(i) ? 1 : 0; 171 - if (bbt[i]) 172 - bad += 1; 173 - cond_resched(); 174 - } 175 - pr_info("scanned %d eraseblocks, %d are bad\n", i, bad); 176 - return 0; 177 198 } 178 199 179 200 static int __init mtd_stresstest_init(void) ··· 215 280 offsets[i] = mtd->erasesize; 216 281 prandom_bytes(writebuf, bufsize); 217 282 218 - err = scan_for_bad_eraseblocks(); 283 + bbt = kzalloc(ebcnt, GFP_KERNEL); 284 + if (!bbt) 285 + goto out; 286 + err = mtdtest_scan_for_bad_eraseblocks(mtd, bbt, 0, ebcnt); 219 287 if (err) 220 288 goto out; 221 289