if (tty->ldisc.num == ldisc)
return 0; /* We are already in the desired discipline */
+
+ if (!try_module_get(ldiscs[ldisc].owner))
+ return -EINVAL;
+
o_ldisc = tty->ldisc;
tty_wait_until_sent(tty, 0);
if (tty->ldisc.open)
retval = (tty->ldisc.open)(tty);
if (retval < 0) {
+ module_put(tty->ldisc.owner);
+
tty->ldisc = o_ldisc;
tty->termios->c_line = tty->ldisc.num;
if (tty->ldisc.open && (tty->ldisc.open(tty) < 0)) {
+ module_put(tty->ldisc.owner);
+
tty->ldisc = ldiscs[N_TTY];
tty->termios->c_line = N_TTY;
if (tty->ldisc.open) {
tty_name(tty, buf), r);
}
}
+ } else {
+ module_put(o_ldisc.owner);
}
+
if (tty->ldisc.num != o_ldisc.num && tty->driver.set_ldisc)
tty->driver.set_ldisc(tty);
return retval;
if (tty->ldisc.num != ldiscs[N_TTY].num) {
if (tty->ldisc.close)
(tty->ldisc.close)(tty);
+ module_put(tty->ldisc.owner);
+
tty->ldisc = ldiscs[N_TTY];
tty->termios->c_line = N_TTY;
if (tty->ldisc.open) {
*/
if (tty->ldisc.close)
(tty->ldisc.close)(tty);
+ module_put(tty->ldisc.owner);
+
tty->ldisc = ldiscs[N_TTY];
tty->termios->c_line = N_TTY;
if (o_tty) {
if (o_tty->ldisc.close)
(o_tty->ldisc.close)(o_tty);
+ module_put(o_tty->ldisc.owner);
o_tty->ldisc = ldiscs[N_TTY];
}
char *name;
int num;
int flags;
+
/*
* The following routines are called from above.
*/
char *fp, int count);
int (*receive_room)(struct tty_struct *);
void (*write_wakeup)(struct tty_struct *);
+
+ struct module *owner;
};
#define TTY_LDISC_MAGIC 0x5403