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

mtd: introduce mtd_write interface

Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>

authored by

Artem Bityutskiy and committed by
David Woodhouse
eda95cbf 329ad399

+84 -73
+5 -3
drivers/mtd/chips/cfi_cmdset_0020.c
··· 699 699 continue; 700 700 } 701 701 memcpy(buffer+buflen, elem_base, ECCBUF_SIZE-buflen); 702 - ret = mtd->write(mtd, to, ECCBUF_SIZE, &thislen, buffer); 702 + ret = mtd_write(mtd, to, ECCBUF_SIZE, &thislen, 703 + buffer); 703 704 totlen += thislen; 704 705 if (ret || thislen != ECCBUF_SIZE) 705 706 goto write_error; ··· 709 708 to += ECCBUF_SIZE; 710 709 } 711 710 if (ECCBUF_DIV(elem_len)) { /* write clean aligned data */ 712 - ret = mtd->write(mtd, to, ECCBUF_DIV(elem_len), &thislen, elem_base); 711 + ret = mtd_write(mtd, to, ECCBUF_DIV(elem_len), 712 + &thislen, elem_base); 713 713 totlen += thislen; 714 714 if (ret || thislen != ECCBUF_DIV(elem_len)) 715 715 goto write_error; ··· 724 722 } 725 723 if (buflen) { /* flush last page, even if not full */ 726 724 /* This is sometimes intended behaviour, really */ 727 - ret = mtd->write(mtd, to, buflen, &thislen, buffer); 725 + ret = mtd_write(mtd, to, buflen, &thislen, buffer); 728 726 totlen += thislen; 729 727 if (ret || thislen != ECCBUF_SIZE) 730 728 goto write_error;
+18 -17
drivers/mtd/ftl.c
··· 422 422 header.LogicalEUN = cpu_to_le16(0xffff); 423 423 header.EraseCount = cpu_to_le32(xfer->EraseCount); 424 424 425 - ret = part->mbd.mtd->write(part->mbd.mtd, xfer->Offset, sizeof(header), 426 - &retlen, (u_char *)&header); 425 + ret = mtd_write(part->mbd.mtd, xfer->Offset, sizeof(header), &retlen, 426 + (u_char *)&header); 427 427 428 428 if (ret) { 429 429 return ret; ··· 438 438 439 439 for (i = 0; i < nbam; i++, offset += sizeof(uint32_t)) { 440 440 441 - ret = part->mbd.mtd->write(part->mbd.mtd, offset, sizeof(uint32_t), 442 - &retlen, (u_char *)&ctl); 441 + ret = mtd_write(part->mbd.mtd, offset, sizeof(uint32_t), &retlen, 442 + (u_char *)&ctl); 443 443 444 444 if (ret) 445 445 return ret; ··· 503 503 offset = xfer->Offset + 20; /* Bad! */ 504 504 unit = cpu_to_le16(0x7fff); 505 505 506 - ret = part->mbd.mtd->write(part->mbd.mtd, offset, sizeof(uint16_t), 507 - &retlen, (u_char *) &unit); 506 + ret = mtd_write(part->mbd.mtd, offset, sizeof(uint16_t), &retlen, 507 + (u_char *)&unit); 508 508 509 509 if (ret) { 510 510 printk( KERN_WARNING "ftl: Failed to write back to BAM cache in copy_erase_unit()!\n"); ··· 531 531 } 532 532 533 533 534 - ret = part->mbd.mtd->write(part->mbd.mtd, dest, SECTOR_SIZE, 535 - &retlen, (u_char *) buf); 534 + ret = mtd_write(part->mbd.mtd, dest, SECTOR_SIZE, &retlen, 535 + (u_char *)buf); 536 536 if (ret) { 537 537 printk(KERN_WARNING "ftl: Error writing new xfer unit in copy_erase_unit\n"); 538 538 return ret; ··· 550 550 } 551 551 552 552 /* Write the BAM to the transfer unit */ 553 - ret = part->mbd.mtd->write(part->mbd.mtd, xfer->Offset + le32_to_cpu(part->header.BAMOffset), 554 - part->BlocksPerUnit * sizeof(int32_t), &retlen, 555 - (u_char *)part->bam_cache); 553 + ret = mtd_write(part->mbd.mtd, 554 + xfer->Offset + le32_to_cpu(part->header.BAMOffset), 555 + part->BlocksPerUnit * sizeof(int32_t), 556 + &retlen, 557 + (u_char *)part->bam_cache); 556 558 if (ret) { 557 559 printk( KERN_WARNING "ftl: Error writing BAM in copy_erase_unit\n"); 558 560 return ret; ··· 562 560 563 561 564 562 /* All clear? Then update the LogicalEUN again */ 565 - ret = part->mbd.mtd->write(part->mbd.mtd, xfer->Offset + 20, sizeof(uint16_t), 566 - &retlen, (u_char *)&srcunitswap); 563 + ret = mtd_write(part->mbd.mtd, xfer->Offset + 20, sizeof(uint16_t), 564 + &retlen, (u_char *)&srcunitswap); 567 565 568 566 if (ret) { 569 567 printk(KERN_WARNING "ftl: Error writing new LogicalEUN in copy_erase_unit\n"); ··· 889 887 #endif 890 888 part->bam_cache[blk] = le_virt_addr; 891 889 } 892 - ret = part->mbd.mtd->write(part->mbd.mtd, offset, sizeof(uint32_t), 893 - &retlen, (u_char *)&le_virt_addr); 890 + ret = mtd_write(part->mbd.mtd, offset, sizeof(uint32_t), &retlen, 891 + (u_char *)&le_virt_addr); 894 892 895 893 if (ret) { 896 894 printk(KERN_NOTICE "ftl_cs: set_bam_entry() failed!\n"); ··· 949 947 part->EUNInfo[part->bam_index].Deleted++; 950 948 offset = (part->EUNInfo[part->bam_index].Offset + 951 949 blk * SECTOR_SIZE); 952 - ret = part->mbd.mtd->write(part->mbd.mtd, offset, SECTOR_SIZE, &retlen, 953 - buffer); 950 + ret = mtd_write(part->mbd.mtd, offset, SECTOR_SIZE, &retlen, buffer); 954 951 955 952 if (ret) { 956 953 printk(KERN_NOTICE "ftl_cs: block write failed!\n");
+2 -2
drivers/mtd/mtdblock.c
··· 102 102 * Next, write the data to flash. 103 103 */ 104 104 105 - ret = mtd->write(mtd, pos, len, &retlen, buf); 105 + ret = mtd_write(mtd, pos, len, &retlen, buf); 106 106 if (ret) 107 107 return ret; 108 108 if (retlen != len) ··· 152 152 mtd->name, pos, len); 153 153 154 154 if (!sect_size) 155 - return mtd->write(mtd, pos, len, &retlen, buf); 155 + return mtd_write(mtd, pos, len, &retlen, buf); 156 156 157 157 while (len > 0) { 158 158 unsigned long sect_start = (pos/sect_size)*sect_size;
+1 -1
drivers/mtd/mtdblock_ro.c
··· 40 40 { 41 41 size_t retlen; 42 42 43 - if (dev->mtd->write(dev->mtd, (block * 512), 512, &retlen, buf)) 43 + if (mtd_write(dev->mtd, (block * 512), 512, &retlen, buf)) 44 44 return 1; 45 45 return 0; 46 46 }
+1 -1
drivers/mtd/mtdchar.c
··· 331 331 } 332 332 333 333 default: 334 - ret = (*(mtd->write))(mtd, *ppos, len, &retlen, kbuf); 334 + ret = mtd_write(mtd, *ppos, len, &retlen, kbuf); 335 335 } 336 336 if (!ret) { 337 337 *ppos += retlen;
+1 -1
drivers/mtd/mtdconcat.c
··· 148 148 if (!(subdev->flags & MTD_WRITEABLE)) 149 149 err = -EROFS; 150 150 else 151 - err = subdev->write(subdev, to, size, &retsize, buf); 151 + err = mtd_write(subdev, to, size, &retsize, buf); 152 152 153 153 if (err) 154 154 break;
+2 -1
drivers/mtd/mtdcore.c
··· 699 699 for (i=0; i<count; i++) { 700 700 if (!vecs[i].iov_len) 701 701 continue; 702 - ret = mtd->write(mtd, to, vecs[i].iov_len, &thislen, vecs[i].iov_base); 702 + ret = mtd_write(mtd, to, vecs[i].iov_len, &thislen, 703 + vecs[i].iov_base); 703 704 totlen += thislen; 704 705 if (ret || thislen != vecs[i].iov_len) 705 706 break;
+2 -2
drivers/mtd/mtdoops.c
··· 225 225 ret = mtd->panic_write(mtd, cxt->nextpage * record_size, 226 226 record_size, &retlen, cxt->oops_buf); 227 227 else 228 - ret = mtd->write(mtd, cxt->nextpage * record_size, 229 - record_size, &retlen, cxt->oops_buf); 228 + ret = mtd_write(mtd, cxt->nextpage * record_size, 229 + record_size, &retlen, cxt->oops_buf); 230 230 231 231 if (retlen != record_size || ret < 0) 232 232 printk(KERN_ERR "mtdoops: write failure at %ld (%td of %ld written), error %d\n",
+1 -2
drivers/mtd/mtdpart.c
··· 188 188 len = 0; 189 189 else if (to + len > mtd->size) 190 190 len = mtd->size - to; 191 - return part->master->write(part->master, to + part->offset, 192 - len, retlen, buf); 191 + return mtd_write(part->master, to + part->offset, len, retlen, buf); 193 192 } 194 193 195 194 static int part_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
+1 -1
drivers/mtd/mtdswap.c
··· 689 689 return ret; 690 690 691 691 writepos = (loff_t)*bp << PAGE_SHIFT; 692 - ret = mtd->write(mtd, writepos, PAGE_SIZE, &retlen, buf); 692 + ret = mtd_write(mtd, writepos, PAGE_SIZE, &retlen, buf); 693 693 if (ret == -EIO || mtd_is_eccerr(ret)) { 694 694 d->curr_write_pos--; 695 695 eb->active_count--;
+8 -9
drivers/mtd/rfd_ftl.c
··· 304 304 part->blocks[i].used_sectors = 0; 305 305 part->blocks[i].erases++; 306 306 307 - rc = part->mbd.mtd->write(part->mbd.mtd, 308 - part->blocks[i].offset, sizeof(magic), &retlen, 309 - (u_char*)&magic); 307 + rc = mtd_write(part->mbd.mtd, part->blocks[i].offset, sizeof(magic), 308 + &retlen, (u_char *)&magic); 310 309 311 310 if (!rc && retlen != sizeof(magic)) 312 311 rc = -EIO; ··· 594 595 595 596 addr = part->blocks[block].offset + 596 597 (HEADER_MAP_OFFSET + offset) * sizeof(u16); 597 - rc = part->mbd.mtd->write(part->mbd.mtd, addr, 598 - sizeof(del), &retlen, (u_char*)&del); 598 + rc = mtd_write(part->mbd.mtd, addr, sizeof(del), &retlen, 599 + (u_char *)&del); 599 600 600 601 if (!rc && retlen != sizeof(del)) 601 602 rc = -EIO; ··· 667 668 668 669 addr = (i + part->header_sectors_per_block) * SECTOR_SIZE + 669 670 block->offset; 670 - rc = part->mbd.mtd->write(part->mbd.mtd, 671 - addr, SECTOR_SIZE, &retlen, (u_char*)buf); 671 + rc = mtd_write(part->mbd.mtd, addr, SECTOR_SIZE, &retlen, 672 + (u_char *)buf); 672 673 673 674 if (!rc && retlen != SECTOR_SIZE) 674 675 rc = -EIO; ··· 687 688 part->header_cache[i + HEADER_MAP_OFFSET] = entry; 688 689 689 690 addr = block->offset + (HEADER_MAP_OFFSET + i) * sizeof(u16); 690 - rc = part->mbd.mtd->write(part->mbd.mtd, addr, 691 - sizeof(entry), &retlen, (u_char*)&entry); 691 + rc = mtd_write(part->mbd.mtd, addr, sizeof(entry), &retlen, 692 + (u_char *)&entry); 692 693 693 694 if (!rc && retlen != sizeof(entry)) 694 695 rc = -EIO;
+4 -4
drivers/mtd/tests/mtd_pagetest.c
··· 100 100 101 101 set_random_data(writebuf, mtd->erasesize); 102 102 cond_resched(); 103 - err = mtd->write(mtd, addr, mtd->erasesize, &written, writebuf); 103 + err = mtd_write(mtd, addr, mtd->erasesize, &written, writebuf); 104 104 if (err || written != mtd->erasesize) 105 105 printk(PRINT_PREF "error: write failed at %#llx\n", 106 106 (long long)addr); ··· 335 335 printk(PRINT_PREF "writing 1st page of block %d\n", ebnum); 336 336 set_random_data(writebuf, pgsize); 337 337 strcpy(writebuf, "There is no data like this!"); 338 - err = mtd->write(mtd, addr0, pgsize, &written, writebuf); 338 + err = mtd_write(mtd, addr0, pgsize, &written, writebuf); 339 339 if (err || written != pgsize) { 340 340 printk(PRINT_PREF "error: write failed at %#llx\n", 341 341 (long long)addr0); ··· 368 368 printk(PRINT_PREF "writing 1st page of block %d\n", ebnum); 369 369 set_random_data(writebuf, pgsize); 370 370 strcpy(writebuf, "There is no data like this!"); 371 - err = mtd->write(mtd, addr0, pgsize, &written, writebuf); 371 + err = mtd_write(mtd, addr0, pgsize, &written, writebuf); 372 372 if (err || written != pgsize) { 373 373 printk(PRINT_PREF "error: write failed at %#llx\n", 374 374 (long long)addr0); ··· 425 425 426 426 printk(PRINT_PREF "writing 1st page of block %d\n", ebnum); 427 427 set_random_data(writebuf, pgsize); 428 - err = mtd->write(mtd, addr0, pgsize, &written, writebuf); 428 + err = mtd_write(mtd, addr0, pgsize, &written, writebuf); 429 429 if (err || written != pgsize) { 430 430 printk(PRINT_PREF "error: write failed at %#llx\n", 431 431 (long long)addr0);
+4 -4
drivers/mtd/tests/mtd_speedtest.c
··· 143 143 int err = 0; 144 144 loff_t addr = ebnum * mtd->erasesize; 145 145 146 - err = mtd->write(mtd, addr, mtd->erasesize, &written, iobuf); 146 + err = mtd_write(mtd, addr, mtd->erasesize, &written, iobuf); 147 147 if (err || written != mtd->erasesize) { 148 148 printk(PRINT_PREF "error: write failed at %#llx\n", addr); 149 149 if (!err) ··· 161 161 void *buf = iobuf; 162 162 163 163 for (i = 0; i < pgcnt; i++) { 164 - err = mtd->write(mtd, addr, pgsize, &written, buf); 164 + err = mtd_write(mtd, addr, pgsize, &written, buf); 165 165 if (err || written != pgsize) { 166 166 printk(PRINT_PREF "error: write failed at %#llx\n", 167 167 addr); ··· 184 184 void *buf = iobuf; 185 185 186 186 for (i = 0; i < n; i++) { 187 - err = mtd->write(mtd, addr, sz, &written, buf); 187 + err = mtd_write(mtd, addr, sz, &written, buf); 188 188 if (err || written != sz) { 189 189 printk(PRINT_PREF "error: write failed at %#llx\n", 190 190 addr); ··· 196 196 buf += sz; 197 197 } 198 198 if (pgcnt % 2) { 199 - err = mtd->write(mtd, addr, pgsize, &written, buf); 199 + err = mtd_write(mtd, addr, pgsize, &written, buf); 200 200 if (err || written != pgsize) { 201 201 printk(PRINT_PREF "error: write failed at %#llx\n", 202 202 addr);
+1 -1
drivers/mtd/tests/mtd_stresstest.c
··· 192 192 } 193 193 } 194 194 addr = eb * mtd->erasesize + offs; 195 - err = mtd->write(mtd, addr, len, &written, writebuf); 195 + err = mtd_write(mtd, addr, len, &written, writebuf); 196 196 if (unlikely(err || written != len)) { 197 197 printk(PRINT_PREF "error: write failed at 0x%llx\n", 198 198 (long long)addr);
+3 -3
drivers/mtd/tests/mtd_subpagetest.c
··· 120 120 loff_t addr = ebnum * mtd->erasesize; 121 121 122 122 set_random_data(writebuf, subpgsize); 123 - err = mtd->write(mtd, addr, subpgsize, &written, writebuf); 123 + err = mtd_write(mtd, addr, subpgsize, &written, writebuf); 124 124 if (unlikely(err || written != subpgsize)) { 125 125 printk(PRINT_PREF "error: write failed at %#llx\n", 126 126 (long long)addr); ··· 134 134 addr += subpgsize; 135 135 136 136 set_random_data(writebuf, subpgsize); 137 - err = mtd->write(mtd, addr, subpgsize, &written, writebuf); 137 + err = mtd_write(mtd, addr, subpgsize, &written, writebuf); 138 138 if (unlikely(err || written != subpgsize)) { 139 139 printk(PRINT_PREF "error: write failed at %#llx\n", 140 140 (long long)addr); ··· 158 158 if (addr + (subpgsize * k) > (ebnum + 1) * mtd->erasesize) 159 159 break; 160 160 set_random_data(writebuf, subpgsize * k); 161 - err = mtd->write(mtd, addr, subpgsize * k, &written, writebuf); 161 + err = mtd_write(mtd, addr, subpgsize * k, &written, writebuf); 162 162 if (unlikely(err || written != subpgsize * k)) { 163 163 printk(PRINT_PREF "error: write failed at %#llx\n", 164 164 (long long)addr);
+1 -1
drivers/mtd/tests/mtd_torturetest.c
··· 189 189 addr = (ebnum + 1) * mtd->erasesize - pgcnt * pgsize; 190 190 len = pgcnt * pgsize; 191 191 } 192 - err = mtd->write(mtd, addr, len, &written, buf); 192 + err = mtd_write(mtd, addr, len, &written, buf); 193 193 if (err) { 194 194 printk(PRINT_PREF "error %d while writing EB %d, written %zd" 195 195 " bytes\n", err, ebnum, written);
+3 -4
drivers/mtd/ubi/io.c
··· 289 289 } 290 290 291 291 addr = (loff_t)pnum * ubi->peb_size + offset; 292 - err = ubi->mtd->write(ubi->mtd, addr, len, &written, buf); 292 + err = mtd_write(ubi->mtd, addr, len, &written, buf); 293 293 if (err) { 294 294 ubi_err("error %d while writing %d bytes to PEB %d:%d, written " 295 295 "%zd bytes", err, len, pnum, offset, written); ··· 525 525 * the header comment in scan.c for more information). 526 526 */ 527 527 addr = (loff_t)pnum * ubi->peb_size; 528 - err = ubi->mtd->write(ubi->mtd, addr, 4, &written, (void *)&data); 528 + err = mtd_write(ubi->mtd, addr, 4, &written, (void *)&data); 529 529 if (!err) { 530 530 addr += ubi->vid_hdr_aloffset; 531 - err = ubi->mtd->write(ubi->mtd, addr, 4, &written, 532 - (void *)&data); 531 + err = mtd_write(ubi->mtd, addr, 4, &written, (void *)&data); 533 532 if (!err) 534 533 return 0; 535 534 }
+5 -3
drivers/staging/spectra/lld_mtd.c
··· 233 233 234 234 235 235 while (PageCount) { 236 - ret = spectra_mtd->write(spectra_mtd, 237 - (Block * spectra_mtd->erasesize) + (Page * spectra_mtd->writesize), 238 - DeviceInfo.wPageDataSize, &retlen, write_data); 236 + ret = mtd_write(spectra_mtd, 237 + (Block * spectra_mtd->erasesize) + (Page * spectra_mtd->writesize), 238 + DeviceInfo.wPageDataSize, 239 + &retlen, 240 + write_data); 239 241 if (ret) { 240 242 printk(KERN_ERR "%s failed %d\n", __func__, ret); 241 243 return FAIL;
+9 -9
fs/jffs2/wbuf.c
··· 414 414 if (breakme++ == 20) { 415 415 printk(KERN_NOTICE "Faking write error at 0x%08x\n", ofs); 416 416 breakme = 0; 417 - c->mtd->write(c->mtd, ofs, towrite, &retlen, 418 - brokenbuf); 417 + mtd_write(c->mtd, ofs, towrite, &retlen, brokenbuf); 419 418 ret = -EIO; 420 419 } else 421 420 #endif 422 - ret = c->mtd->write(c->mtd, ofs, towrite, &retlen, 423 - rewrite_buf); 421 + ret = mtd_write(c->mtd, ofs, towrite, &retlen, 422 + rewrite_buf); 424 423 425 424 if (ret || retlen != towrite || jffs2_verify_write(c, rewrite_buf, ofs)) { 426 425 /* Argh. We tried. Really we did. */ ··· 619 620 if (breakme++ == 20) { 620 621 printk(KERN_NOTICE "Faking write error at 0x%08x\n", c->wbuf_ofs); 621 622 breakme = 0; 622 - c->mtd->write(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, 623 - brokenbuf); 623 + mtd_write(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, 624 + brokenbuf); 624 625 ret = -EIO; 625 626 } else 626 627 #endif 627 628 628 - ret = c->mtd->write(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, c->wbuf); 629 + ret = mtd_write(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, 630 + &retlen, c->wbuf); 629 631 630 632 if (ret) { 631 633 printk(KERN_WARNING "jffs2_flush_wbuf(): Write failed with %d\n", ret); ··· 862 862 v += wbuf_retlen; 863 863 864 864 if (vlen >= c->wbuf_pagesize) { 865 - ret = c->mtd->write(c->mtd, outvec_to, PAGE_DIV(vlen), 866 - &wbuf_retlen, v); 865 + ret = mtd_write(c->mtd, outvec_to, PAGE_DIV(vlen), 866 + &wbuf_retlen, v); 867 867 if (ret < 0 || wbuf_retlen != PAGE_DIV(vlen)) 868 868 goto outfile; 869 869
+3 -2
fs/jffs2/writev.c
··· 26 26 for (i=0; i<count; i++) { 27 27 if (!vecs[i].iov_len) 28 28 continue; 29 - ret = mtd->write(mtd, to, vecs[i].iov_len, &thislen, vecs[i].iov_base); 29 + ret = mtd_write(mtd, to, vecs[i].iov_len, &thislen, 30 + vecs[i].iov_base); 30 31 totlen += thislen; 31 32 if (ret || thislen != vecs[i].iov_len) 32 33 break; ··· 62 61 size_t *retlen, const u_char *buf) 63 62 { 64 63 int ret; 65 - ret = c->mtd->write(c->mtd, ofs, len, retlen, buf); 64 + ret = mtd_write(c->mtd, ofs, len, retlen, buf); 66 65 67 66 if (jffs2_sum_active()) { 68 67 struct kvec vecs[1];
+1 -1
fs/logfs/dev_mtd.c
··· 49 49 BUG_ON(len > PAGE_CACHE_SIZE); 50 50 page_start = ofs & PAGE_CACHE_MASK; 51 51 page_end = PAGE_CACHE_ALIGN(ofs + len) - 1; 52 - ret = mtd->write(mtd, ofs, len, &retlen, buf); 52 + ret = mtd_write(mtd, ofs, len, &retlen, buf); 53 53 if (ret || (retlen != len)) 54 54 return -EIO; 55 55
+8 -1
include/linux/mtd/mtd.h
··· 184 184 unsigned long flags); 185 185 int (*read) (struct mtd_info *mtd, loff_t from, size_t len, 186 186 size_t *retlen, u_char *buf); 187 + int (*write) (struct mtd_info *mtd, loff_t to, size_t len, 188 + size_t *retlen, const u_char *buf); 187 189 188 190 /* Backing device capabilities for this device 189 191 * - provides mmap capabilities ··· 193 191 struct backing_dev_info *backing_dev_info; 194 192 195 193 196 - int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); 197 194 198 195 /* In blackbox flight recorder like scenarios we want to make successful 199 196 writes in interrupt context. panic_write() is only intended to be ··· 307 306 size_t *retlen, u_char *buf) 308 307 { 309 308 return mtd->read(mtd, from, len, retlen, buf); 309 + } 310 + 311 + static inline int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, 312 + size_t *retlen, const u_char *buf) 313 + { 314 + return mtd->write(mtd, to, len, retlen, buf); 310 315 } 311 316 312 317 static inline struct mtd_info *dev_to_mtd(struct device *dev)