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
This commit is contained in:
commit
5136a6c0fd
3 changed files with 20 additions and 7 deletions
|
@ -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)
|
||||||
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,
|
||||||
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,
|
||||||
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) {
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue