ipmi: fix initialization when workqueue allocation fails
authorThadeu Lima de Souza Cascardo <cascardo@canonical.com>
Fri, 17 Dec 2021 15:44:10 +0000 (12:44 -0300)
committerCorey Minyard <cminyard@mvista.com>
Fri, 17 Dec 2021 20:39:03 +0000 (14:39 -0600)
If the workqueue allocation fails, the driver is marked as not initialized,
and timer and panic_notifier will be left registered.

Instead of removing those when workqueue allocation fails, do the workqueue
initialization before doing it, and cleanup srcu_struct if it fails.

Fixes: 1d49eb91e86e ("ipmi: Move remove_work to dedicated workqueue")
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Cc: Corey Minyard <cminyard@mvista.com>
Cc: Ioanna Alifieraki <ioanna-maria.alifieraki@canonical.com>
Cc: stable@vger.kernel.org
Message-Id: <20211217154410.1228673-2-cascardo@canonical.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
drivers/char/ipmi/ipmi_msghandler.c

index 84975b21fff23355146bfc360da5c3ae6b1e492a..266c7bc58ddae0866454df77c925fb269623a510 100644 (file)
@@ -5396,20 +5396,23 @@ static int ipmi_init_msghandler(void)
        if (rv)
                goto out;
 
-       timer_setup(&ipmi_timer, ipmi_timeout, 0);
-       mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
-
-       atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
-
        remove_work_wq = create_singlethread_workqueue("ipmi-msghandler-remove-wq");
        if (!remove_work_wq) {
                pr_err("unable to create ipmi-msghandler-remove-wq workqueue");
                rv = -ENOMEM;
-               goto out;
+               goto out_wq;
        }
 
+       timer_setup(&ipmi_timer, ipmi_timeout, 0);
+       mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
+
+       atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
+
        initialized = true;
 
+out_wq:
+       if (rv)
+               cleanup_srcu_struct(&ipmi_interfaces_srcu);
 out:
        mutex_unlock(&ipmi_interfaces_mutex);
        return rv;