mtd->size overflow
He Yong
hoffer1127 at gmail.com
Thu Aug 30 10:06:18 EDT 2007
Hi,all
I've done the work, and have it tested.
here is the patch:
Index: include/linux/mtd/nand.h
===================================================================
--- include/linux/mtd/nand.h (修订版 166)
+++ include/linux/mtd/nand.h (修订版 167)
@@ -392,7 +392,7 @@
int bbt_erase_shift;
int chip_shift;
int numchips;
- unsigned long chipsize;
+ u_int64_t chipsize;
int pagemask;
int pagebuf;
int subpagesize;
@@ -491,8 +491,8 @@
struct nand_bbt_descr {
int options;
int pages[NAND_MAX_CHIPS];
- int offs;
- int veroffs;
+ u_int64_t offs;
+ u_int64_t veroffs;
uint8_t version[NAND_MAX_CHIPS];
int len;
int maxblocks;
Index: include/linux/mtd/mtd.h
===================================================================
--- include/linux/mtd/mtd.h (修订版 166)
+++ include/linux/mtd/mtd.h (修订版 167)
@@ -36,9 +36,9 @@
specific to any particular block. */
struct erase_info {
struct mtd_info *mtd;
- u_int32_t addr;
- u_int32_t len;
- u_int32_t fail_addr;
+ u_int64_t addr;
+ u_int64_t len;
+ u_int64_t fail_addr;
u_long time;
u_long retries;
u_int dev;
@@ -50,7 +50,7 @@
};
struct mtd_erase_region_info {
- u_int32_t offset; /* At which this region starts, from the
beginning of the MTD */
+ u_int64_t offset; /* At which this region starts, from the
beginning of the MTD */
u_int32_t erasesize; /* For this region */
u_int32_t numblocks; /* Number of blocks of erasesize in this region */
};
@@ -92,7 +92,7 @@
size_t retlen;
size_t ooblen;
size_t oobretlen;
- uint32_t ooboffs;
+ u_int64_t ooboffs;
uint8_t *datbuf;
uint8_t *oobbuf;
};
@@ -100,7 +100,7 @@
struct mtd_info {
u_char type;
u_int32_t flags;
- u_int32_t size; // Total size of the MTD
+ u_int64_t size; // Total size of the MTD -- by hoffer
/* "Major" erase size for the device. Naïve users may take this
* to be the only erase size available, or may use the more detailed
Index: drivers/mtd/nand/nand_base.c
===================================================================
--- drivers/mtd/nand/nand_base.c (修订版 166)
+++ drivers/mtd/nand/nand_base.c (修订版 167)
@@ -2328,8 +2328,8 @@
" 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, dev_id,
nand_manuf_ids[maf_idx].name, type->name);
- printk(KERN_INFO "BlockSize: 0x%x, PageSize: 0x%x, OobSize: 0x%x,
BusWith:%d\n",
- mtd->erasesize,mtd->writesize,mtd->oobsize,(chip->options
& NAND_BUSWIDTH_16) ? 16 : 8 );
+ printk(KERN_INFO "ChipSize: 0x%x, BlockSize: 0x%x, PageSize: 0x%x,
OobSize: 0x%x, BusWith:%d\n",
+ chip->chipsize,mtd->erasesize,mtd->writesize,mtd->oobsize,(chip->options
& NAND_BUSWIDTH_16) ? 16 : 8 );
return type;
}
Index: drivers/mtd/mtdpart.c
===================================================================
--- drivers/mtd/mtdpart.c (修订版 166)
+++ drivers/mtd/mtdpart.c (修订版 167)
@@ -28,7 +28,7 @@
struct mtd_part {
struct mtd_info mtd;
struct mtd_info *master;
- u_int32_t offset;
+ u_int64_t offset;
int index;
struct list_head list;
int registered;
@@ -400,15 +400,15 @@
slave->offset = ((cur_offset / master->erasesize) + 1) * master->erasesize;
printk(KERN_NOTICE "Moving partition %d: "
"0x%08x -> 0x%08x\n", i,
- cur_offset, slave->offset);
+ cur_offset, (u_int32_t)slave->offset);
}
}
if (slave->mtd.size == MTDPART_SIZ_FULL)
slave->mtd.size = master->size - slave->offset;
cur_offset = slave->offset + slave->mtd.size;
- printk (KERN_NOTICE "0x%08x-0x%08x : \"%s\"\n", slave->offset,
- slave->offset + slave->mtd.size, slave->mtd.name);
+ printk (KERN_NOTICE "0x%08x-0x%08x : \"%s\"\n", (u_int32_t)slave->offset,
+ (u_int32_t)(slave->offset + slave->mtd.size), slave->mtd.name);
/* let's do some sanity checks */
if (slave->offset >= master->size) {
@@ -421,7 +421,7 @@
if (slave->offset + slave->mtd.size > master->size) {
slave->mtd.size = master->size - slave->offset;
printk ("mtd: partition \"%s\" extends beyond the end of device
\"%s\" -- size truncated to %#x\n",
- parts[i].name, master->name, slave->mtd.size);
+ parts[i].name, master->name, (u_int32_t)slave->mtd.size);
}
if (master->numeraseregions>1) {
/* Deal with variable erase size stuff */
@@ -443,7 +443,7 @@
}
if ((slave->mtd.flags & MTD_WRITEABLE) &&
- (slave->offset % slave->mtd.erasesize)) {
+ (((u_int32_t)slave->offset) % slave->mtd.erasesize /*hoffer*/ )) {
/* Doesn't start on a boundary of major erase size */
/* FIXME: Let it be writable if it is on a boundary of _minor_
erase size though */
slave->mtd.flags &= ~MTD_WRITEABLE;
@@ -451,7 +451,7 @@
parts[i].name);
}
if ((slave->mtd.flags & MTD_WRITEABLE) &&
- (slave->mtd.size % slave->mtd.erasesize)) {
+ (((u_int32_t)slave->mtd.size) % slave->mtd.erasesize /*hoffer*/ ) ) {
slave->mtd.flags &= ~MTD_WRITEABLE;
printk ("mtd: partition \"%s\" doesn't end on an erase block --
force read-only\n",
parts[i].name);
Index: drivers/mtd/mtdcore.c
===================================================================
--- drivers/mtd/mtdcore.c (修订版 166)
+++ drivers/mtd/mtdcore.c (修订版 167)
@@ -349,7 +349,7 @@
if (!this)
return 0;
- return sprintf(buf, "mtd%d: %8.8x %8.8x \"%s\"\n", i, this->size,
+ return sprintf(buf, "mtd%d: %8.8x %8.8x \"%s\"\n", i, (u_int32_t)this->size,
this->erasesize, this->name);
}
2007/8/30, Jörn Engel <joern at logfs.org>:
> On Wed, 29 August 2007 13:10:15 +0530, Vinit Agnihotri wrote:
> >
> > I dont mind giving out patch
> > but its about making mtd subsytem 64-bit,
> > so mtd-maintainers must allow that patch. As its kernel patch.
>
> Just send the patch. Even if it doesn't get merged, reading the patch
> will be useful to whoever does the actual 64bit transition.
>
> Jörn
>
> --
> Joern's library part 14:
> http://www.sandpile.org/
>
--
Best Regards!
He Yong
School of Information Security,
Shanghai Jiaotong University,
Dong chuan Road #800,
Minhang, Shanghai, P.R.China
More information about the linux-mtd
mailing list