Skip to contentSkip to conversation

ipmi_msghandler module load failure

PATCH In review Khalid Aziz 2 participants 2 messages Jul 16, 2004 – Jul 17, 2004 IPMI

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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 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);