aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris BREZILLON <boris.brezillon@free-electrons.com>2016-03-07 04:46:51 -0500
committerBrian Norris <computersforpeace@gmail.com>2016-03-07 19:23:09 -0500
commitf5b8aa78ef086248145363bf1ffe5ca4348b6a98 (patch)
treee1cbe852ebab047c0acf6af3c7498b11d37d2786
parent9ebfdf5b18493f338237ef9861a555c2f79b0c17 (diff)
mtd: kill the ecclayout->oobavail field
ecclayout->oobavail is just redundant with the mtd->oobavail field. Moreover, it prevents static const definition of ecc layouts since the NAND framework is calculating this value based on the ecclayout->oobfree field. Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-rw-r--r--drivers/mtd/devices/docg3.c5
-rw-r--r--drivers/mtd/mtdswap.c16
-rw-r--r--drivers/mtd/nand/brcmnand/brcmnand.c8
-rw-r--r--drivers/mtd/nand/docg4.c1
-rw-r--r--drivers/mtd/nand/hisi504_nand.c1
-rw-r--r--drivers/mtd/nand/nand_base.c14
-rw-r--r--drivers/mtd/onenand/onenand_base.c16
-rw-r--r--drivers/mtd/tests/oobtest.c49
-rw-r--r--drivers/staging/mt29f_spinand/mt29f_spinand.c1
-rw-r--r--fs/jffs2/wbuf.c6
-rw-r--r--include/linux/mtd/mtd.h1
11 files changed, 53 insertions, 65 deletions
diff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c
index c3a2695a4420..e7b2e439696c 100644
--- a/drivers/mtd/devices/docg3.c
+++ b/drivers/mtd/devices/docg3.c
@@ -72,13 +72,11 @@ MODULE_PARM_DESC(reliable_mode, "Set the docg3 mode (0=normal MLC, 1=fast, "
72 * @eccbytes: 8 bytes are used (1 for Hamming ECC, 7 for BCH ECC) 72 * @eccbytes: 8 bytes are used (1 for Hamming ECC, 7 for BCH ECC)
73 * @eccpos: ecc positions (byte 7 is Hamming ECC, byte 8-14 are BCH ECC) 73 * @eccpos: ecc positions (byte 7 is Hamming ECC, byte 8-14 are BCH ECC)
74 * @oobfree: free pageinfo bytes (byte 0 until byte 6, byte 15 74 * @oobfree: free pageinfo bytes (byte 0 until byte 6, byte 15
75 * @oobavail: 8 available bytes remaining after ECC toll
76 */ 75 */
77static struct nand_ecclayout docg3_oobinfo = { 76static struct nand_ecclayout docg3_oobinfo = {
78 .eccbytes = 8, 77 .eccbytes = 8,
79 .eccpos = {7, 8, 9, 10, 11, 12, 13, 14}, 78 .eccpos = {7, 8, 9, 10, 11, 12, 13, 14},
80 .oobfree = {{0, 7}, {15, 1} }, 79 .oobfree = {{0, 7}, {15, 1} },
81 .oobavail = 8,
82}; 80};
83 81
84static inline u8 doc_readb(struct docg3 *docg3, u16 reg) 82static inline u8 doc_readb(struct docg3 *docg3, u16 reg)
@@ -1438,7 +1436,7 @@ static int doc_write_oob(struct mtd_info *mtd, loff_t ofs,
1438 oobdelta = mtd->oobsize; 1436 oobdelta = mtd->oobsize;
1439 break; 1437 break;
1440 case MTD_OPS_AUTO_OOB: 1438 case MTD_OPS_AUTO_OOB:
1441 oobdelta = mtd->ecclayout->oobavail; 1439 oobdelta = mtd->oobavail;
1442 break; 1440 break;
1443 default: 1441 default:
1444 return -EINVAL; 1442 return -EINVAL;
@@ -1860,6 +1858,7 @@ static int __init doc_set_driver_info(int chip_id, struct mtd_info *mtd)
1860 mtd->_write_oob = doc_write_oob; 1858 mtd->_write_oob = doc_write_oob;
1861 mtd->_block_isbad = doc_block_isbad; 1859 mtd->_block_isbad = doc_block_isbad;
1862 mtd->ecclayout = &docg3_oobinfo; 1860 mtd->ecclayout = &docg3_oobinfo;
1861 mtd->oobavail = 8;
1863 mtd->ecc_strength = DOC_ECC_BCH_T; 1862 mtd->ecc_strength = DOC_ECC_BCH_T;
1864 1863
1865 return 0; 1864 return 0;
diff --git a/drivers/mtd/mtdswap.c b/drivers/mtd/mtdswap.c
index fc8b3d16cce7..d330eb1d3eba 100644
--- a/drivers/mtd/mtdswap.c
+++ b/drivers/mtd/mtdswap.c
@@ -346,7 +346,7 @@ static int mtdswap_read_markers(struct mtdswap_dev *d, struct swap_eb *eb)
346 if (mtd_can_have_bb(d->mtd) && mtd_block_isbad(d->mtd, offset)) 346 if (mtd_can_have_bb(d->mtd) && mtd_block_isbad(d->mtd, offset))
347 return MTDSWAP_SCANNED_BAD; 347 return MTDSWAP_SCANNED_BAD;
348 348
349 ops.ooblen = 2 * d->mtd->ecclayout->oobavail; 349 ops.ooblen = 2 * d->mtd->oobavail;
350 ops.oobbuf = d->oob_buf; 350 ops.oobbuf = d->oob_buf;
351 ops.ooboffs = 0; 351 ops.ooboffs = 0;
352 ops.datbuf = NULL; 352 ops.datbuf = NULL;
@@ -359,7 +359,7 @@ static int mtdswap_read_markers(struct mtdswap_dev *d, struct swap_eb *eb)
359 359
360 data = (struct mtdswap_oobdata *)d->oob_buf; 360 data = (struct mtdswap_oobdata *)d->oob_buf;
361 data2 = (struct mtdswap_oobdata *) 361 data2 = (struct mtdswap_oobdata *)
362 (d->oob_buf + d->mtd->ecclayout->oobavail); 362 (d->oob_buf + d->mtd->oobavail);
363 363
364 if (le16_to_cpu(data->magic) == MTDSWAP_MAGIC_CLEAN) { 364 if (le16_to_cpu(data->magic) == MTDSWAP_MAGIC_CLEAN) {
365 eb->erase_count = le32_to_cpu(data->count); 365 eb->erase_count = le32_to_cpu(data->count);
@@ -933,7 +933,7 @@ static unsigned int mtdswap_eblk_passes(struct mtdswap_dev *d,
933 933
934 ops.mode = MTD_OPS_AUTO_OOB; 934 ops.mode = MTD_OPS_AUTO_OOB;
935 ops.len = mtd->writesize; 935 ops.len = mtd->writesize;
936 ops.ooblen = mtd->ecclayout->oobavail; 936 ops.ooblen = mtd->oobavail;
937 ops.ooboffs = 0; 937 ops.ooboffs = 0;
938 ops.datbuf = d->page_buf; 938 ops.datbuf = d->page_buf;
939 ops.oobbuf = d->oob_buf; 939 ops.oobbuf = d->oob_buf;
@@ -945,7 +945,7 @@ static unsigned int mtdswap_eblk_passes(struct mtdswap_dev *d,
945 for (i = 0; i < mtd_pages; i++) { 945 for (i = 0; i < mtd_pages; i++) {
946 patt = mtdswap_test_patt(test + i); 946 patt = mtdswap_test_patt(test + i);
947 memset(d->page_buf, patt, mtd->writesize); 947 memset(d->page_buf, patt, mtd->writesize);
948 memset(d->oob_buf, patt, mtd->ecclayout->oobavail); 948 memset(d->oob_buf, patt, mtd->oobavail);
949 ret = mtd_write_oob(mtd, pos, &ops); 949 ret = mtd_write_oob(mtd, pos, &ops);
950 if (ret) 950 if (ret)
951 goto error; 951 goto error;
@@ -964,7 +964,7 @@ static unsigned int mtdswap_eblk_passes(struct mtdswap_dev *d,
964 if (p1[j] != patt) 964 if (p1[j] != patt)
965 goto error; 965 goto error;
966 966
967 for (j = 0; j < mtd->ecclayout->oobavail; j++) 967 for (j = 0; j < mtd->oobavail; j++)
968 if (p2[j] != (unsigned char)patt) 968 if (p2[j] != (unsigned char)patt)
969 goto error; 969 goto error;
970 970
@@ -1387,7 +1387,7 @@ static int mtdswap_init(struct mtdswap_dev *d, unsigned int eblocks,
1387 if (!d->page_buf) 1387 if (!d->page_buf)
1388 goto page_buf_fail; 1388 goto page_buf_fail;
1389 1389
1390 d->oob_buf = kmalloc(2 * mtd->ecclayout->oobavail, GFP_KERNEL); 1390 d->oob_buf = kmalloc(2 * mtd->oobavail, GFP_KERNEL);
1391 if (!d->oob_buf) 1391 if (!d->oob_buf)
1392 goto oob_buf_fail; 1392 goto oob_buf_fail;
1393 1393
@@ -1454,10 +1454,10 @@ static void mtdswap_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
1454 return; 1454 return;
1455 } 1455 }
1456 1456
1457 if (!mtd->oobsize || oinfo->oobavail < MTDSWAP_OOBSIZE) { 1457 if (!mtd->oobsize || mtd->oobavail < MTDSWAP_OOBSIZE) {
1458 printk(KERN_ERR "%s: Not enough free bytes in OOB, " 1458 printk(KERN_ERR "%s: Not enough free bytes in OOB, "
1459 "%d available, %zu needed.\n", 1459 "%d available, %zu needed.\n",
1460 MTDSWAP_PREFIX, oinfo->oobavail, MTDSWAP_OOBSIZE); 1460 MTDSWAP_PREFIX, mtd->oobavail, MTDSWAP_OOBSIZE);
1461 return; 1461 return;
1462 } 1462 }
1463 1463
diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c
index f7009c1cb90c..e0528397306a 100644
--- a/drivers/mtd/nand/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/brcmnand/brcmnand.c
@@ -828,7 +828,8 @@ static struct nand_ecclayout *brcmnand_create_layout(int ecc_level,
828 idx2 >= MTD_MAX_OOBFREE_ENTRIES_LARGE - 1) 828 idx2 >= MTD_MAX_OOBFREE_ENTRIES_LARGE - 1)
829 break; 829 break;
830 } 830 }
831 goto out; 831
832 return layout;
832 } 833 }
833 834
834 /* 835 /*
@@ -879,10 +880,7 @@ static struct nand_ecclayout *brcmnand_create_layout(int ecc_level,
879 idx2 >= MTD_MAX_OOBFREE_ENTRIES_LARGE - 1) 880 idx2 >= MTD_MAX_OOBFREE_ENTRIES_LARGE - 1)
880 break; 881 break;
881 } 882 }
882out: 883
883 /* Sum available OOB */
884 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES_LARGE; i++)
885 layout->oobavail += layout->oobfree[i].length;
886 return layout; 884 return layout;
887} 885}
888 886
diff --git a/drivers/mtd/nand/docg4.c b/drivers/mtd/nand/docg4.c
index df4165b02c62..fb46fd7e056b 100644
--- a/drivers/mtd/nand/docg4.c
+++ b/drivers/mtd/nand/docg4.c
@@ -225,7 +225,6 @@ struct docg4_priv {
225static struct nand_ecclayout docg4_oobinfo = { 225static struct nand_ecclayout docg4_oobinfo = {
226 .eccbytes = 9, 226 .eccbytes = 9,
227 .eccpos = {7, 8, 9, 10, 11, 12, 13, 14, 15}, 227 .eccpos = {7, 8, 9, 10, 11, 12, 13, 14, 15},
228 .oobavail = 5,
229 .oobfree = { {.offset = 2, .length = 5} } 228 .oobfree = { {.offset = 2, .length = 5} }
230}; 229};
231 230
diff --git a/drivers/mtd/nand/hisi504_nand.c b/drivers/mtd/nand/hisi504_nand.c
index f8d37f36a81c..96502b624cfb 100644
--- a/drivers/mtd/nand/hisi504_nand.c
+++ b/drivers/mtd/nand/hisi504_nand.c
@@ -632,7 +632,6 @@ static void hisi_nfc_host_init(struct hinfc_host *host)
632} 632}
633 633
634static struct nand_ecclayout nand_ecc_2K_16bits = { 634static struct nand_ecclayout nand_ecc_2K_16bits = {
635 .oobavail = 6,
636 .oobfree = { {2, 6} }, 635 .oobfree = { {2, 6} },
637}; 636};
638 637
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 596a9b0503da..53993df0c25a 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -2076,7 +2076,7 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
2076 stats = mtd->ecc_stats; 2076 stats = mtd->ecc_stats;
2077 2077
2078 if (ops->mode == MTD_OPS_AUTO_OOB) 2078 if (ops->mode == MTD_OPS_AUTO_OOB)
2079 len = chip->ecc.layout->oobavail; 2079 len = mtd->oobavail;
2080 else 2080 else
2081 len = mtd->oobsize; 2081 len = mtd->oobsize;
2082 2082
@@ -2767,7 +2767,7 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
2767 __func__, (unsigned int)to, (int)ops->ooblen); 2767 __func__, (unsigned int)to, (int)ops->ooblen);
2768 2768
2769 if (ops->mode == MTD_OPS_AUTO_OOB) 2769 if (ops->mode == MTD_OPS_AUTO_OOB)
2770 len = chip->ecc.layout->oobavail; 2770 len = mtd->oobavail;
2771 else 2771 else
2772 len = mtd->oobsize; 2772 len = mtd->oobsize;
2773 2773
@@ -4325,11 +4325,11 @@ int nand_scan_tail(struct mtd_info *mtd)
4325 * The number of bytes available for a client to place data into 4325 * The number of bytes available for a client to place data into
4326 * the out of band area. 4326 * the out of band area.
4327 */ 4327 */
4328 ecc->layout->oobavail = 0; 4328 mtd->oobavail = 0;
4329 for (i = 0; ecc->layout->oobfree[i].length 4329 if (ecc->layout) {
4330 && i < ARRAY_SIZE(ecc->layout->oobfree); i++) 4330 for (i = 0; ecc->layout->oobfree[i].length; i++)
4331 ecc->layout->oobavail += ecc->layout->oobfree[i].length; 4331 mtd->oobavail += ecc->layout->oobfree[i].length;
4332 mtd->oobavail = ecc->layout->oobavail; 4332 }
4333 4333
4334 /* ECC sanity check: warn if it's too weak */ 4334 /* ECC sanity check: warn if it's too weak */
4335 if (!nand_ecc_strength_good(mtd)) 4335 if (!nand_ecc_strength_good(mtd))
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c
index 652d01832873..df47537d1feb 100644
--- a/drivers/mtd/onenand/onenand_base.c
+++ b/drivers/mtd/onenand/onenand_base.c
@@ -1125,7 +1125,7 @@ static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1125 (int)len); 1125 (int)len);
1126 1126
1127 if (ops->mode == MTD_OPS_AUTO_OOB) 1127 if (ops->mode == MTD_OPS_AUTO_OOB)
1128 oobsize = this->ecclayout->oobavail; 1128 oobsize = mtd->oobavail;
1129 else 1129 else
1130 oobsize = mtd->oobsize; 1130 oobsize = mtd->oobsize;
1131 1131
@@ -1230,7 +1230,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1230 (int)len); 1230 (int)len);
1231 1231
1232 if (ops->mode == MTD_OPS_AUTO_OOB) 1232 if (ops->mode == MTD_OPS_AUTO_OOB)
1233 oobsize = this->ecclayout->oobavail; 1233 oobsize = mtd->oobavail;
1234 else 1234 else
1235 oobsize = mtd->oobsize; 1235 oobsize = mtd->oobsize;
1236 1236
@@ -1365,7 +1365,7 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
1365 ops->oobretlen = 0; 1365 ops->oobretlen = 0;
1366 1366
1367 if (mode == MTD_OPS_AUTO_OOB) 1367 if (mode == MTD_OPS_AUTO_OOB)
1368 oobsize = this->ecclayout->oobavail; 1368 oobsize = mtd->oobavail;
1369 else 1369 else
1370 oobsize = mtd->oobsize; 1370 oobsize = mtd->oobsize;
1371 1371
@@ -1887,7 +1887,7 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
1887 return 0; 1887 return 0;
1888 1888
1889 if (ops->mode == MTD_OPS_AUTO_OOB) 1889 if (ops->mode == MTD_OPS_AUTO_OOB)
1890 oobsize = this->ecclayout->oobavail; 1890 oobsize = mtd->oobavail;
1891 else 1891 else
1892 oobsize = mtd->oobsize; 1892 oobsize = mtd->oobsize;
1893 1893
@@ -2063,7 +2063,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2063 ops->oobretlen = 0; 2063 ops->oobretlen = 0;
2064 2064
2065 if (mode == MTD_OPS_AUTO_OOB) 2065 if (mode == MTD_OPS_AUTO_OOB)
2066 oobsize = this->ecclayout->oobavail; 2066 oobsize = mtd->oobavail;
2067 else 2067 else
2068 oobsize = mtd->oobsize; 2068 oobsize = mtd->oobsize;
2069 2069
@@ -4050,12 +4050,10 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
4050 * The number of bytes available for a client to place data into 4050 * The number of bytes available for a client to place data into
4051 * the out of band area 4051 * the out of band area
4052 */ 4052 */
4053 this->ecclayout->oobavail = 0; 4053 mtd->oobavail = 0;
4054 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && 4054 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES &&
4055 this->ecclayout->oobfree[i].length; i++) 4055 this->ecclayout->oobfree[i].length; i++)
4056 this->ecclayout->oobavail += 4056 mtd->oobavail += this->ecclayout->oobfree[i].length;
4057 this->ecclayout->oobfree[i].length;
4058 mtd->oobavail = this->ecclayout->oobavail;
4059 4057
4060 mtd->ecclayout = this->ecclayout; 4058 mtd->ecclayout = this->ecclayout;
4061 mtd->ecc_strength = 1; 4059 mtd->ecc_strength = 1;
diff --git a/drivers/mtd/tests/oobtest.c b/drivers/mtd/tests/oobtest.c
index 31762120eb56..1cb3f7758fb6 100644
--- a/drivers/mtd/tests/oobtest.c
+++ b/drivers/mtd/tests/oobtest.c
@@ -215,19 +215,19 @@ static int verify_eraseblock(int ebnum)
215 pr_info("ignoring error as within bitflip_limit\n"); 215 pr_info("ignoring error as within bitflip_limit\n");
216 } 216 }
217 217
218 if (use_offset != 0 || use_len < mtd->ecclayout->oobavail) { 218 if (use_offset != 0 || use_len < mtd->oobavail) {
219 int k; 219 int k;
220 220
221 ops.mode = MTD_OPS_AUTO_OOB; 221 ops.mode = MTD_OPS_AUTO_OOB;
222 ops.len = 0; 222 ops.len = 0;
223 ops.retlen = 0; 223 ops.retlen = 0;
224 ops.ooblen = mtd->ecclayout->oobavail; 224 ops.ooblen = mtd->oobavail;
225 ops.oobretlen = 0; 225 ops.oobretlen = 0;
226 ops.ooboffs = 0; 226 ops.ooboffs = 0;
227 ops.datbuf = NULL; 227 ops.datbuf = NULL;
228 ops.oobbuf = readbuf; 228 ops.oobbuf = readbuf;
229 err = mtd_read_oob(mtd, addr, &ops); 229 err = mtd_read_oob(mtd, addr, &ops);
230 if (err || ops.oobretlen != mtd->ecclayout->oobavail) { 230 if (err || ops.oobretlen != mtd->oobavail) {
231 pr_err("error: readoob failed at %#llx\n", 231 pr_err("error: readoob failed at %#llx\n",
232 (long long)addr); 232 (long long)addr);
233 errcnt += 1; 233 errcnt += 1;
@@ -244,7 +244,7 @@ static int verify_eraseblock(int ebnum)
244 /* verify post-(use_offset + use_len) area for 0xff */ 244 /* verify post-(use_offset + use_len) area for 0xff */
245 k = use_offset + use_len; 245 k = use_offset + use_len;
246 bitflips += memffshow(addr, k, readbuf + k, 246 bitflips += memffshow(addr, k, readbuf + k,
247 mtd->ecclayout->oobavail - k); 247 mtd->oobavail - k);
248 248
249 if (bitflips > bitflip_limit) { 249 if (bitflips > bitflip_limit) {
250 pr_err("error: verify failed at %#llx\n", 250 pr_err("error: verify failed at %#llx\n",
@@ -269,8 +269,8 @@ static int verify_eraseblock_in_one_go(int ebnum)
269 struct mtd_oob_ops ops; 269 struct mtd_oob_ops ops;
270 int err = 0; 270 int err = 0;
271 loff_t addr = (loff_t)ebnum * mtd->erasesize; 271 loff_t addr = (loff_t)ebnum * mtd->erasesize;
272 size_t len = mtd->ecclayout->oobavail * pgcnt; 272 size_t len = mtd->oobavail * pgcnt;
273 size_t oobavail = mtd->ecclayout->oobavail; 273 size_t oobavail = mtd->oobavail;
274 size_t bitflips; 274 size_t bitflips;
275 int i; 275 int i;
276 276
@@ -394,8 +394,8 @@ static int __init mtd_oobtest_init(void)
394 goto out; 394 goto out;
395 395
396 use_offset = 0; 396 use_offset = 0;
397 use_len = mtd->ecclayout->oobavail; 397 use_len = mtd->oobavail;
398 use_len_max = mtd->ecclayout->oobavail; 398 use_len_max = mtd->oobavail;
399 vary_offset = 0; 399 vary_offset = 0;
400 400
401 /* First test: write all OOB, read it back and verify */ 401 /* First test: write all OOB, read it back and verify */
@@ -460,8 +460,8 @@ static int __init mtd_oobtest_init(void)
460 460
461 /* Write all eraseblocks */ 461 /* Write all eraseblocks */
462 use_offset = 0; 462 use_offset = 0;
463 use_len = mtd->ecclayout->oobavail; 463 use_len = mtd->oobavail;
464 use_len_max = mtd->ecclayout->oobavail; 464 use_len_max = mtd->oobavail;
465 vary_offset = 1; 465 vary_offset = 1;
466 prandom_seed_state(&rnd_state, 5); 466 prandom_seed_state(&rnd_state, 5);
467 467
@@ -471,8 +471,8 @@ static int __init mtd_oobtest_init(void)
471 471
472 /* Check all eraseblocks */ 472 /* Check all eraseblocks */
473 use_offset = 0; 473 use_offset = 0;
474 use_len = mtd->ecclayout->oobavail; 474 use_len = mtd->oobavail;
475 use_len_max = mtd->ecclayout->oobavail; 475 use_len_max = mtd->oobavail;
476 vary_offset = 1; 476 vary_offset = 1;
477 prandom_seed_state(&rnd_state, 5); 477 prandom_seed_state(&rnd_state, 5);
478 err = verify_all_eraseblocks(); 478 err = verify_all_eraseblocks();
@@ -480,8 +480,8 @@ static int __init mtd_oobtest_init(void)
480 goto out; 480 goto out;
481 481
482 use_offset = 0; 482 use_offset = 0;
483 use_len = mtd->ecclayout->oobavail; 483 use_len = mtd->oobavail;
484 use_len_max = mtd->ecclayout->oobavail; 484 use_len_max = mtd->oobavail;
485 vary_offset = 0; 485 vary_offset = 0;
486 486
487 /* Fourth test: try to write off end of device */ 487 /* Fourth test: try to write off end of device */
@@ -501,7 +501,7 @@ static int __init mtd_oobtest_init(void)
501 ops.retlen = 0; 501 ops.retlen = 0;
502 ops.ooblen = 1; 502 ops.ooblen = 1;
503 ops.oobretlen = 0; 503 ops.oobretlen = 0;
504 ops.ooboffs = mtd->ecclayout->oobavail; 504 ops.ooboffs = mtd->oobavail;
505 ops.datbuf = NULL; 505 ops.datbuf = NULL;
506 ops.oobbuf = writebuf; 506 ops.oobbuf = writebuf;
507 pr_info("attempting to start write past end of OOB\n"); 507 pr_info("attempting to start write past end of OOB\n");
@@ -521,7 +521,7 @@ static int __init mtd_oobtest_init(void)
521 ops.retlen = 0; 521 ops.retlen = 0;
522 ops.ooblen = 1; 522 ops.ooblen = 1;
523 ops.oobretlen = 0; 523 ops.oobretlen = 0;
524 ops.ooboffs = mtd->ecclayout->oobavail; 524 ops.ooboffs = mtd->oobavail;
525 ops.datbuf = NULL; 525 ops.datbuf = NULL;
526 ops.oobbuf = readbuf; 526 ops.oobbuf = readbuf;
527 pr_info("attempting to start read past end of OOB\n"); 527 pr_info("attempting to start read past end of OOB\n");
@@ -543,7 +543,7 @@ static int __init mtd_oobtest_init(void)
543 ops.mode = MTD_OPS_AUTO_OOB; 543 ops.mode = MTD_OPS_AUTO_OOB;
544 ops.len = 0; 544 ops.len = 0;
545 ops.retlen = 0; 545 ops.retlen = 0;
546 ops.ooblen = mtd->ecclayout->oobavail + 1; 546 ops.ooblen = mtd->oobavail + 1;
547 ops.oobretlen = 0; 547 ops.oobretlen = 0;
548 ops.ooboffs = 0; 548 ops.ooboffs = 0;
549 ops.datbuf = NULL; 549 ops.datbuf = NULL;
@@ -563,7 +563,7 @@ static int __init mtd_oobtest_init(void)
563 ops.mode = MTD_OPS_AUTO_OOB; 563 ops.mode = MTD_OPS_AUTO_OOB;
564 ops.len = 0; 564 ops.len = 0;
565 ops.retlen = 0; 565 ops.retlen = 0;
566 ops.ooblen = mtd->ecclayout->oobavail + 1; 566 ops.ooblen = mtd->oobavail + 1;
567 ops.oobretlen = 0; 567 ops.oobretlen = 0;
568 ops.ooboffs = 0; 568 ops.ooboffs = 0;
569 ops.datbuf = NULL; 569 ops.datbuf = NULL;
@@ -587,7 +587,7 @@ static int __init mtd_oobtest_init(void)
587 ops.mode = MTD_OPS_AUTO_OOB; 587 ops.mode = MTD_OPS_AUTO_OOB;
588 ops.len = 0; 588 ops.len = 0;
589 ops.retlen = 0; 589 ops.retlen = 0;
590 ops.ooblen = mtd->ecclayout->oobavail; 590 ops.ooblen = mtd->oobavail;
591 ops.oobretlen = 0; 591 ops.oobretlen = 0;
592 ops.ooboffs = 1; 592 ops.ooboffs = 1;
593 ops.datbuf = NULL; 593 ops.datbuf = NULL;
@@ -607,7 +607,7 @@ static int __init mtd_oobtest_init(void)
607 ops.mode = MTD_OPS_AUTO_OOB; 607 ops.mode = MTD_OPS_AUTO_OOB;
608 ops.len = 0; 608 ops.len = 0;
609 ops.retlen = 0; 609 ops.retlen = 0;
610 ops.ooblen = mtd->ecclayout->oobavail; 610 ops.ooblen = mtd->oobavail;
611 ops.oobretlen = 0; 611 ops.oobretlen = 0;
612 ops.ooboffs = 1; 612 ops.ooboffs = 1;
613 ops.datbuf = NULL; 613 ops.datbuf = NULL;
@@ -638,7 +638,7 @@ static int __init mtd_oobtest_init(void)
638 for (i = 0; i < ebcnt - 1; ++i) { 638 for (i = 0; i < ebcnt - 1; ++i) {
639 int cnt = 2; 639 int cnt = 2;
640 int pg; 640 int pg;
641 size_t sz = mtd->ecclayout->oobavail; 641 size_t sz = mtd->oobavail;
642 if (bbt[i] || bbt[i + 1]) 642 if (bbt[i] || bbt[i + 1])
643 continue; 643 continue;
644 addr = (loff_t)(i + 1) * mtd->erasesize - mtd->writesize; 644 addr = (loff_t)(i + 1) * mtd->erasesize - mtd->writesize;
@@ -673,13 +673,12 @@ static int __init mtd_oobtest_init(void)
673 for (i = 0; i < ebcnt - 1; ++i) { 673 for (i = 0; i < ebcnt - 1; ++i) {
674 if (bbt[i] || bbt[i + 1]) 674 if (bbt[i] || bbt[i + 1])
675 continue; 675 continue;
676 prandom_bytes_state(&rnd_state, writebuf, 676 prandom_bytes_state(&rnd_state, writebuf, mtd->oobavail * 2);
677 mtd->ecclayout->oobavail * 2);
678 addr = (loff_t)(i + 1) * mtd->erasesize - mtd->writesize; 677 addr = (loff_t)(i + 1) * mtd->erasesize - mtd->writesize;
679 ops.mode = MTD_OPS_AUTO_OOB; 678 ops.mode = MTD_OPS_AUTO_OOB;
680 ops.len = 0; 679 ops.len = 0;
681 ops.retlen = 0; 680 ops.retlen = 0;
682 ops.ooblen = mtd->ecclayout->oobavail * 2; 681 ops.ooblen = mtd->oobavail * 2;
683 ops.oobretlen = 0; 682 ops.oobretlen = 0;
684 ops.ooboffs = 0; 683 ops.ooboffs = 0;
685 ops.datbuf = NULL; 684 ops.datbuf = NULL;
@@ -688,7 +687,7 @@ static int __init mtd_oobtest_init(void)
688 if (err) 687 if (err)
689 goto out; 688 goto out;
690 if (memcmpshow(addr, readbuf, writebuf, 689 if (memcmpshow(addr, readbuf, writebuf,
691 mtd->ecclayout->oobavail * 2)) { 690 mtd->oobavail * 2)) {
692 pr_err("error: verify failed at %#llx\n", 691 pr_err("error: verify failed at %#llx\n",
693 (long long)addr); 692 (long long)addr);
694 errcnt += 1; 693 errcnt += 1;
diff --git a/drivers/staging/mt29f_spinand/mt29f_spinand.c b/drivers/staging/mt29f_spinand/mt29f_spinand.c
index 197d1124733d..67283766710f 100644
--- a/drivers/staging/mt29f_spinand/mt29f_spinand.c
+++ b/drivers/staging/mt29f_spinand/mt29f_spinand.c
@@ -49,7 +49,6 @@ static struct nand_ecclayout spinand_oob_64 = {
49 17, 18, 19, 20, 21, 22, 49 17, 18, 19, 20, 21, 22,
50 33, 34, 35, 36, 37, 38, 50 33, 34, 35, 36, 37, 38,
51 49, 50, 51, 52, 53, 54, }, 51 49, 50, 51, 52, 53, 54, },
52 .oobavail = 32,
53 .oobfree = { 52 .oobfree = {
54 {.offset = 8, 53 {.offset = 8,
55 .length = 8}, 54 .length = 8},
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c
index 5a3da3f52908..b25d28a21212 100644
--- a/fs/jffs2/wbuf.c
+++ b/fs/jffs2/wbuf.c
@@ -1183,22 +1183,20 @@ void jffs2_dirty_trigger(struct jffs2_sb_info *c)
1183 1183
1184int jffs2_nand_flash_setup(struct jffs2_sb_info *c) 1184int jffs2_nand_flash_setup(struct jffs2_sb_info *c)
1185{ 1185{
1186 struct nand_ecclayout *oinfo = c->mtd->ecclayout;
1187
1188 if (!c->mtd->oobsize) 1186 if (!c->mtd->oobsize)
1189 return 0; 1187 return 0;
1190 1188
1191 /* Cleanmarker is out-of-band, so inline size zero */ 1189 /* Cleanmarker is out-of-band, so inline size zero */
1192 c->cleanmarker_size = 0; 1190 c->cleanmarker_size = 0;
1193 1191
1194 if (!oinfo || oinfo->oobavail == 0) { 1192 if (c->mtd->oobavail == 0) {
1195 pr_err("inconsistent device description\n"); 1193 pr_err("inconsistent device description\n");
1196 return -EINVAL; 1194 return -EINVAL;
1197 } 1195 }
1198 1196
1199 jffs2_dbg(1, "using OOB on NAND\n"); 1197 jffs2_dbg(1, "using OOB on NAND\n");
1200 1198
1201 c->oobavail = oinfo->oobavail; 1199 c->oobavail = c->mtd->oobavail;
1202 1200
1203 /* Initialise write buffer */ 1201 /* Initialise write buffer */
1204 init_rwsem(&c->wbuf_sem); 1202 init_rwsem(&c->wbuf_sem);
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index cc84923011c0..9cf13c4bccc8 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -105,7 +105,6 @@ struct mtd_oob_ops {
105struct nand_ecclayout { 105struct nand_ecclayout {
106 __u32 eccbytes; 106 __u32 eccbytes;
107 __u32 eccpos[MTD_MAX_ECCPOS_ENTRIES_LARGE]; 107 __u32 eccpos[MTD_MAX_ECCPOS_ENTRIES_LARGE];
108 __u32 oobavail;
109 struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES_LARGE]; 108 struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES_LARGE];
110}; 109};
111 110