Commit f81ee8b8 authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman

tty: make tty_ldisc_ops a param in tty_unregister_ldisc

Make tty_unregister_ldisc symmetric to tty_register_ldisc by accepting
struct tty_ldisc_ops as a parameter instead of ldisc number. This avoids
checking of the ldisc number bounds in tty_unregister_ldisc.
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Cc: William Hubbs <w.d.hubbs@gmail.com>
Cc: Chris Brannon <chris@the-brannons.com>
Cc: Kirk Reiser <kirk@reisers.ca>
Cc: Samuel Thibault <samuel.thibault@ens-lyon.org>
Cc: Marcel Holtmann <marcel@holtmann.org>
Cc: Johan Hedberg <johan.hedberg@gmail.com>
Cc: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Wolfgang Grandegger <wg@grandegger.com>
Cc: Marc Kleine-Budde <mkl@pengutronix.de>
Cc: Andreas Koensgen <ajk@comnets.uni-bremen.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Rodolfo Giometti <giometti@enneenne.com>
Cc: Peter Ujfalusi <peter.ujfalusi@gmail.com>
Cc: Liam Girdwood <lgirdwood@gmail.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Jaroslav Kysela <perex@perex.cz>
Cc: Takashi Iwai <tiwai@suse.com>
Link: https://lore.kernel.org/r/20210505091928.22010-17-jslaby@suse.czSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 839e0f22
...@@ -219,7 +219,7 @@ void spk_ttyio_register_ldisc(void) ...@@ -219,7 +219,7 @@ void spk_ttyio_register_ldisc(void)
void spk_ttyio_unregister_ldisc(void) void spk_ttyio_unregister_ldisc(void)
{ {
if (tty_unregister_ldisc(N_SPEAKUP)) if (tty_unregister_ldisc(&spk_ttyio_ldisc_ops))
pr_warn("speakup: Couldn't unregister ldisc\n"); pr_warn("speakup: Couldn't unregister ldisc\n");
} }
......
...@@ -917,7 +917,7 @@ static void __exit hci_uart_exit(void) ...@@ -917,7 +917,7 @@ static void __exit hci_uart_exit(void)
#endif #endif
/* Release tty registration of line discipline */ /* Release tty registration of line discipline */
err = tty_unregister_ldisc(N_HCI); err = tty_unregister_ldisc(&hci_uart_ldisc);
if (err) if (err)
BT_ERR("Can't unregister HCI line discipline (%d)", err); BT_ERR("Can't unregister HCI line discipline (%d)", err);
} }
......
...@@ -304,7 +304,7 @@ static int __init serport_init(void) ...@@ -304,7 +304,7 @@ static int __init serport_init(void)
static void __exit serport_exit(void) static void __exit serport_exit(void)
{ {
tty_unregister_ldisc(N_MOUSE); tty_unregister_ldisc(&serport_ldisc);
} }
module_init(serport_init); module_init(serport_init);
......
...@@ -872,7 +872,7 @@ int st_core_init(struct st_data_s **core_data) ...@@ -872,7 +872,7 @@ int st_core_init(struct st_data_s **core_data)
st_gdata = kzalloc(sizeof(struct st_data_s), GFP_KERNEL); st_gdata = kzalloc(sizeof(struct st_data_s), GFP_KERNEL);
if (!st_gdata) { if (!st_gdata) {
pr_err("memory allocation failed"); pr_err("memory allocation failed");
err = tty_unregister_ldisc(N_TI_WL); err = tty_unregister_ldisc(&st_ldisc_ops);
if (err) if (err)
pr_err("unable to un-register ldisc %ld", err); pr_err("unable to un-register ldisc %ld", err);
err = -ENOMEM; err = -ENOMEM;
...@@ -892,7 +892,7 @@ int st_core_init(struct st_data_s **core_data) ...@@ -892,7 +892,7 @@ int st_core_init(struct st_data_s **core_data)
if (err) { if (err) {
pr_err("error during st_ll initialization(%ld)", err); pr_err("error during st_ll initialization(%ld)", err);
kfree(st_gdata); kfree(st_gdata);
err = tty_unregister_ldisc(N_TI_WL); err = tty_unregister_ldisc(&st_ldisc_ops);
if (err) if (err)
pr_err("unable to un-register ldisc"); pr_err("unable to un-register ldisc");
return err; return err;
...@@ -919,7 +919,7 @@ void st_core_exit(struct st_data_s *st_gdata) ...@@ -919,7 +919,7 @@ void st_core_exit(struct st_data_s *st_gdata)
kfree_skb(st_gdata->rx_skb); kfree_skb(st_gdata->rx_skb);
kfree_skb(st_gdata->tx_skb); kfree_skb(st_gdata->tx_skb);
/* TTY ldisc cleanup */ /* TTY ldisc cleanup */
err = tty_unregister_ldisc(N_TI_WL); err = tty_unregister_ldisc(&st_ldisc_ops);
if (err) if (err)
pr_err("unable to un-register ldisc %ld", err); pr_err("unable to un-register ldisc %ld", err);
/* free the global data pointer */ /* free the global data pointer */
......
...@@ -447,7 +447,7 @@ static void __exit caif_ser_exit(void) ...@@ -447,7 +447,7 @@ static void __exit caif_ser_exit(void)
spin_unlock(&ser_lock); spin_unlock(&ser_lock);
ser_release(NULL); ser_release(NULL);
cancel_work_sync(&ser_release_work); cancel_work_sync(&ser_release_work);
tty_unregister_ldisc(N_CAIF); tty_unregister_ldisc(&caif_ldisc);
debugfs_remove_recursive(debugfsdir); debugfs_remove_recursive(debugfsdir);
} }
......
...@@ -784,7 +784,7 @@ static void __exit slcan_exit(void) ...@@ -784,7 +784,7 @@ static void __exit slcan_exit(void)
kfree(slcan_devs); kfree(slcan_devs);
slcan_devs = NULL; slcan_devs = NULL;
i = tty_unregister_ldisc(N_SLCAN); i = tty_unregister_ldisc(&slc_ldisc);
if (i) if (i)
printk(KERN_ERR "slcan: can't unregister ldisc (err %d)\n", i); printk(KERN_ERR "slcan: can't unregister ldisc (err %d)\n", i);
} }
......
...@@ -781,7 +781,7 @@ static void __exit sixpack_exit_driver(void) ...@@ -781,7 +781,7 @@ static void __exit sixpack_exit_driver(void)
{ {
int ret; int ret;
if ((ret = tty_unregister_ldisc(N_6PACK))) if ((ret = tty_unregister_ldisc(&sp_ldisc)))
printk(msg_unregfail, ret); printk(msg_unregfail, ret);
} }
......
...@@ -967,7 +967,7 @@ static void __exit mkiss_exit_driver(void) ...@@ -967,7 +967,7 @@ static void __exit mkiss_exit_driver(void)
{ {
int ret; int ret;
if ((ret = tty_unregister_ldisc(N_AX25))) if ((ret = tty_unregister_ldisc(&ax_ldisc)))
printk(msg_unregfail, ret); printk(msg_unregfail, ret);
} }
......
...@@ -1016,7 +1016,7 @@ static void async_lcp_peek(struct asyncppp *ap, unsigned char *data, ...@@ -1016,7 +1016,7 @@ static void async_lcp_peek(struct asyncppp *ap, unsigned char *data,
static void __exit ppp_async_cleanup(void) static void __exit ppp_async_cleanup(void)
{ {
if (tty_unregister_ldisc(N_PPP) != 0) if (tty_unregister_ldisc(&ppp_ldisc) != 0)
printk(KERN_ERR "failed to unregister PPP line discipline\n"); printk(KERN_ERR "failed to unregister PPP line discipline\n");
} }
......
...@@ -727,7 +727,7 @@ ppp_sync_input(struct syncppp *ap, const unsigned char *buf, ...@@ -727,7 +727,7 @@ ppp_sync_input(struct syncppp *ap, const unsigned char *buf,
static void __exit static void __exit
ppp_sync_cleanup(void) ppp_sync_cleanup(void)
{ {
if (tty_unregister_ldisc(N_SYNC_PPP) != 0) if (tty_unregister_ldisc(&ppp_sync_ldisc) != 0)
printk(KERN_ERR "failed to unregister Sync PPP line discipline\n"); printk(KERN_ERR "failed to unregister Sync PPP line discipline\n");
} }
......
...@@ -1360,7 +1360,7 @@ static void __exit slip_exit(void) ...@@ -1360,7 +1360,7 @@ static void __exit slip_exit(void)
kfree(slip_devs); kfree(slip_devs);
slip_devs = NULL; slip_devs = NULL;
i = tty_unregister_ldisc(N_SLIP); i = tty_unregister_ldisc(&sl_ldisc);
if (i != 0) if (i != 0)
printk(KERN_ERR "SLIP: can't unregister line discipline (err = %d)\n", i); printk(KERN_ERR "SLIP: can't unregister line discipline (err = %d)\n", i);
} }
......
...@@ -131,7 +131,7 @@ static void __exit pps_tty_cleanup(void) ...@@ -131,7 +131,7 @@ static void __exit pps_tty_cleanup(void)
{ {
int err; int err;
err = tty_unregister_ldisc(N_PPS); err = tty_unregister_ldisc(&pps_ldisc_ops);
if (err) if (err)
pr_err("can't unregister PPS line discipline\n"); pr_err("can't unregister PPS line discipline\n");
else else
......
...@@ -3280,13 +3280,13 @@ static int __init gsm_init(void) ...@@ -3280,13 +3280,13 @@ static int __init gsm_init(void)
err_put_driver: err_put_driver:
put_tty_driver(gsm_tty_driver); put_tty_driver(gsm_tty_driver);
err_unreg_ldisc: err_unreg_ldisc:
tty_unregister_ldisc(N_GSM0710); tty_unregister_ldisc(&tty_ldisc_packet);
return status; return status;
} }
static void __exit gsm_exit(void) static void __exit gsm_exit(void)
{ {
int status = tty_unregister_ldisc(N_GSM0710); int status = tty_unregister_ldisc(&tty_ldisc_packet);
if (status != 0) if (status != 0)
pr_err("n_gsm: can't unregister line discipline (err = %d)\n", pr_err("n_gsm: can't unregister line discipline (err = %d)\n",
status); status);
......
...@@ -822,8 +822,7 @@ static int __init n_hdlc_init(void) ...@@ -822,8 +822,7 @@ static int __init n_hdlc_init(void)
static void __exit n_hdlc_exit(void) static void __exit n_hdlc_exit(void)
{ {
/* Release tty registration of line discipline */ int status = tty_unregister_ldisc(&n_hdlc_ldisc);
int status = tty_unregister_ldisc(N_HDLC);
if (status) if (status)
pr_err("N_HDLC: can't unregister line discipline (err = %d)\n", pr_err("N_HDLC: can't unregister line discipline (err = %d)\n",
......
...@@ -57,7 +57,7 @@ static int __init n_null_init(void) ...@@ -57,7 +57,7 @@ static int __init n_null_init(void)
static void __exit n_null_exit(void) static void __exit n_null_exit(void)
{ {
tty_unregister_ldisc(N_NULL); tty_unregister_ldisc(&null_ldisc);
} }
module_init(n_null_init); module_init(n_null_init);
......
...@@ -87,19 +87,16 @@ EXPORT_SYMBOL(tty_register_ldisc); ...@@ -87,19 +87,16 @@ EXPORT_SYMBOL(tty_register_ldisc);
* takes tty_ldiscs_lock to guard against ldisc races * takes tty_ldiscs_lock to guard against ldisc races
*/ */
int tty_unregister_ldisc(int disc) int tty_unregister_ldisc(struct tty_ldisc_ops *ldisc)
{ {
unsigned long flags; unsigned long flags;
int ret = 0; int ret = 0;
if (disc < N_TTY || disc >= NR_LDISCS)
return -EINVAL;
raw_spin_lock_irqsave(&tty_ldiscs_lock, flags); raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
if (tty_ldiscs[disc]->refcount) if (tty_ldiscs[ldisc->num]->refcount)
ret = -EBUSY; ret = -EBUSY;
else else
tty_ldiscs[disc] = NULL; tty_ldiscs[ldisc->num] = NULL;
raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags); raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
return ret; return ret;
......
...@@ -637,7 +637,7 @@ static inline int tty_port_users(struct tty_port *port) ...@@ -637,7 +637,7 @@ static inline int tty_port_users(struct tty_port *port)
} }
extern int tty_register_ldisc(struct tty_ldisc_ops *new_ldisc); extern int tty_register_ldisc(struct tty_ldisc_ops *new_ldisc);
extern int tty_unregister_ldisc(int disc); extern int tty_unregister_ldisc(struct tty_ldisc_ops *ldisc);
extern int tty_set_ldisc(struct tty_struct *tty, int disc); extern int tty_set_ldisc(struct tty_struct *tty, int disc);
extern int tty_ldisc_receive_buf(struct tty_ldisc *ld, const unsigned char *p, extern int tty_ldisc_receive_buf(struct tty_ldisc *ld, const unsigned char *p,
const char *f, int count); const char *f, int count);
......
...@@ -462,7 +462,7 @@ static int __init nci_uart_init(void) ...@@ -462,7 +462,7 @@ static int __init nci_uart_init(void)
static void __exit nci_uart_exit(void) static void __exit nci_uart_exit(void)
{ {
tty_unregister_ldisc(N_NCI); tty_unregister_ldisc(&nci_uart_ldisc);
} }
module_init(nci_uart_init); module_init(nci_uart_init);
......
...@@ -583,7 +583,7 @@ static int ams_delta_remove(struct platform_device *pdev) ...@@ -583,7 +583,7 @@ static int ams_delta_remove(struct platform_device *pdev)
{ {
struct snd_soc_card *card = platform_get_drvdata(pdev); struct snd_soc_card *card = platform_get_drvdata(pdev);
if (tty_unregister_ldisc(N_V253) != 0) if (tty_unregister_ldisc(&cx81801_ops) != 0)
dev_warn(&pdev->dev, dev_warn(&pdev->dev,
"failed to unregister V253 line discipline\n"); "failed to unregister V253 line discipline\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment