Commit e23a9b43 authored by Okash Khawaja's avatar Okash Khawaja Committed by Greg Kroah-Hartman

staging: speakup: safely register and unregister ldisc

This patch makes use of functions added in the previous patch. It
registers ldisc during init of main speakup module and unregisters it
during exit. It also removes the code to register ldisc every time a
synth module is loaded. This way we only register the ldisc once when
main speakup module is loaded. Since main speakup module is required by
all synth modules, it is only unloaded when all synths have been
unloaded. Therefore we unregister the ldisc once, when all speakup
related references to the ldisc have returned. In unlikely scenario of
something outside speakup using the ldisc, the ldisc refcount check in
tty_unregister_ldisc will ensure that it is not unregistered while in
use.

The function to register ldisc doesn't cause speakup init function to
fail. That is different from current behaviour where failure to register
ldisc results in failure to load the specific synth module. This is
because speakup module is also required by those synths which don't use
tty and ldisc. We don't want to prevent those modules from loading when
ldisc fails to register. The synth modules will correctly fail when
trying to set N_SPEAKUP to tty, if ldisc registrationi had failed.
Signed-off-by: default avatarOkash Khawaja <okash.khawaja@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9f8dced2
...@@ -2314,6 +2314,7 @@ static void __exit speakup_exit(void) ...@@ -2314,6 +2314,7 @@ static void __exit speakup_exit(void)
mutex_lock(&spk_mutex); mutex_lock(&spk_mutex);
synth_release(); synth_release();
mutex_unlock(&spk_mutex); mutex_unlock(&spk_mutex);
spk_ttyio_unregister_ldisc();
speakup_kobj_exit(); speakup_kobj_exit();
...@@ -2376,6 +2377,7 @@ static int __init speakup_init(void) ...@@ -2376,6 +2377,7 @@ static int __init speakup_init(void)
if (err) if (err)
goto error_kobjects; goto error_kobjects;
spk_ttyio_register_ldisc();
synth_init(synth_name); synth_init(synth_name);
speakup_register_devsynth(); speakup_register_devsynth();
/* /*
......
...@@ -154,12 +154,6 @@ static int spk_ttyio_initialise_ldisc(struct spk_synth *synth) ...@@ -154,12 +154,6 @@ static int spk_ttyio_initialise_ldisc(struct spk_synth *synth)
struct ktermios tmp_termios; struct ktermios tmp_termios;
dev_t dev; dev_t dev;
ret = tty_register_ldisc(N_SPEAKUP, &spk_ttyio_ldisc_ops);
if (ret) {
pr_err("Error registering line discipline.\n");
return ret;
}
ret = get_dev_to_use(synth, &dev); ret = get_dev_to_use(synth, &dev);
if (ret) if (ret)
return ret; return ret;
...@@ -196,6 +190,8 @@ static int spk_ttyio_initialise_ldisc(struct spk_synth *synth) ...@@ -196,6 +190,8 @@ static int spk_ttyio_initialise_ldisc(struct spk_synth *synth)
tty_unlock(tty); tty_unlock(tty);
ret = tty_set_ldisc(tty, N_SPEAKUP); ret = tty_set_ldisc(tty, N_SPEAKUP);
if (ret)
pr_err("speakup: Failed to set N_SPEAKUP on tty\n");
return ret; return ret;
} }
......
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