Skip to contentSkip to conversation

char/ipmi: fix OOPS caused by pnp_unregister_driver on unregistered driver

PATCH In review Corey Minyard 2 participants 2 messages Feb 10, 2011 IPMI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 char/ipmi: fix OOPS caused by pnp_unregister_driver on unregistered driver

This patch fixes an OOPS triggered when calling modprobe ipmi_si a second time after the first modprobe returned without finding any ipmi devices. This can happen if you reload the module after having the first module load fail. The driver was not deregistering from PNP in that case.

Peter Huewe originally reported this patch and supplied a fix, I have a different patch based on Linus' suggestion that cleans things up a bit more.

KernelVersion: 2.6.37

---
 drivers/char/ipmi/ipmi_si_intf.c |   12 ++----------
 1 files changed, 2 insertions(+), 10 deletions(-)
drivers/char/ipmi/ipmi_si_intf.c +2 -10
index b6ae6e9..7855f9f 100644
@@ -320,6 +320,7 @@ static int unload_when_empty = 1;
 static int add_smi(struct smi_info *smi);
 static int try_smi_init(struct smi_info *smi);
 static void cleanup_one_si(struct smi_info *to_clean);
+static void cleanup_ipmi_si(void);
 
 static ATOMIC_NOTIFIER_HEAD(xaction_notifier_list);
 static int register_xaction_notifier(struct notifier_block *nb)
@@ -3450,16 +3451,7 @@ static int __devinit init_ipmi_si(void)
 	mutex_lock(&smi_infos_lock);
 	if (unload_when_empty && list_empty(&smi_infos)) {
 		mutex_unlock(&smi_infos_lock);
-#ifdef CONFIG_PCI
-		if (pci_registered)
-			pci_unregister_driver(&ipmi_pci_driver);
-#endif
-
-#ifdef CONFIG_PPC_OF
-		if (of_registered)
-			of_unregister_platform_driver(&ipmi_of_platform_driver);
-#endif
-		driver_unregister(&ipmi_driver.driver);
+		cleanup_ipmi_si();
 		printk(KERN_WARNING PFX
 		       "Unable to find any System Interface(s)\n");
 		return -ENODEV;
Signature · 1 line
1.6.3.3.333.gdf68
Reviewed-by on v1 1/1
#1 lore raw

Am Donnerstag 10 Februar 2011, 23:08:38 schrieb Corey Minyard:

Quoted 40 lines

This patch fixes an OOPS triggered when calling modprobe ipmi_si a second time after the first modprobe returned without finding any ipmi devices. This can happen if you reload the module after having the first module load fail. The driver was not deregistering from PNP in that case.

Peter Huewe originally reported this patch and supplied a fix, I have a different patch based on Linus' suggestion that cleans things up a bit more.

KernelVersion: 2.6.37

---
 drivers/char/ipmi/ipmi_si_intf.c |   12 ++----------
 1 files changed, 2 insertions(+), 10 deletions(-)
(quoted diff) +0 -0

b/drivers/char/ipmi/ipmi_si_intf.c index b6ae6e9..7855f9f 100644

drivers/char/ipmi/ipmi_si_intf.c +1 -4
@@ -320,6 +320,7 @@ static int unload_when_empty = 1;
 static int add_smi(struct smi_info *smi);
 static int try_smi_init(struct smi_info *smi);
 static void cleanup_one_si(struct smi_info *to_clean);
+static void cleanup_ipmi_si(void);
 
 static ATOMIC_NOTIFIER_HEAD(xaction_notifier_list);
 static int register_xaction_notifier(struct notifier_block *nb)
@@ -3450,16 +3451,7 @@ static int __devinit init_ipmi_si(void)
 	mutex_lock(&smi_infos_lock);
 	if (unload_when_empty && list_empty(&smi_infos)) {
 		mutex_unlock(&smi_infos_lock);
-#ifdef CONFIG_PCI
-		if (pci_registered)
-			pci_unregister_driver(&ipmi_pci_driver);
-#endif

drivers/char/ipmi/ipmi_si_intf.c static int __devinit init_ipmi_si(void) · line 3457

Quoted 10 lines
drivers/char/ipmi/ipmi_si_intf.c +1 -6
-
-#ifdef CONFIG_PPC_OF
-		if (of_registered)
-			of_unregister_platform_driver(&ipmi_of_platform_driver);
-#endif
-		driver_unregister(&ipmi_driver.driver);
+		cleanup_ipmi_si();
 		printk(KERN_WARNING PFX
 		       "Unable to find any System Interface(s)\n");
 		return -ENODEV;

Looks good to me - thanks.