|
@@ -272,28 +272,37 @@ static int memcmpb(void *a, int c, int n)
|
|
|
static int check_free_sectors(struct NFTLrecord *nftl, unsigned int address, int len,
|
|
|
int check_oob)
|
|
|
{
|
|
|
- u8 buf[SECTORSIZE + nftl->mbd.mtd->oobsize];
|
|
|
struct mtd_info *mtd = nftl->mbd.mtd;
|
|
|
size_t retlen;
|
|
|
- int i;
|
|
|
+ int i, ret;
|
|
|
+ u8 *buf;
|
|
|
+
|
|
|
+ buf = kmalloc(SECTORSIZE + mtd->oobsize, GFP_KERNEL);
|
|
|
+ if (!buf)
|
|
|
+ return -1;
|
|
|
|
|
|
+ ret = -1;
|
|
|
for (i = 0; i < len; i += SECTORSIZE) {
|
|
|
if (mtd_read(mtd, address, SECTORSIZE, &retlen, buf))
|
|
|
- return -1;
|
|
|
+ goto out;
|
|
|
if (memcmpb(buf, 0xff, SECTORSIZE) != 0)
|
|
|
- return -1;
|
|
|
+ goto out;
|
|
|
|
|
|
if (check_oob) {
|
|
|
if(nftl_read_oob(mtd, address, mtd->oobsize,
|
|
|
&retlen, &buf[SECTORSIZE]) < 0)
|
|
|
- return -1;
|
|
|
+ goto out;
|
|
|
if (memcmpb(buf + SECTORSIZE, 0xff, mtd->oobsize) != 0)
|
|
|
- return -1;
|
|
|
+ goto out;
|
|
|
}
|
|
|
address += SECTORSIZE;
|
|
|
}
|
|
|
|
|
|
- return 0;
|
|
|
+ ret = 0;
|
|
|
+
|
|
|
+out:
|
|
|
+ kfree(buf);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/* NFTL_format: format a Erase Unit by erasing ALL Erase Zones in the Erase Unit and
|