[PATCH] Oops in TS-5500 map
Sean Young
sean at mess.org
Thu Jul 17 04:46:59 EDT 2008
If CONFIG_MTD_TS5500 is configured and the kernel is run on a system which
does not have this flash, an Oops will occur. This patch fixes that and
cleans the driver up a little.
BUG: unable to handle kernel NULL pointer dereference at 000000a8
IP: [<c01ba7de>] map_destroy+0x3/0x1f
*pde = 00000000
Oops: 0000 [#1]
Pid: 1, comm: swapper Not tainted (2.6.26 #1)
EIP: 0060:[<c01ba7de>] EFLAGS: 00010246 CPU: 0
EIP is at map_destroy+0x3/0x1f
EAX: 00000000 EBX: 00000000 ECX: ffffffff EDX: 00000000
ESI: 00000000 EDI: 00000000 EBP: c029bb03 ESP: c181df78
DS: 007b ES: 007b FS: 0000 GS: 0000 SS: 0068
Process swapper (pid: 1, ti=c181c000 task=c181a000 task.ti=c181c000)
Stack: c0292574 c029bba3 c0292600 00000000 00000000 c02a8cd8 00000000 00000000
00000000 00000000 00000000 c181a000 00000000 c010b838 c0102816 00000202
c0292574 00000000 00000000 00000000 00000000 00000000 00000000 c0292574
Call Trace:
[<c0292574>] kernel_init+0x0/0x1c0
[<c029bba3>] init_ts5500_map+0xa0/0xb4
[<c0292600>] kernel_init+0x8c/0x1c0
[<c010b838>] schedule_tail+0xe/0x39
[<c0102816>] ret_from_fork+0x6/0x20
[<c0292574>] kernel_init+0x0/0x1c0
[<c0292574>] kernel_init+0x0/0x1c0
[<c0102ca7>] kernel_thread_helper+0x7/0x10
=======================
Code: c7 40 14 20 5c 28 c0 89 0d 20 5c 28 c0 c3 8b 48 10 8b 50 14 89 51 04 89 0a c7 40 10 00 01 10 00 c7 40 14 00 02 20 00 c3 53 89 c3 <8b> 80 a8 00 00 00 8b 40 2c 8b 50 04 85 d2 74 04 89 d8 ff d2 89
EIP: [<c01ba7de>] map_destroy+0x3/0x1f SS:ESP 0068:c181df78
Signed-off-by: Sean Young <sean at mess.org>
---
diff -urpN linux-2.6.26/drivers/mtd/maps/ts5500_flash.c /home/sean/tiger/linux-2.6.26/drivers/mtd/maps/ts5500_flash.c
--- linux-2.6.26/drivers/mtd/maps/ts5500_flash.c 2008-07-13 22:51:29.000000000 +0100
+++ /home/sean/tiger/linux-2.6.26/drivers/mtd/maps/ts5500_flash.c 2008-07-16 14:47:11.000000000 +0100
@@ -45,7 +45,7 @@ static struct map_info ts5500_map = {
.phys = WINDOW_ADDR
};
-static struct mtd_partition ts5500_partitions[] = {
+static const struct mtd_partition ts5500_partitions[] = {
{
.name = "Drive A",
.offset = 0,
@@ -63,20 +63,17 @@ static struct mtd_partition ts5500_parti
}
};
-#define NUM_PARTITIONS ARRAY_SIZE(ts5500_partitions)
-
static struct mtd_info *mymtd;
static int __init init_ts5500_map(void)
{
- int rc = 0;
+ int rc;
ts5500_map.virt = ioremap_nocache(ts5500_map.phys, ts5500_map.size);
if (!ts5500_map.virt) {
printk(KERN_ERR "Failed to ioremap_nocache\n");
- rc = -EIO;
- goto err2;
+ return -EIO;
}
simple_map_init(&ts5500_map);
@@ -87,18 +84,17 @@ static int __init init_ts5500_map(void)
if (!mymtd) {
rc = -ENXIO;
- goto err1;
+ goto err;
}
mymtd->owner = THIS_MODULE;
- add_mtd_partitions(mymtd, ts5500_partitions, NUM_PARTITIONS);
+ add_mtd_partitions(mymtd, ts5500_partitions,
+ ARRAY_SIZE(ts5500_partitions));
return 0;
-err1:
- map_destroy(mymtd);
+err:
iounmap(ts5500_map.virt);
-err2:
return rc;
}
More information about the linux-mtd
mailing list