[PATCH] Introduce tty_unregister_ldisc()
It's a bit strange to see tty_register_ldisc call in modules' exit functions. Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
790a19cd57
commit
bfb07599da
@@ -251,7 +251,7 @@ static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
|
||||
|
||||
static DEFINE_SPINLOCK(tty_ldisc_lock);
|
||||
static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
|
||||
static struct tty_ldisc tty_ldiscs[NR_LDISCS]; /* line disc dispatch table */
|
||||
static struct tty_ldisc tty_ldiscs[NR_LDISCS]; /* line disc dispatch table */
|
||||
|
||||
int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc)
|
||||
{
|
||||
@@ -262,24 +262,35 @@ int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&tty_ldisc_lock, flags);
|
||||
if (new_ldisc) {
|
||||
tty_ldiscs[disc] = *new_ldisc;
|
||||
tty_ldiscs[disc].num = disc;
|
||||
tty_ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
|
||||
tty_ldiscs[disc].refcount = 0;
|
||||
} else {
|
||||
if(tty_ldiscs[disc].refcount)
|
||||
ret = -EBUSY;
|
||||
else
|
||||
tty_ldiscs[disc].flags &= ~LDISC_FLAG_DEFINED;
|
||||
}
|
||||
tty_ldiscs[disc] = *new_ldisc;
|
||||
tty_ldiscs[disc].num = disc;
|
||||
tty_ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
|
||||
tty_ldiscs[disc].refcount = 0;
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(tty_register_ldisc);
|
||||
|
||||
int tty_unregister_ldisc(int disc)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
if (disc < N_TTY || disc >= NR_LDISCS)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&tty_ldisc_lock, flags);
|
||||
if (tty_ldiscs[disc].refcount)
|
||||
ret = -EBUSY;
|
||||
else
|
||||
tty_ldiscs[disc].flags &= ~LDISC_FLAG_DEFINED;
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(tty_unregister_ldisc);
|
||||
|
||||
struct tty_ldisc *tty_ldisc_get(int disc)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
Reference in New Issue
Block a user