]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ipmi:ssif: Clean up kthread on errors
authorCorey Minyard <corey@minyard.net>
Mon, 13 Apr 2026 13:00:23 +0000 (08:00 -0500)
committerCorey Minyard <corey@minyard.net>
Fri, 17 Apr 2026 11:47:40 +0000 (06:47 -0500)
If an error occurs after the ssif kthread is created, but before the
main IPMI code starts the ssif interface, the ssif kthread will not
be stopped.

So make sure the kthread is stopped on an error condition if it is
running.

Fixes: 259307074bfc ("ipmi: Add SMBus interface driver (SSIF)")
Reported-by: Li Xiao <<252270051@hdu.edu.cn>
Cc: stable@vger.kernel.org
Reviewed-by: Li Xiao <252270051@hdu.edu.cn>
Signed-off-by: Corey Minyard <corey@minyard.net>
drivers/char/ipmi/ipmi_ssif.c

index ce918fe987c6313b42c670d041a01d2236562103..b49500a1bd3637496dc27982aa50715b8f41fcc7 100644 (file)
@@ -1268,8 +1268,10 @@ static void shutdown_ssif(void *send_info)
        ssif_info->stopping = true;
        timer_delete_sync(&ssif_info->watch_timer);
        timer_delete_sync(&ssif_info->retry_timer);
-       if (ssif_info->thread)
+       if (ssif_info->thread) {
                kthread_stop(ssif_info->thread);
+               ssif_info->thread = NULL;
+       }
 }
 
 static void ssif_remove(struct i2c_client *client)
@@ -1912,6 +1914,15 @@ static int ssif_probe(struct i2c_client *client)
 
  out:
        if (rv) {
+               /*
+                * If ipmi_register_smi() starts the interface, it will
+                * call shutdown and that will free the thread and set
+                * it to NULL.  Otherwise it must be freed here.
+                */
+               if (ssif_info->thread) {
+                       kthread_stop(ssif_info->thread);
+                       ssif_info->thread = NULL;
+               }
                if (addr_info)
                        addr_info->client = NULL;