mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* Possible MTD bug in 2.6.15
@ 2006-04-19 16:49 Jim Ramsay
  2006-04-19 17:06 ` Thiago Galesi
  2006-05-30 12:30 ` David Woodhouse
  0 siblings, 2 replies; 8+ messages in thread
From: Jim Ramsay @ 2006-04-19 16:49 UTC (permalink / raw)
  To: Linux Kernel

[-- Attachment #1: Type: text/plain, Size: 1678 bytes --]

We have an interesting problem with MTD and a flash chip on an
embedded board.  The problem stems from the fact that due to hardware
constraints we can only access up to 32M of address space on an
attached flash device.  However, the actual part attached to the board
is 64M.  Yes, I know this is not likely to happen, but it points at a
kernel bug which will happen if you ever specify a MTD map->size which
is less than the actual size of the CFI flash chip.

When we specify the map->size as 32M (0x02000000) and do the CFI
probe, the chip is properly detected, but then in gen_probe.c the
following happens:

- genprobe_ident_chips is run
  - It sets cfi.chipshift based on the cfi.cfiq->DevSize, which gets
properly set to 0x1a (64M flash chip).
  - It then sets the local "max_chips" variable by shifting down
map->size by this chipshift, which shifts our size (0x02000000 = 32M)
down all the way to 0.
  - Since 'max_chips' is zero, no memory is allocated for this chip,
and the waitqueue is not initialized.  The will cause a kernel panic
later, if you ever try to read from this chip.

The routine completes and you are left with a seemingly valid MTD
device.  However, if you ever try to read or write this device, the
waitqueue is uninitialized, which causes a nasty kernel panic.

My proposed fix is attached (a patch against 2.6.15).  After shifting
the map->size down by cfi.chipshift, I just ensure that max_chips is
at least one.  Does this seem like a reasonable fix?

Note: Please CC my email address in reply, as I am not currently
subscribed to the linux-kernel list.

--
Jim Ramsay
"Me fail English?  That's unpossible!"

[-- Attachment #2: mtd_wrong_size_bug.patch --]
[-- Type: application/octet-stream, Size: 833 bytes --]

Index: drivers/mtd/chips/gen_probe.c
===================================================================
RCS file: /cvs/PM35_35_14_01/linux_2_6/drivers/mtd/chips/gen_probe.c,v
retrieving revision 1.1.1.3
diff -u -u -r1.1.1.3 gen_probe.c
--- drivers/mtd/chips/gen_probe.c	10 Jan 2006 00:44:25 -0000	1.1.1.3
+++ drivers/mtd/chips/gen_probe.c	19 Apr 2006 16:32:10 -0000
@@ -100,6 +100,13 @@
 	 * Align bitmap storage size to full byte.
 	 */
 	max_chips = map->size >> cfi.chipshift;
+	// If we shift down to 0, assume there is at least one chip here
+	if( max_chips == 0 )
+	{
+		printk( KERN_WARNING "%s: map->size as specified is less than "
+				     "actual chip size\n", map->name );
+		max_chips = 1;
+	}
 	mapsize = (max_chips / 8) + ((max_chips % 8) ? 1 : 0);
 	chip_map = kmalloc(mapsize, GFP_KERNEL);
 	if (!chip_map) {






^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2006-05-30 12:29 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1145723704.3524.TMDA@mail.tag.jimramsay.com>
2006-04-22 16:49 ` Fw: Possible MTD bug in 2.6.15 Jim Ramsay
2006-04-22 17:08   ` Thiago Galesi
2006-04-23  3:48     ` Jim Ramsay
2006-04-23  7:45       ` Jörn Engel
2006-04-19 16:49 Jim Ramsay
2006-04-19 17:06 ` Thiago Galesi
2006-04-19 17:43   ` Pekka Enberg
2006-05-30 12:30 ` David Woodhouse

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®