Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56480287 authored by Matthew Garrett's avatar Matthew Garrett Committed by Linus Torvalds
Browse files

ipmi: make sure drivers were registered before unregistering them



The ipmi code will never register a PCI or Open Firmware driver if a
hardcoded device is provided by the user by providing device addresses via
the module parameters.  This can cause us to attempt to unregister a
driver that was never registered, resulting in an oops.  Keep track of
registration in order to avoid this.

Fixes a post-2.6.34 regression.

Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
Acked-by: default avatarCorey Minyard <cminyard@mvista.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e05bd336
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -302,6 +302,12 @@ struct smi_info {

static int force_kipmid[SI_MAX_PARMS];
static int num_force_kipmid;
#ifdef CONFIG_PCI
static int pci_registered;
#endif
#ifdef CONFIG_PPC_OF
static int of_registered;
#endif

static unsigned int kipmid_max_busy_us[SI_MAX_PARMS];
static int num_max_busy_us;
@@ -3314,6 +3320,8 @@ static __devinit int init_ipmi_si(void)
	rv = pci_register_driver(&ipmi_pci_driver);
	if (rv)
		printk(KERN_ERR PFX "Unable to register PCI driver: %d\n", rv);
	else
		pci_registered = 1;
#endif

#ifdef CONFIG_ACPI
@@ -3330,6 +3338,7 @@ static __devinit int init_ipmi_si(void)

#ifdef CONFIG_PPC_OF
	of_register_platform_driver(&ipmi_of_platform_driver);
	of_registered = 1;
#endif

	/* We prefer devices with interrupts, but in the case of a machine
@@ -3383,10 +3392,12 @@ static __devinit int init_ipmi_si(void)
	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);
@@ -3478,6 +3489,7 @@ static __exit void cleanup_ipmi_si(void)
		return;

#ifdef CONFIG_PCI
	if (pci_registered)
		pci_unregister_driver(&ipmi_pci_driver);
#endif
#ifdef CONFIG_ACPI
@@ -3485,6 +3497,7 @@ static __exit void cleanup_ipmi_si(void)
#endif

#ifdef CONFIG_PPC_OF
	if (of_registered)
		of_unregister_platform_driver(&ipmi_of_platform_driver);
#endif