ipmi_msghandler module load failure
PATCH 1/1 ipmi_msghandler module load failure
Corey,
On a 2.6.7 kernel, when I try to modprobe ipmi_msghandler, it fails to load with following message:
FATAL: Error inserting ipmi_msghandler (/lib/modules/2.6.7/kernel/drivers/char/ipmi/ipmi_msghandler.ko): Invalid module format
And there is an error message in dmesg:
ipmi_msghandler: init symbol 0xa000000200058080 used in module code at a000000200031b32
What I have been able to determine is that ipmi_msghandler.c defines ipmi_init_msghandler() as the module_init() routine and then it also calls ipmi_init_msghandler() diretcly from couple of other places. This does not seem to be okay in 2.6.7 kernel. I was able to fix this by defining a new module_init routine which in turn calls ipmi_init_msghandler(). I also removed __init from ipmi_init_msghandler() since it gets called from ipmi_open() on an open of the ipmi device file. So I would think we want to keep ipmi_init_msghandler() around even after initialization. Here is the patch. Please apply if it looks good:
drivers/char/ipmi/ipmi_msghandler.c +7 -2
@@ -3072,7 +3072,7 @@ 200 /* priority: INT_MAX >= x >= 0 */ }; -static __init int ipmi_init_msghandler (void ) +static int ipmi_init_msghandler (void ) {int i;
@@ -3107,6 +3107,11 @@return 0 ; } +static __init int ipmi_init_msghandler_mod (void ) +{ +ipmi_init_msghandler (); +} + static __exit void cleanup_ipmi(void) {int count;
@@ -3143,7 +3148,7 @@ }module_exit (cleanup_ipmi); -module_init (ipmi_init_msghandler); +module_init (ipmi_init_msghandler_mod);MODULE_LICENSE ("GPL" );EXPORT_SYMBOL (ipmi_alloc_recv_msg);
Signature · 9 lines
Khalid ==================================================================== Khalid Aziz Linux and Open Source Lab (970)898-9214 Hewlett-Packard [email protected] Fort Collins, CO "The Linux kernel is subject to relentless development" - Alessandro Rubini
So they've added enforcement so that non-init code cannot call init code. The call as it was is actually safe, there is a variable that will only cause it to be called if it has not been called yet (there are possible reasons to do this when the driver is compiled into the kernel) and it always gets called at init time. The the enforcement is probably a good thing, though. The patch looks ok.
-Corey
Quoted 57 lines · Khalid Aziz
Corey,
On a 2.6.7 kernel, when I try to modprobe
ipmi_msghandler, it fails to load with following message:FATAL: Error inserting
ipmi_msghandler(/lib/modules/2.6.7/kernel/drivers/char/ipmi/ipmi_msghandler.ko): Invalid module formatAnd there is an error message in dmesg:
ipmi_msghandler: init symbol0xa000000200058080used in module code ata000000200031b32What I have been able to determine is that
ipmi_msghandler.cdefinesipmi_init_msghandler()as themodule_init()routine and then it also callsipmi_init_msghandler()diretcly from couple of other places. This does not seem to be okay in 2.6.7 kernel. I was able to fix this by defining a newmodule_initroutine which in turn callsipmi_init_msghandler(). I also removed__initfromipmi_init_msghandler()since it gets called fromipmi_open()on an open of the ipmi device file. So I would think we want to keepipmi_init_msghandler()around even after initialization. Here is the patch. Please apply if it looks good:drivers/char/ipmi/ipmi_msghandler.c +7
-2@@ -3072,7 +3072,7 @@ 200 /* priority: INT_MAX >= x >= 0 */ }; -static __init int ipmi_init_msghandler (void ) +static int ipmi_init_msghandler (void ) {int i;@@ -3107,6 +3107,11 @@return 0 ; } +static __init int ipmi_init_msghandler_mod (void ) +{ +ipmi_init_msghandler (); +} + static __exit void cleanup_ipmi(void) {int count;@@ -3143,7 +3148,7 @@ }module_exit (cleanup_ipmi); -module_init (ipmi_init_msghandler); +module_init (ipmi_init_msghandler_mod);MODULE_LICENSE ("GPL" );EXPORT_SYMBOL (ipmi_alloc_recv_msg);