--- x/drivers/net/caif/caif_serial.c +++ y/drivers/net/caif/caif_serial.c @@ -304,11 +304,14 @@ static void ser_release(struct work_stru spin_unlock(&ser_lock); if (!list_empty(&list)) { + struct tty_struct *tty; rtnl_lock(); list_for_each_entry_safe(ser, tmp, &list, node) { + tty = ser->tty; dev_close(ser->dev); unregister_netdevice(ser->dev); debugfs_deinit(ser); + tty_kref_put(tty); } rtnl_unlock(); } @@ -369,8 +372,6 @@ static void ldisc_close(struct tty_struc { struct ser_device *ser = tty->disc_data; - tty_kref_put(ser->tty); - spin_lock(&ser_lock); list_move(&ser->node, &ser_release_list); spin_unlock(&ser_lock);