Patch "hvsi: don't panic on tty_register_driver failure" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    hvsi: don't panic on tty_register_driver failure

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     hvsi-don-t-panic-on-tty_register_driver-failure.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit bd7a4844586b96efa67a1003c8e4b06c6d1aa2a4
Author: Jiri Slaby <jirislaby@xxxxxxxxxx>
Date:   Fri Jul 23 09:43:11 2021 +0200

    hvsi: don't panic on tty_register_driver failure
    
    [ Upstream commit 7ccbdcc4d08a6d7041e4849219bbb12ffa45db4c ]
    
    The alloc_tty_driver failure is handled gracefully in hvsi_init. But
    tty_register_driver is not. panic is called if that one fails.
    
    So handle the failure of tty_register_driver gracefully too. This will
    keep at least the console functional as it was enabled earlier by
    console_initcall in hvsi_console_init. Instead of shooting down the
    whole system.
    
    This means, we disable interrupts and restore hvsi_wait back to
    poll_for_state().
    
    Cc: linuxppc-dev@xxxxxxxxxxxxxxxx
    Signed-off-by: Jiri Slaby <jslaby@xxxxxxx>
    Link: https://lore.kernel.org/r/20210723074317.32690-3-jslaby@xxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/tty/hvc/hvsi.c b/drivers/tty/hvc/hvsi.c
index 66f95f758be0..73226337f561 100644
--- a/drivers/tty/hvc/hvsi.c
+++ b/drivers/tty/hvc/hvsi.c
@@ -1038,7 +1038,7 @@ static const struct tty_operations hvsi_ops = {
 
 static int __init hvsi_init(void)
 {
-	int i;
+	int i, ret;
 
 	hvsi_driver = alloc_tty_driver(hvsi_count);
 	if (!hvsi_driver)
@@ -1069,12 +1069,25 @@ static int __init hvsi_init(void)
 	}
 	hvsi_wait = wait_for_state; /* irqs active now */
 
-	if (tty_register_driver(hvsi_driver))
-		panic("Couldn't register hvsi console driver\n");
+	ret = tty_register_driver(hvsi_driver);
+	if (ret) {
+		pr_err("Couldn't register hvsi console driver\n");
+		goto err_free_irq;
+	}
 
 	printk(KERN_DEBUG "HVSI: registered %i devices\n", hvsi_count);
 
 	return 0;
+err_free_irq:
+	hvsi_wait = poll_for_state;
+	for (i = 0; i < hvsi_count; i++) {
+		struct hvsi_struct *hp = &hvsi_ports[i];
+
+		free_irq(hp->virq, hp);
+	}
+	tty_driver_kref_put(hvsi_driver);
+
+	return ret;
 }
 device_initcall(hvsi_init);
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux