Commit a2cc5ba075f9bc837d0b4d4ec7328dcefc11859d
Committed by
David Woodhouse
1 parent
fd2819bbc9
Exists in
master
and in
20 other branches
mtd: introduce mtd_write_oob interface
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Showing 13 changed files with 31 additions and 27 deletions Side-by-side Diff
- drivers/mtd/inftlcore.c
- drivers/mtd/mtdchar.c
- drivers/mtd/mtdconcat.c
- drivers/mtd/mtdpart.c
- drivers/mtd/mtdswap.c
- drivers/mtd/nand/nand_bbt.c
- drivers/mtd/nand/sm_common.c
- drivers/mtd/nftlcore.c
- drivers/mtd/sm_ftl.c
- drivers/mtd/tests/mtd_oobtest.c
- drivers/staging/spectra/lld_mtd.c
- fs/jffs2/wbuf.c
- include/linux/mtd/mtd.h
drivers/mtd/inftlcore.c
... | ... | @@ -178,7 +178,7 @@ |
178 | 178 | ops.oobbuf = buf; |
179 | 179 | ops.datbuf = NULL; |
180 | 180 | |
181 | - res = mtd->write_oob(mtd, offs & ~(mtd->writesize - 1), &ops); | |
181 | + res = mtd_write_oob(mtd, offs & ~(mtd->writesize - 1), &ops); | |
182 | 182 | *retlen = ops.oobretlen; |
183 | 183 | return res; |
184 | 184 | } |
... | ... | @@ -199,7 +199,7 @@ |
199 | 199 | ops.datbuf = buf; |
200 | 200 | ops.len = len; |
201 | 201 | |
202 | - res = mtd->write_oob(mtd, offs & ~(mtd->writesize - 1), &ops); | |
202 | + res = mtd_write_oob(mtd, offs & ~(mtd->writesize - 1), &ops); | |
203 | 203 | *retlen = ops.retlen; |
204 | 204 | return res; |
205 | 205 | } |
drivers/mtd/mtdchar.c
... | ... | @@ -325,7 +325,7 @@ |
325 | 325 | ops.ooboffs = 0; |
326 | 326 | ops.len = len; |
327 | 327 | |
328 | - ret = mtd->write_oob(mtd, *ppos, &ops); | |
328 | + ret = mtd_write_oob(mtd, *ppos, &ops); | |
329 | 329 | retlen = ops.retlen; |
330 | 330 | break; |
331 | 331 | } |
... | ... | @@ -426,7 +426,7 @@ |
426 | 426 | return PTR_ERR(ops.oobbuf); |
427 | 427 | |
428 | 428 | start &= ~((uint64_t)mtd->writesize - 1); |
429 | - ret = mtd->write_oob(mtd, start, &ops); | |
429 | + ret = mtd_write_oob(mtd, start, &ops); | |
430 | 430 | |
431 | 431 | if (ops.oobretlen > 0xFFFFFFFFU) |
432 | 432 | ret = -EOVERFLOW; |
... | ... | @@ -609,7 +609,7 @@ |
609 | 609 | ops.oobbuf = NULL; |
610 | 610 | } |
611 | 611 | |
612 | - ret = mtd->write_oob(mtd, (loff_t)req.start, &ops); | |
612 | + ret = mtd_write_oob(mtd, (loff_t)req.start, &ops); | |
613 | 613 | |
614 | 614 | kfree(ops.datbuf); |
615 | 615 | kfree(ops.oobbuf); |
drivers/mtd/mtdconcat.c
drivers/mtd/mtdpart.c
... | ... | @@ -217,7 +217,7 @@ |
217 | 217 | return -EINVAL; |
218 | 218 | if (ops->datbuf && to + ops->len > mtd->size) |
219 | 219 | return -EINVAL; |
220 | - return part->master->write_oob(part->master, to + part->offset, ops); | |
220 | + return mtd_write_oob(part->master, to + part->offset, ops); | |
221 | 221 | } |
222 | 222 | |
223 | 223 | static int part_write_user_prot_reg(struct mtd_info *mtd, loff_t from, |
drivers/mtd/mtdswap.c
... | ... | @@ -403,7 +403,7 @@ |
403 | 403 | offset = mtdswap_eb_offset(d, eb) + d->mtd->writesize; |
404 | 404 | } |
405 | 405 | |
406 | - ret = d->mtd->write_oob(d->mtd, offset , &ops); | |
406 | + ret = mtd_write_oob(d->mtd, offset, &ops); | |
407 | 407 | |
408 | 408 | if (ret) { |
409 | 409 | dev_warn(d->dev, "Write OOB failed for block at %08llx " |
... | ... | @@ -946,7 +946,7 @@ |
946 | 946 | patt = mtdswap_test_patt(test + i); |
947 | 947 | memset(d->page_buf, patt, mtd->writesize); |
948 | 948 | memset(d->oob_buf, patt, mtd->ecclayout->oobavail); |
949 | - ret = mtd->write_oob(mtd, pos, &ops); | |
949 | + ret = mtd_write_oob(mtd, pos, &ops); | |
950 | 950 | if (ret) |
951 | 951 | goto error; |
952 | 952 |
drivers/mtd/nand/nand_bbt.c
drivers/mtd/nand/sm_common.c
drivers/mtd/nftlcore.c
... | ... | @@ -174,7 +174,7 @@ |
174 | 174 | ops.oobbuf = buf; |
175 | 175 | ops.datbuf = NULL; |
176 | 176 | |
177 | - res = mtd->write_oob(mtd, offs & ~mask, &ops); | |
177 | + res = mtd_write_oob(mtd, offs & ~mask, &ops); | |
178 | 178 | *retlen = ops.oobretlen; |
179 | 179 | return res; |
180 | 180 | } |
... | ... | @@ -198,7 +198,7 @@ |
198 | 198 | ops.datbuf = buf; |
199 | 199 | ops.len = len; |
200 | 200 | |
201 | - res = mtd->write_oob(mtd, offs & ~mask, &ops); | |
201 | + res = mtd_write_oob(mtd, offs & ~mask, &ops); | |
202 | 202 | *retlen = ops.retlen; |
203 | 203 | return res; |
204 | 204 | } |
drivers/mtd/sm_ftl.c
... | ... | @@ -343,7 +343,7 @@ |
343 | 343 | ops.ooblen = SM_OOB_SIZE; |
344 | 344 | ops.oobbuf = (void *)oob; |
345 | 345 | |
346 | - ret = mtd->write_oob(mtd, sm_mkoffset(ftl, zone, block, boffset), &ops); | |
346 | + ret = mtd_write_oob(mtd, sm_mkoffset(ftl, zone, block, boffset), &ops); | |
347 | 347 | |
348 | 348 | /* Now we assume that hardware will catch write bitflip errors */ |
349 | 349 | /* If you are paranoid, use CONFIG_MTD_NAND_VERIFY_WRITE */ |
drivers/mtd/tests/mtd_oobtest.c
... | ... | @@ -139,7 +139,7 @@ |
139 | 139 | ops.ooboffs = use_offset; |
140 | 140 | ops.datbuf = NULL; |
141 | 141 | ops.oobbuf = writebuf; |
142 | - err = mtd->write_oob(mtd, addr, &ops); | |
142 | + err = mtd_write_oob(mtd, addr, &ops); | |
143 | 143 | if (err || ops.oobretlen != use_len) { |
144 | 144 | printk(PRINT_PREF "error: writeoob failed at %#llx\n", |
145 | 145 | (long long)addr); |
... | ... | @@ -524,7 +524,7 @@ |
524 | 524 | ops.oobbuf = writebuf; |
525 | 525 | printk(PRINT_PREF "attempting to start write past end of OOB\n"); |
526 | 526 | printk(PRINT_PREF "an error is expected...\n"); |
527 | - err = mtd->write_oob(mtd, addr0, &ops); | |
527 | + err = mtd_write_oob(mtd, addr0, &ops); | |
528 | 528 | if (err) { |
529 | 529 | printk(PRINT_PREF "error occurred as expected\n"); |
530 | 530 | err = 0; |
... | ... | @@ -568,7 +568,7 @@ |
568 | 568 | ops.oobbuf = writebuf; |
569 | 569 | printk(PRINT_PREF "attempting to write past end of device\n"); |
570 | 570 | printk(PRINT_PREF "an error is expected...\n"); |
571 | - err = mtd->write_oob(mtd, mtd->size - mtd->writesize, &ops); | |
571 | + err = mtd_write_oob(mtd, mtd->size - mtd->writesize, &ops); | |
572 | 572 | if (err) { |
573 | 573 | printk(PRINT_PREF "error occurred as expected\n"); |
574 | 574 | err = 0; |
... | ... | @@ -612,7 +612,7 @@ |
612 | 612 | ops.oobbuf = writebuf; |
613 | 613 | printk(PRINT_PREF "attempting to write past end of device\n"); |
614 | 614 | printk(PRINT_PREF "an error is expected...\n"); |
615 | - err = mtd->write_oob(mtd, mtd->size - mtd->writesize, &ops); | |
615 | + err = mtd_write_oob(mtd, mtd->size - mtd->writesize, &ops); | |
616 | 616 | if (err) { |
617 | 617 | printk(PRINT_PREF "error occurred as expected\n"); |
618 | 618 | err = 0; |
... | ... | @@ -670,7 +670,7 @@ |
670 | 670 | ops.ooboffs = 0; |
671 | 671 | ops.datbuf = NULL; |
672 | 672 | ops.oobbuf = writebuf; |
673 | - err = mtd->write_oob(mtd, addr, &ops); | |
673 | + err = mtd_write_oob(mtd, addr, &ops); | |
674 | 674 | if (err) |
675 | 675 | goto out; |
676 | 676 | if (i % 256 == 0) |
drivers/staging/spectra/lld_mtd.c
... | ... | @@ -411,9 +411,9 @@ |
411 | 411 | ops.ooblen = BTSIG_BYTES; |
412 | 412 | ops.ooboffs = 0; |
413 | 413 | |
414 | - ret = spectra_mtd->write_oob(spectra_mtd, | |
415 | - (Block * spectra_mtd->erasesize) + (Page * spectra_mtd->writesize), | |
416 | - &ops); | |
414 | + ret = mtd_write_oob(spectra_mtd, | |
415 | + (Block * spectra_mtd->erasesize) + (Page * spectra_mtd->writesize), | |
416 | + &ops); | |
417 | 417 | if (ret) { |
418 | 418 | printk(KERN_ERR "%s failed %d\n", __func__, ret); |
419 | 419 | return FAIL; |
fs/jffs2/wbuf.c
... | ... | @@ -1101,7 +1101,7 @@ |
1101 | 1101 | ops.len = ops.ooboffs = ops.retlen = ops.oobretlen = 0; |
1102 | 1102 | ops.datbuf = NULL; |
1103 | 1103 | |
1104 | - ret = c->mtd->write_oob(c->mtd, jeb->offset, &ops); | |
1104 | + ret = mtd_write_oob(c->mtd, jeb->offset, &ops); | |
1105 | 1105 | if (ret || ops.oobretlen != ops.ooblen) { |
1106 | 1106 | printk(KERN_ERR "cannot write OOB for EB at %08x, requested %zd" |
1107 | 1107 | " bytes, read %zd bytes, error %d\n", |
include/linux/mtd/mtd.h
... | ... | @@ -190,16 +190,14 @@ |
190 | 190 | size_t *retlen, const u_char *buf); |
191 | 191 | int (*read_oob) (struct mtd_info *mtd, loff_t from, |
192 | 192 | struct mtd_oob_ops *ops); |
193 | + int (*write_oob) (struct mtd_info *mtd, loff_t to, | |
194 | + struct mtd_oob_ops *ops); | |
193 | 195 | |
194 | 196 | /* Backing device capabilities for this device |
195 | 197 | * - provides mmap capabilities |
196 | 198 | */ |
197 | 199 | struct backing_dev_info *backing_dev_info; |
198 | 200 | |
199 | - | |
200 | - int (*write_oob) (struct mtd_info *mtd, loff_t to, | |
201 | - struct mtd_oob_ops *ops); | |
202 | - | |
203 | 201 | /* |
204 | 202 | * Methods to access the protection register area, present in some |
205 | 203 | * flash devices. The user data is one time programmable but the |
... | ... | @@ -324,6 +322,12 @@ |
324 | 322 | struct mtd_oob_ops *ops) |
325 | 323 | { |
326 | 324 | return mtd->read_oob(mtd, from, ops); |
325 | +} | |
326 | + | |
327 | +static inline int mtd_write_oob(struct mtd_info *mtd, loff_t to, | |
328 | + struct mtd_oob_ops *ops) | |
329 | +{ | |
330 | + return mtd->write_oob(mtd, to, ops); | |
327 | 331 | } |
328 | 332 | |
329 | 333 | static inline struct mtd_info *dev_to_mtd(struct device *dev) |