static int do_read(void) { size_t read = 0; int eb = rand_eb(); int offs = rand_offs(); int len = rand_len(offs), err; loff_t addr; if (bbt[eb + 1]) { if (offs >= mtd->erasesize) offs -= mtd->erasesize; if (offs + len > mtd->erasesize) len = mtd->erasesize - offs; } addr = eb * mtd->erasesize + offs; err = mtd->read(mtd, addr, len, &read, readbuf); if (err == -EUCLEAN) err = 0; if (unlikely(err || read != len)) { printk(PRINT_PREF "error: read failed at 0x%llx of length %d(%x)\n", (long long)addr, len, len); if (!err) err = -EINVAL; return err; } return 0; }
static int do_read(void) { size_t read; int eb = rand_eb(); int offs = rand_offs(); int len = rand_len(offs), err; loff_t addr; if (bbt[eb + 1]) { if (offs >= mtd->erasesize) offs -= mtd->erasesize; if (offs + len > mtd->erasesize) len = mtd->erasesize - offs; } addr = eb * mtd->erasesize + offs; err = mtd_read(mtd, addr, len, &read, readbuf); if (mtd_is_bitflip(err)) err = 0; if (unlikely(err || read != len)) { pr_err("error: read failed at 0x%llx\n", (long long)addr); if (!err) err = -EINVAL; return err; } return 0; }
static int do_read(void) { int eb = rand_eb(); int offs = rand_offs(); int len = rand_len(offs); loff_t addr; if (bbt[eb + 1]) { if (offs >= mtd->erasesize) offs -= mtd->erasesize; if (offs + len > mtd->erasesize) len = mtd->erasesize - offs; } addr = (loff_t)eb * mtd->erasesize + offs; return mtdtest_read(mtd, addr, len, readbuf); }
static int do_write(void) { int eb = rand_eb(), offs, err, len; size_t written = 0; loff_t addr; offs = offsets[eb]; if (offs >= mtd->erasesize) { err = erase_eraseblock(eb); if (err) return err; offs = offsets[eb] = 0; } len = rand_len(offs); len = ((len + pgsize - 1) / pgsize) * pgsize; if (offs + len > mtd->erasesize) { if (bbt[eb + 1]) len = mtd->erasesize - offs; else { err = erase_eraseblock(eb + 1); if (err) return err; offsets[eb + 1] = 0; } } addr = eb * mtd->erasesize + offs; err = mtd->write(mtd, addr, len, &written, writebuf); if (unlikely(err || written != len)) { printk(PRINT_PREF "error: write failed at 0x%llx\n", (long long)addr); if (!err) err = -EINVAL; return err; } offs += len; while (offs > mtd->erasesize) { offsets[eb++] = mtd->erasesize; offs -= mtd->erasesize; } offsets[eb] = offs; return 0; }
static int do_write(void) { int eb = rand_eb(), offs, err, len; loff_t addr; offs = offsets[eb]; if (offs >= mtd->erasesize) { err = mtdtest_erase_eraseblock(mtd, eb); if (err) return err; offs = offsets[eb] = 0; } len = rand_len(offs); len = ((len + pgsize - 1) / pgsize) * pgsize; if (offs + len > mtd->erasesize) { if (bbt[eb + 1]) len = mtd->erasesize - offs; else { err = mtdtest_erase_eraseblock(mtd, eb + 1); if (err) return err; offsets[eb + 1] = 0; } } addr = (loff_t)eb * mtd->erasesize + offs; err = mtdtest_write(mtd, addr, len, writebuf); if (unlikely(err)) return err; offs += len; while (offs > mtd->erasesize) { offsets[eb++] = mtd->erasesize; offs -= mtd->erasesize; } offsets[eb] = offs; return 0; }