Merge git://git.infradead.org/mtd-2.6
* git://git.infradead.org/mtd-2.6: mtd: nand: fix build failure and incorrect return from omap_wait() mtd: Use BLOCK_NIL consistently in NFTL/INFTL mtd: m25p80 timeout too short for worst-case m25p16 devices mtd: atmel_nand: Fix typo s/parititions/partitions/ mtd: cmdlineparts: Use 64-bit format when printing a debug message. mtd: maps: Remove BUS_ID_SIZE from integrator_flash jffs2: fix another potential leak on error path in scan.c
This commit is contained in:
@@ -194,7 +194,7 @@ static struct mtd_partition * newpart(char *s,
|
|||||||
parts[this_part].name = extra_mem;
|
parts[this_part].name = extra_mem;
|
||||||
extra_mem += name_len + 1;
|
extra_mem += name_len + 1;
|
||||||
|
|
||||||
dbg(("partition %d: name <%s>, offset %x, size %x, mask flags %x\n",
|
dbg(("partition %d: name <%s>, offset %llx, size %llx, mask flags %x\n",
|
||||||
this_part,
|
this_part,
|
||||||
parts[this_part].name,
|
parts[this_part].name,
|
||||||
parts[this_part].offset,
|
parts[this_part].offset,
|
||||||
|
@@ -54,7 +54,7 @@
|
|||||||
#define SR_SRWD 0x80 /* SR write protect */
|
#define SR_SRWD 0x80 /* SR write protect */
|
||||||
|
|
||||||
/* Define max times to check status register before we give up. */
|
/* Define max times to check status register before we give up. */
|
||||||
#define MAX_READY_WAIT_JIFFIES (10 * HZ) /* eg. M25P128 specs 6s max sector erase */
|
#define MAX_READY_WAIT_JIFFIES (40 * HZ) /* M25P16 specs 40s max chip erase */
|
||||||
#define CMD_SIZE 4
|
#define CMD_SIZE 4
|
||||||
|
|
||||||
#ifdef CONFIG_M25PXX_USE_FAST_READ
|
#ifdef CONFIG_M25PXX_USE_FAST_READ
|
||||||
|
@@ -226,7 +226,7 @@ static u16 INFTL_findfreeblock(struct INFTLrecord *inftl, int desperate)
|
|||||||
if (!desperate && inftl->numfreeEUNs < 2) {
|
if (!desperate && inftl->numfreeEUNs < 2) {
|
||||||
DEBUG(MTD_DEBUG_LEVEL1, "INFTL: there are too few free "
|
DEBUG(MTD_DEBUG_LEVEL1, "INFTL: there are too few free "
|
||||||
"EUNs (%d)\n", inftl->numfreeEUNs);
|
"EUNs (%d)\n", inftl->numfreeEUNs);
|
||||||
return 0xffff;
|
return BLOCK_NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scan for a free block */
|
/* Scan for a free block */
|
||||||
@@ -281,7 +281,8 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned
|
|||||||
silly = MAX_LOOPS;
|
silly = MAX_LOOPS;
|
||||||
while (thisEUN < inftl->nb_blocks) {
|
while (thisEUN < inftl->nb_blocks) {
|
||||||
for (block = 0; block < inftl->EraseSize/SECTORSIZE; block ++) {
|
for (block = 0; block < inftl->EraseSize/SECTORSIZE; block ++) {
|
||||||
if ((BlockMap[block] != 0xffff) || BlockDeleted[block])
|
if ((BlockMap[block] != BLOCK_NIL) ||
|
||||||
|
BlockDeleted[block])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize)
|
if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize)
|
||||||
@@ -525,7 +526,7 @@ static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block)
|
|||||||
if (!silly--) {
|
if (!silly--) {
|
||||||
printk(KERN_WARNING "INFTL: infinite loop in "
|
printk(KERN_WARNING "INFTL: infinite loop in "
|
||||||
"Virtual Unit Chain 0x%x\n", thisVUC);
|
"Virtual Unit Chain 0x%x\n", thisVUC);
|
||||||
return 0xffff;
|
return BLOCK_NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip to next block in chain */
|
/* Skip to next block in chain */
|
||||||
@@ -549,7 +550,7 @@ hitused:
|
|||||||
* waiting to be picked up. We're going to have to fold
|
* waiting to be picked up. We're going to have to fold
|
||||||
* a chain to make room.
|
* a chain to make room.
|
||||||
*/
|
*/
|
||||||
thisEUN = INFTL_makefreeblock(inftl, 0xffff);
|
thisEUN = INFTL_makefreeblock(inftl, BLOCK_NIL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Hopefully we free something, lets try again.
|
* Hopefully we free something, lets try again.
|
||||||
@@ -631,7 +632,7 @@ hitused:
|
|||||||
|
|
||||||
printk(KERN_WARNING "INFTL: error folding to make room for Virtual "
|
printk(KERN_WARNING "INFTL: error folding to make room for Virtual "
|
||||||
"Unit Chain 0x%x\n", thisVUC);
|
"Unit Chain 0x%x\n", thisVUC);
|
||||||
return 0xffff;
|
return BLOCK_NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -42,10 +42,8 @@
|
|||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
|
||||||
#define SUBDEV_NAME_SIZE (BUS_ID_SIZE + 2)
|
|
||||||
|
|
||||||
struct armflash_subdev_info {
|
struct armflash_subdev_info {
|
||||||
char name[SUBDEV_NAME_SIZE];
|
char *name;
|
||||||
struct mtd_info *mtd;
|
struct mtd_info *mtd;
|
||||||
struct map_info map;
|
struct map_info map;
|
||||||
struct flash_platform_data *plat;
|
struct flash_platform_data *plat;
|
||||||
@@ -134,6 +132,8 @@ static void armflash_subdev_remove(struct armflash_subdev_info *subdev)
|
|||||||
map_destroy(subdev->mtd);
|
map_destroy(subdev->mtd);
|
||||||
if (subdev->map.virt)
|
if (subdev->map.virt)
|
||||||
iounmap(subdev->map.virt);
|
iounmap(subdev->map.virt);
|
||||||
|
kfree(subdev->name);
|
||||||
|
subdev->name = NULL;
|
||||||
release_mem_region(subdev->map.phys, subdev->map.size);
|
release_mem_region(subdev->map.phys, subdev->map.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,17 +177,23 @@ static int armflash_probe(struct platform_device *dev)
|
|||||||
|
|
||||||
if (nr == 1)
|
if (nr == 1)
|
||||||
/* No MTD concatenation, just use the default name */
|
/* No MTD concatenation, just use the default name */
|
||||||
snprintf(subdev->name, SUBDEV_NAME_SIZE, "%s",
|
subdev->name = kstrdup(dev_name(&dev->dev), GFP_KERNEL);
|
||||||
dev_name(&dev->dev));
|
|
||||||
else
|
else
|
||||||
snprintf(subdev->name, SUBDEV_NAME_SIZE, "%s-%d",
|
subdev->name = kasprintf(GFP_KERNEL, "%s-%d",
|
||||||
dev_name(&dev->dev), i);
|
dev_name(&dev->dev), i);
|
||||||
|
if (!subdev->name) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
subdev->plat = plat;
|
subdev->plat = plat;
|
||||||
|
|
||||||
err = armflash_subdev_probe(subdev, res);
|
err = armflash_subdev_probe(subdev, res);
|
||||||
if (err)
|
if (err) {
|
||||||
|
kfree(subdev->name);
|
||||||
|
subdev->name = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
info->nr_subdev = i;
|
info->nr_subdev = i;
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
|
@@ -534,7 +534,7 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
|
|||||||
&num_partitions);
|
&num_partitions);
|
||||||
|
|
||||||
if ((!partitions) || (num_partitions == 0)) {
|
if ((!partitions) || (num_partitions == 0)) {
|
||||||
printk(KERN_ERR "atmel_nand: No parititions defined, or unsupported device.\n");
|
printk(KERN_ERR "atmel_nand: No partitions defined, or unsupported device.\n");
|
||||||
res = ENXIO;
|
res = ENXIO;
|
||||||
goto err_no_partitions;
|
goto err_no_partitions;
|
||||||
}
|
}
|
||||||
|
@@ -11,6 +11,8 @@
|
|||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/jiffies.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
#include <linux/mtd/mtd.h>
|
#include <linux/mtd/mtd.h>
|
||||||
#include <linux/mtd/nand.h>
|
#include <linux/mtd/nand.h>
|
||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
@@ -541,7 +543,7 @@ static int omap_wait(struct mtd_info *mtd, struct nand_chip *chip)
|
|||||||
struct omap_nand_info *info = container_of(mtd, struct omap_nand_info,
|
struct omap_nand_info *info = container_of(mtd, struct omap_nand_info,
|
||||||
mtd);
|
mtd);
|
||||||
unsigned long timeo = jiffies;
|
unsigned long timeo = jiffies;
|
||||||
int status, state = this->state;
|
int status = NAND_STATUS_FAIL, state = this->state;
|
||||||
|
|
||||||
if (state == FL_ERASING)
|
if (state == FL_ERASING)
|
||||||
timeo += (HZ * 400) / 1000;
|
timeo += (HZ * 400) / 1000;
|
||||||
@@ -556,8 +558,9 @@ static int omap_wait(struct mtd_info *mtd, struct nand_chip *chip)
|
|||||||
|
|
||||||
while (time_before(jiffies, timeo)) {
|
while (time_before(jiffies, timeo)) {
|
||||||
status = __raw_readb(this->IO_ADDR_R);
|
status = __raw_readb(this->IO_ADDR_R);
|
||||||
if (!(status & 0x40))
|
if (status & NAND_STATUS_READY)
|
||||||
break;
|
break;
|
||||||
|
cond_resched();
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@@ -208,7 +208,7 @@ static u16 NFTL_findfreeblock(struct NFTLrecord *nftl, int desperate )
|
|||||||
/* Normally, we force a fold to happen before we run out of free blocks completely */
|
/* Normally, we force a fold to happen before we run out of free blocks completely */
|
||||||
if (!desperate && nftl->numfreeEUNs < 2) {
|
if (!desperate && nftl->numfreeEUNs < 2) {
|
||||||
DEBUG(MTD_DEBUG_LEVEL1, "NFTL_findfreeblock: there are too few free EUNs\n");
|
DEBUG(MTD_DEBUG_LEVEL1, "NFTL_findfreeblock: there are too few free EUNs\n");
|
||||||
return 0xffff;
|
return BLOCK_NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scan for a free block */
|
/* Scan for a free block */
|
||||||
@@ -230,11 +230,11 @@ static u16 NFTL_findfreeblock(struct NFTLrecord *nftl, int desperate )
|
|||||||
printk("Argh! No free blocks found! LastFreeEUN = %d, "
|
printk("Argh! No free blocks found! LastFreeEUN = %d, "
|
||||||
"FirstEUN = %d\n", nftl->LastFreeEUN,
|
"FirstEUN = %d\n", nftl->LastFreeEUN,
|
||||||
le16_to_cpu(nftl->MediaHdr.FirstPhysicalEUN));
|
le16_to_cpu(nftl->MediaHdr.FirstPhysicalEUN));
|
||||||
return 0xffff;
|
return BLOCK_NIL;
|
||||||
}
|
}
|
||||||
} while (pot != nftl->LastFreeEUN);
|
} while (pot != nftl->LastFreeEUN);
|
||||||
|
|
||||||
return 0xffff;
|
return BLOCK_NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned pendingblock )
|
static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned pendingblock )
|
||||||
@@ -431,7 +431,7 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p
|
|||||||
|
|
||||||
/* add the header so that it is now a valid chain */
|
/* add the header so that it is now a valid chain */
|
||||||
oob.u.a.VirtUnitNum = oob.u.a.SpareVirtUnitNum = cpu_to_le16(thisVUC);
|
oob.u.a.VirtUnitNum = oob.u.a.SpareVirtUnitNum = cpu_to_le16(thisVUC);
|
||||||
oob.u.a.ReplUnitNum = oob.u.a.SpareReplUnitNum = 0xffff;
|
oob.u.a.ReplUnitNum = oob.u.a.SpareReplUnitNum = BLOCK_NIL;
|
||||||
|
|
||||||
nftl_write_oob(mtd, (nftl->EraseSize * targetEUN) + 8,
|
nftl_write_oob(mtd, (nftl->EraseSize * targetEUN) + 8,
|
||||||
8, &retlen, (char *)&oob.u);
|
8, &retlen, (char *)&oob.u);
|
||||||
@@ -515,7 +515,7 @@ static u16 NFTL_makefreeblock( struct NFTLrecord *nftl , unsigned pendingblock)
|
|||||||
if (ChainLength < 2) {
|
if (ChainLength < 2) {
|
||||||
printk(KERN_WARNING "No Virtual Unit Chains available for folding. "
|
printk(KERN_WARNING "No Virtual Unit Chains available for folding. "
|
||||||
"Failing request\n");
|
"Failing request\n");
|
||||||
return 0xffff;
|
return BLOCK_NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NFTL_foldchain (nftl, LongestChain, pendingblock);
|
return NFTL_foldchain (nftl, LongestChain, pendingblock);
|
||||||
@@ -578,7 +578,7 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block)
|
|||||||
printk(KERN_WARNING
|
printk(KERN_WARNING
|
||||||
"Infinite loop in Virtual Unit Chain 0x%x\n",
|
"Infinite loop in Virtual Unit Chain 0x%x\n",
|
||||||
thisVUC);
|
thisVUC);
|
||||||
return 0xffff;
|
return BLOCK_NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip to next block in chain */
|
/* Skip to next block in chain */
|
||||||
@@ -601,7 +601,7 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block)
|
|||||||
//u16 startEUN = nftl->EUNtable[thisVUC];
|
//u16 startEUN = nftl->EUNtable[thisVUC];
|
||||||
|
|
||||||
//printk("Write to VirtualUnitChain %d, calling makefreeblock()\n", thisVUC);
|
//printk("Write to VirtualUnitChain %d, calling makefreeblock()\n", thisVUC);
|
||||||
writeEUN = NFTL_makefreeblock(nftl, 0xffff);
|
writeEUN = NFTL_makefreeblock(nftl, BLOCK_NIL);
|
||||||
|
|
||||||
if (writeEUN == BLOCK_NIL) {
|
if (writeEUN == BLOCK_NIL) {
|
||||||
/* OK, we accept that the above comment is
|
/* OK, we accept that the above comment is
|
||||||
@@ -673,7 +673,7 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block)
|
|||||||
|
|
||||||
printk(KERN_WARNING "Error folding to make room for Virtual Unit Chain 0x%x\n",
|
printk(KERN_WARNING "Error folding to make room for Virtual Unit Chain 0x%x\n",
|
||||||
thisVUC);
|
thisVUC);
|
||||||
return 0xffff;
|
return BLOCK_NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nftl_writeblock(struct mtd_blktrans_dev *mbd, unsigned long block,
|
static int nftl_writeblock(struct mtd_blktrans_dev *mbd, unsigned long block,
|
||||||
|
@@ -130,9 +130,9 @@ int jffs2_scan_medium(struct jffs2_sb_info *c)
|
|||||||
if (jffs2_sum_active()) {
|
if (jffs2_sum_active()) {
|
||||||
s = kzalloc(sizeof(struct jffs2_summary), GFP_KERNEL);
|
s = kzalloc(sizeof(struct jffs2_summary), GFP_KERNEL);
|
||||||
if (!s) {
|
if (!s) {
|
||||||
kfree(flashbuf);
|
|
||||||
JFFS2_WARNING("Can't allocate memory for summary\n");
|
JFFS2_WARNING("Can't allocate memory for summary\n");
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user