|
|
|
@ -0,0 +1,199 @@
|
|
|
|
|
From: "Gordon Farquharson" <gordonfarquharson@gmail.com>
|
|
|
|
|
|
|
|
|
|
On machines that register a physmap flash platform device (e.g. many arm
|
|
|
|
|
machines), parse_mtd_partitions() in drivers/mtd/mtdpart.c can cause the
|
|
|
|
|
following output in the boot log:
|
|
|
|
|
|
|
|
|
|
request_module: runaway loop modprobe net-pf-1
|
|
|
|
|
modprobe: FATAL: Could not load
|
|
|
|
|
/lib/modules/2.6.25-rc4-iop32x/modules.dep: No such file or directory
|
|
|
|
|
|
|
|
|
|
modprobe: FATAL: Could not load
|
|
|
|
|
/lib/modules/2.6.25-rc4-iop32x/modules.dep: No such file or directory
|
|
|
|
|
|
|
|
|
|
modprobe: FATAL: Could not load
|
|
|
|
|
/lib/modules/2.6.25-rc4-iop32x/modules.dep: No such file or directory
|
|
|
|
|
...
|
|
|
|
|
|
|
|
|
|
To illustrate how this can occur, I'll use the example where CONFIG_KMOD=y,
|
|
|
|
|
CONFIG_MTD_PARTITIONS=y, CONFIG_MTD_REDBOOT_PARTS=y, and CONFIG_CMDLINE_PARTS
|
|
|
|
|
is not set. I'll also refer to the following code segment which is in
|
|
|
|
|
drivers/mtd/mtdpart.c:parse_mtd_partitions():
|
|
|
|
|
|
|
|
|
|
for ( ; ret <= 0 && *types; types++) {
|
|
|
|
|
parser = get_partition_parser(*types);
|
|
|
|
|
#ifdef CONFIG_KMOD
|
|
|
|
|
if (!parser && !request_module("%s", *types))
|
|
|
|
|
parser = get_partition_parser(*types);
|
|
|
|
|
#endif
|
|
|
|
|
if (!parser) {
|
|
|
|
|
printk(KERN_NOTICE "%s partition parsing not available\n",
|
|
|
|
|
*types);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
ret = (*parser->parse_fn)(master, pparts, origin);
|
|
|
|
|
if (ret > 0) {
|
|
|
|
|
printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n",
|
|
|
|
|
ret, parser->name, master->name);
|
|
|
|
|
}
|
|
|
|
|
put_partition_parser(parser);
|
|
|
|
|
|
|
|
|
|
I should note that I am assuming (because I don't understand how) that
|
|
|
|
|
request_module() requires net-pf-1 to succeed. This assumption is based on my
|
|
|
|
|
observation of the request_module message ("request_module: runaway loop
|
|
|
|
|
modprobe net-pf-1"), and that af_unix_init() (net-pf-1 initialization) is
|
|
|
|
|
called only after the call to request_module() in this example.
|
|
|
|
|
|
|
|
|
|
Based on the configuration and assumptions described above, the sequence of
|
|
|
|
|
events that cause the boot log messages above are:
|
|
|
|
|
|
|
|
|
|
1. the first call to get_partition_parser() in parse_mtd_partitions() does
|
|
|
|
|
not find the parser in the the list of registered parsers, i.e.
|
|
|
|
|
get_partition_parser() returns a NULL pointer. In this example, the only
|
|
|
|
|
registered parser in the list is called Redboot;
|
|
|
|
|
|
|
|
|
|
2. parse_mtd_partitions() calls request_module() with (in this example)
|
|
|
|
|
the parameter "cmdlinepart";
|
|
|
|
|
|
|
|
|
|
3. request_module() complains (request_module: runaway loop modprobe
|
|
|
|
|
net-pf-1, etc.) because af_unix_init() has not been called. The boot log
|
|
|
|
|
shows that af_unix_init() is called only after parse_mtd_partitions()
|
|
|
|
|
finishes.
|
|
|
|
|
|
|
|
|
|
register_mtd_parser: RedBoot
|
|
|
|
|
physmap platform flash device: 00080000 at f0000000
|
|
|
|
|
Found: ST M29W400DB
|
|
|
|
|
physmap-flash.0: Found 1 x16 devices at 0x0 in 16-bit bank
|
|
|
|
|
number of JEDEC chips: 1
|
|
|
|
|
cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness.
|
|
|
|
|
parse_mtd_partitions:
|
|
|
|
|
get_partition_parser: name=cmdlinepart
|
|
|
|
|
get_partition_parser: p->name=RedBoot
|
|
|
|
|
get_partition_parser: p->owner=00000000
|
|
|
|
|
get_partition_parser: ret=00000000
|
|
|
|
|
parse_mtd_partitions: cmdlinepart
|
|
|
|
|
request_module: runaway loop modprobe net-pf-1
|
|
|
|
|
modprobe: FATAL: Could not load
|
|
|
|
|
/lib/modules/2.6.25-rc4-iop32x/modules.dep: No such file or directory
|
|
|
|
|
|
|
|
|
|
modprobe: FATAL: Could not load
|
|
|
|
|
/lib/modules/2.6.25-rc4-iop32x/modules.dep: No such file or directory
|
|
|
|
|
|
|
|
|
|
modprobe: FATAL: Could not load
|
|
|
|
|
/lib/modules/2.6.25-rc4-iop32x/modules.dep: No such file or directory
|
|
|
|
|
|
|
|
|
|
<--- 47 repeated modprobe messages deleted --->
|
|
|
|
|
parse_mtd_partitions: request_module called
|
|
|
|
|
cmdlinepart partition parsing not available
|
|
|
|
|
get_partition_parser: name=RedBoot
|
|
|
|
|
get_partition_parser: p->name=RedBoot
|
|
|
|
|
get_partition_parser: p->owner=00000000
|
|
|
|
|
get_partition_parser: ret->name=RedBoot
|
|
|
|
|
get_partition_parser: ret=c02b0f8c
|
|
|
|
|
parse_mtd_partitions: RedBoot
|
|
|
|
|
parse_mtd_partitions: request_module called
|
|
|
|
|
Searching for RedBoot partition table in physmap-flash.0 at offset 0x70000
|
|
|
|
|
No RedBoot partition table detected in physmap-flash.0
|
|
|
|
|
parse_mtd_partitions: end of function
|
|
|
|
|
mice: PS/2 mouse device common for all mice
|
|
|
|
|
i2c /dev entries driver
|
|
|
|
|
rtc-rs5c372 0-0032: rs5c372a found, 24hr, driver version 0.5
|
|
|
|
|
rtc-rs5c372 0-0032: rtc core: registered rtc-rs5c372 as rtc0
|
|
|
|
|
iop-adma iop-adma.0: Intel(R) IOP: ( cpy intr )
|
|
|
|
|
iop-adma iop-adma.1: Intel(R) IOP: ( cpy intr )
|
|
|
|
|
NET: Registered protocol family 26
|
|
|
|
|
TCP bic registered
|
|
|
|
|
af_unix_init:
|
|
|
|
|
NET: Registered protocol family 1
|
|
|
|
|
NET: Registered protocol family 17
|
|
|
|
|
XScale DSP coprocessor detected.
|
|
|
|
|
registered taskstats version 1
|
|
|
|
|
rtc-rs5c372 0-0032: setting system clock to 2008-03-11 03:16:46 UTC (1205205406)
|
|
|
|
|
|
|
|
|
|
The reason parse_mtd_partitions() tries to use cmdlinepart, even though it is
|
|
|
|
|
not a registered parsing scheme when CONFIG_CMDLINE_PARTS is not set, is
|
|
|
|
|
because cmdlinepart is hard coded in drivers/mtd/maps/physmap.c:
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_MTD_PARTITIONS
|
|
|
|
|
static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
The patch below changes CONFIG_MTD_REDBOOT_PARTS, CONFIG_MTD_AFS_PARTS, and
|
|
|
|
|
CONFIG_MTD_OF_PARTS from tristate to bool, and removes the call to
|
|
|
|
|
request_module() in drivers/mtd/mtdpart.c:parse_mtd_partitions(). The changes
|
|
|
|
|
to the definitions of the configuration variables ensure that MTD parsers
|
|
|
|
|
compiled into the kernel are registered before parse_mtd_partitions() is
|
|
|
|
|
called, which negates the need to have parse_mtd_partitions() call
|
|
|
|
|
request_module(), and thereby eliminating the call to request_module() before
|
|
|
|
|
af_unix_init(). The patch also changes the setting of
|
|
|
|
|
CONFIG_MTD_REDBOOT_PARTS in arch/mips/configs/mtx1_defconfig from 'm' to 'y'.
|
|
|
|
|
This defconfig is the only one that set any of the partitioning schemes to be
|
|
|
|
|
compiled as a module.
|
|
|
|
|
|
|
|
|
|
Signed-off-by: Gordon Farquharson <gordonfarquharson@gmail.com>
|
|
|
|
|
Cc: David Woodhouse <dwmw2@infradead.org>
|
|
|
|
|
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
arch/mips/configs/mtx1_defconfig | 2 +-
|
|
|
|
|
drivers/mtd/Kconfig | 6 +++---
|
|
|
|
|
drivers/mtd/mtdpart.c | 4 ----
|
|
|
|
|
3 files changed, 4 insertions(+), 8 deletions(-)
|
|
|
|
|
|
|
|
|
|
diff -puN arch/mips/configs/mtx1_defconfig~mtd-prevent-physmap-from-causing-request_module-runaway-loop-modprobe-net-pf-1 arch/mips/configs/mtx1_defconfig
|
|
|
|
|
--- a/arch/mips/configs/mtx1_defconfig~mtd-prevent-physmap-from-causing-request_module-runaway-loop-modprobe-net-pf-1
|
|
|
|
|
+++ a/arch/mips/configs/mtx1_defconfig
|
|
|
|
|
@@ -743,7 +743,7 @@ CONFIG_MTD=m
|
|
|
|
|
# CONFIG_MTD_DEBUG is not set
|
|
|
|
|
CONFIG_MTD_CONCAT=m
|
|
|
|
|
CONFIG_MTD_PARTITIONS=y
|
|
|
|
|
-CONFIG_MTD_REDBOOT_PARTS=m
|
|
|
|
|
+CONFIG_MTD_REDBOOT_PARTS=y
|
|
|
|
|
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
|
|
|
|
|
# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
|
|
|
|
|
# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
|
|
|
|
|
diff -puN drivers/mtd/Kconfig~mtd-prevent-physmap-from-causing-request_module-runaway-loop-modprobe-net-pf-1 drivers/mtd/Kconfig
|
|
|
|
|
--- a/drivers/mtd/Kconfig~mtd-prevent-physmap-from-causing-request_module-runaway-loop-modprobe-net-pf-1
|
|
|
|
|
+++ a/drivers/mtd/Kconfig
|
|
|
|
|
@@ -48,7 +48,7 @@ config MTD_PARTITIONS
|
|
|
|
|
'normal' form of partitioning used on a block device.
|
|
|
|
|
|
|
|
|
|
config MTD_REDBOOT_PARTS
|
|
|
|
|
- tristate "RedBoot partition table parsing"
|
|
|
|
|
+ bool "RedBoot partition table parsing"
|
|
|
|
|
depends on MTD_PARTITIONS
|
|
|
|
|
---help---
|
|
|
|
|
RedBoot is a ROM monitor and bootloader which deals with multiple
|
|
|
|
|
@@ -135,7 +135,7 @@ config MTD_CMDLINE_PARTS
|
|
|
|
|
If unsure, say 'N'.
|
|
|
|
|
|
|
|
|
|
config MTD_AFS_PARTS
|
|
|
|
|
- tristate "ARM Firmware Suite partition parsing"
|
|
|
|
|
+ bool "ARM Firmware Suite partition parsing"
|
|
|
|
|
depends on ARM && MTD_PARTITIONS
|
|
|
|
|
---help---
|
|
|
|
|
The ARM Firmware Suite allows the user to divide flash devices into
|
|
|
|
|
@@ -151,7 +151,7 @@ config MTD_AFS_PARTS
|
|
|
|
|
'armflash' map driver (CONFIG_MTD_ARMFLASH) does this, for example.
|
|
|
|
|
|
|
|
|
|
config MTD_OF_PARTS
|
|
|
|
|
- tristate "Flash partition map based on OF description"
|
|
|
|
|
+ bool "Flash partition map based on OF description"
|
|
|
|
|
depends on PPC_OF && MTD_PARTITIONS
|
|
|
|
|
help
|
|
|
|
|
This provides a partition parsing function which derives
|
|
|
|
|
diff -puN drivers/mtd/mtdpart.c~mtd-prevent-physmap-from-causing-request_module-runaway-loop-modprobe-net-pf-1 drivers/mtd/mtdpart.c
|
|
|
|
|
--- a/drivers/mtd/mtdpart.c~mtd-prevent-physmap-from-causing-request_module-runaway-loop-modprobe-net-pf-1
|
|
|
|
|
+++ a/drivers/mtd/mtdpart.c
|
|
|
|
|
@@ -555,10 +555,6 @@ int parse_mtd_partitions(struct mtd_info
|
|
|
|
|
|
|
|
|
|
for ( ; ret <= 0 && *types; types++) {
|
|
|
|
|
parser = get_partition_parser(*types);
|
|
|
|
|
-#ifdef CONFIG_KMOD
|
|
|
|
|
- if (!parser && !request_module("%s", *types))
|
|
|
|
|
- parser = get_partition_parser(*types);
|
|
|
|
|
-#endif
|
|
|
|
|
if (!parser) {
|
|
|
|
|
printk(KERN_NOTICE "%s partition parsing not available\n",
|
|
|
|
|
*types);
|
|
|
|
|
_
|