Commit 5136a6c0 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.infradead.org/~dwmw2/mtd-2.6.31

* git://git.infradead.org/~dwmw2/mtd-2.6.31:
  JFFS2: add missing verify buffer allocation/deallocation
  mtd: nftl: fix offset alignments
  mtd: nftl: write support is broken
  mtd: m25p80: fix null pointer dereference bug
parents e505a8d5 bc8cec0d
...@@ -736,7 +736,7 @@ static int __devinit m25p_probe(struct spi_device *spi) ...@@ -736,7 +736,7 @@ static int __devinit m25p_probe(struct spi_device *spi)
flash->partitioned = 1; flash->partitioned = 1;
return add_mtd_partitions(&flash->mtd, parts, nr_parts); return add_mtd_partitions(&flash->mtd, parts, nr_parts);
} }
} else if (data->nr_parts) } else if (data && data->nr_parts)
dev_warn(&spi->dev, "ignoring %d default partitions on %s\n", dev_warn(&spi->dev, "ignoring %d default partitions on %s\n",
data->nr_parts, data->name); data->nr_parts, data->name);
......
...@@ -135,16 +135,17 @@ static void nftl_remove_dev(struct mtd_blktrans_dev *dev) ...@@ -135,16 +135,17 @@ static void nftl_remove_dev(struct mtd_blktrans_dev *dev)
int nftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len, int nftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len,
size_t *retlen, uint8_t *buf) size_t *retlen, uint8_t *buf)
{ {
loff_t mask = mtd->writesize - 1;
struct mtd_oob_ops ops; struct mtd_oob_ops ops;
int res; int res;
ops.mode = MTD_OOB_PLACE; ops.mode = MTD_OOB_PLACE;
ops.ooboffs = offs & (mtd->writesize - 1); ops.ooboffs = offs & mask;
ops.ooblen = len; ops.ooblen = len;
ops.oobbuf = buf; ops.oobbuf = buf;
ops.datbuf = NULL; ops.datbuf = NULL;
res = mtd->read_oob(mtd, offs & ~(mtd->writesize - 1), &ops); res = mtd->read_oob(mtd, offs & ~mask, &ops);
*retlen = ops.oobretlen; *retlen = ops.oobretlen;
return res; return res;
} }
...@@ -155,16 +156,17 @@ int nftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len, ...@@ -155,16 +156,17 @@ int nftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len,
int nftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len, int nftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len,
size_t *retlen, uint8_t *buf) size_t *retlen, uint8_t *buf)
{ {
loff_t mask = mtd->writesize - 1;
struct mtd_oob_ops ops; struct mtd_oob_ops ops;
int res; int res;
ops.mode = MTD_OOB_PLACE; ops.mode = MTD_OOB_PLACE;
ops.ooboffs = offs & (mtd->writesize - 1); ops.ooboffs = offs & mask;
ops.ooblen = len; ops.ooblen = len;
ops.oobbuf = buf; ops.oobbuf = buf;
ops.datbuf = NULL; ops.datbuf = NULL;
res = mtd->write_oob(mtd, offs & ~(mtd->writesize - 1), &ops); res = mtd->write_oob(mtd, offs & ~mask, &ops);
*retlen = ops.oobretlen; *retlen = ops.oobretlen;
return res; return res;
} }
...@@ -177,17 +179,18 @@ int nftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len, ...@@ -177,17 +179,18 @@ int nftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len,
static int nftl_write(struct mtd_info *mtd, loff_t offs, size_t len, static int nftl_write(struct mtd_info *mtd, loff_t offs, size_t len,
size_t *retlen, uint8_t *buf, uint8_t *oob) size_t *retlen, uint8_t *buf, uint8_t *oob)
{ {
loff_t mask = mtd->writesize - 1;
struct mtd_oob_ops ops; struct mtd_oob_ops ops;
int res; int res;
ops.mode = MTD_OOB_PLACE; ops.mode = MTD_OOB_PLACE;
ops.ooboffs = offs; ops.ooboffs = offs & mask;
ops.ooblen = mtd->oobsize; ops.ooblen = mtd->oobsize;
ops.oobbuf = oob; ops.oobbuf = oob;
ops.datbuf = buf; ops.datbuf = buf;
ops.len = len; ops.len = len;
res = mtd->write_oob(mtd, offs & ~(mtd->writesize - 1), &ops); res = mtd->write_oob(mtd, offs & ~mask, &ops);
*retlen = ops.retlen; *retlen = ops.retlen;
return res; return res;
} }
......
...@@ -1268,10 +1268,20 @@ int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) { ...@@ -1268,10 +1268,20 @@ int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) {
if (!c->wbuf) if (!c->wbuf)
return -ENOMEM; return -ENOMEM;
#ifdef CONFIG_JFFS2_FS_WBUF_VERIFY
c->wbuf_verify = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
if (!c->wbuf_verify) {
kfree(c->wbuf);
return -ENOMEM;
}
#endif
return 0; return 0;
} }
void jffs2_nor_wbuf_flash_cleanup(struct jffs2_sb_info *c) { void jffs2_nor_wbuf_flash_cleanup(struct jffs2_sb_info *c) {
#ifdef CONFIG_JFFS2_FS_WBUF_VERIFY
kfree(c->wbuf_verify);
#endif
kfree(c->wbuf); kfree(c->wbuf);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment