ipmi: fix initialization when workqueue allocation fails
commit 75d70d76cb7b927cace2cb34265d68ebb3306b13 upstream. 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
1f6ab84746
commit
8b745616ba
@ -5165,20 +5165,23 @@ static int ipmi_init_msghandler(void)
|
|||||||
if (rv)
|
if (rv)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
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_wq;
|
||||||
|
}
|
||||||
|
|
||||||
timer_setup(&ipmi_timer, ipmi_timeout, 0);
|
timer_setup(&ipmi_timer, ipmi_timeout, 0);
|
||||||
mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
|
mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
|
||||||
|
|
||||||
atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
|
||||||
|
out_wq:
|
||||||
|
if (rv)
|
||||||
|
cleanup_srcu_struct(&ipmi_interfaces_srcu);
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ipmi_interfaces_mutex);
|
mutex_unlock(&ipmi_interfaces_mutex);
|
||||||
return rv;
|
return rv;
|
||||||
|
Loading…
Reference in New Issue
Block a user