mtd/drivers/mtd/nand diskonchip.c,1.27,1.28

dbrown at infradead.org dbrown at infradead.org
Mon Jul 26 11:03:16 EDT 2004


Update of /home/cvs/mtd/drivers/mtd/nand
In directory phoenix.infradead.org:/tmp/cvs-serv10974

Modified Files:
	diskonchip.c 
Log Message:
Get our own buffer, don't use this->data_buf which is internal to nand_base.


Index: diskonchip.c
===================================================================
RCS file: /home/cvs/mtd/drivers/mtd/nand/diskonchip.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- diskonchip.c	26 Jul 2004 14:40:30 -0000	1.27
+++ diskonchip.c	26 Jul 2004 15:03:14 -0000	1.28
@@ -693,14 +693,20 @@
 {
 	struct nand_chip *this = mtd->priv;
 	struct doc_priv *doc = (void *)this->priv;
-	u_char *buf = this->data_buf;
-	struct NFTLMediaHeader *mh = (struct NFTLMediaHeader *) buf;
+	int ret = 0;
+	u_char *buf;
+	struct NFTLMediaHeader *mh;
 	const int psize = 1 << this->page_shift;
 	int blocks, maxblocks;
 	int offs, numheaders;
 
-	this->pagebuf = -1;
-	if (!(numheaders=find_media_headers(mtd, buf, "ANAND", 1))) return 0;
+	buf = kmalloc(mtd->oobblock, GFP_KERNEL);
+	if (!buf) {
+		printk(KERN_ERR "DiskOnChip mediaheader kmalloc failed!\n");
+		return 0;
+	}
+	if (!(numheaders=find_media_headers(mtd, buf, "ANAND", 1))) goto out;
+	mh = (struct NFTLMediaHeader *) buf;
 
 //#ifdef CONFIG_MTD_DEBUG_VERBOSE
 //	if (CONFIG_MTD_DEBUG_VERBOSE >= 2)
@@ -747,7 +753,7 @@
 
 	if (blocks > maxblocks) {
 		printk(KERN_ERR "UnitSizeFactor of 0x%02x is inconsistent with device size.  Aborting.\n", mh->UnitSizeFactor);
-		return 0;
+		goto out;
 	}
 
 	/* Skip past the media headers. */
@@ -768,9 +774,13 @@
 		parts[1].name = " DiskOnChip Remainder partition";
 		parts[1].offset = offs;
 		parts[1].size = mtd->size - offs;
-		return 2;
+		ret = 2;
+		goto out;
 	}
-	return 1;
+	ret = 1;
+out:
+	kfree(buf);
+	return ret;
 }
 
 /* This is a stripped-down copy of the code in inftlmount.c */
@@ -779,8 +789,9 @@
 {
 	struct nand_chip *this = mtd->priv;
 	struct doc_priv *doc = (void *)this->priv;
-	u_char *buf = this->data_buf;
-	struct INFTLMediaHeader *mh = (struct INFTLMediaHeader *) buf;
+	int ret = 0;
+	u_char *buf;
+	struct INFTLMediaHeader *mh;
 	struct INFTLPartition *ip;
 	int numparts = 0;
 	int blocks;
@@ -791,9 +802,15 @@
 	if (inftl_bbt_write)
 		end -= (INFTL_BBT_RESERVED_BLOCKS << this->phys_erase_shift);
 
-	this->pagebuf = -1;
-	if (!find_media_headers(mtd, buf, "BNAND", 0)) return 0;
+	buf = kmalloc(mtd->oobblock, GFP_KERNEL);
+	if (!buf) {
+		printk(KERN_ERR "DiskOnChip mediaheader kmalloc failed!\n");
+		return 0;
+	}
+
+	if (!find_media_headers(mtd, buf, "BNAND", 0)) goto out;
 	doc->mh1_page = doc->mh0_page + (4096 >> this->page_shift);
+	mh = (struct INFTLMediaHeader *) buf;
 
 	mh->NoOfBootImageBlocks = le32_to_cpu(mh->NoOfBootImageBlocks);
 	mh->NoOfBinaryPartitions = le32_to_cpu(mh->NoOfBinaryPartitions);
@@ -824,13 +841,13 @@
 	blocks = mtd->size >> vshift;
 	if (blocks > 32768) {
 		printk(KERN_ERR "BlockMultiplierBits=%d is inconsistent with device size.  Aborting.\n", mh->BlockMultiplierBits);
-		return 0;
+		goto out;
 	}
 
 	blocks = doc->chips_per_floor << (this->chip_shift - this->phys_erase_shift);
 	if (inftl_bbt_write && (blocks > mtd->erasesize)) {
 		printk(KERN_ERR "Writeable BBTs spanning more than one erase block are not yet supported.  FIX ME!\n");
-		return 0;
+		goto out;
 	}
 
 	/* Scan the partitions */
@@ -882,7 +899,10 @@
 		parts[numparts].size = end - parts[numparts].offset;
 		numparts++;
 	}
-	return numparts;
+	ret = numparts;
+out:
+	kfree(buf);
+	return ret;
 }
 
 static int __init nftl_scan_bbt(struct mtd_info *mtd)





More information about the linux-mtd-cvs mailing list