Commit b190e178 authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds

specialix: Prepare for BKL pushdown

Lock the ioctl handlers and remove bogus softcar handling.
Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 638157bc
...@@ -1922,29 +1922,13 @@ static inline int sx_set_serial_info(struct specialix_port * port, ...@@ -1922,29 +1922,13 @@ static inline int sx_set_serial_info(struct specialix_port * port,
int change_speed; int change_speed;
func_enter(); func_enter();
/*
if (!access_ok(VERIFY_READ, (void *) newinfo, sizeof(tmp))) {
func_exit();
return -EFAULT;
}
*/
if (copy_from_user(&tmp, newinfo, sizeof(tmp))) { if (copy_from_user(&tmp, newinfo, sizeof(tmp))) {
func_enter(); func_enter();
return -EFAULT; return -EFAULT;
} }
#if 0 lock_kernel();
if ((tmp.irq != bp->irq) ||
(tmp.port != bp->base) ||
(tmp.type != PORT_CIRRUS) ||
(tmp.baud_base != (SX_OSCFREQ + CD186x_TPC/2) / CD186x_TPC) ||
(tmp.custom_divisor != 0) ||
(tmp.xmit_fifo_size != CD186x_NFIFO) ||
(tmp.flags & ~SPECIALIX_LEGAL_FLAGS)) {
func_exit();
return -EINVAL;
}
#endif
change_speed = ((port->flags & ASYNC_SPD_MASK) != change_speed = ((port->flags & ASYNC_SPD_MASK) !=
(tmp.flags & ASYNC_SPD_MASK)); (tmp.flags & ASYNC_SPD_MASK));
...@@ -1956,6 +1940,7 @@ static inline int sx_set_serial_info(struct specialix_port * port, ...@@ -1956,6 +1940,7 @@ static inline int sx_set_serial_info(struct specialix_port * port,
((tmp.flags & ~ASYNC_USR_MASK) != ((tmp.flags & ~ASYNC_USR_MASK) !=
(port->flags & ~ASYNC_USR_MASK))) { (port->flags & ~ASYNC_USR_MASK))) {
func_exit(); func_exit();
unlock_kernel();
return -EPERM; return -EPERM;
} }
port->flags = ((port->flags & ~ASYNC_USR_MASK) | port->flags = ((port->flags & ~ASYNC_USR_MASK) |
...@@ -1972,6 +1957,7 @@ static inline int sx_set_serial_info(struct specialix_port * port, ...@@ -1972,6 +1957,7 @@ static inline int sx_set_serial_info(struct specialix_port * port,
sx_change_speed(bp, port); sx_change_speed(bp, port);
} }
func_exit(); func_exit();
unlock_kernel();
return 0; return 0;
} }
...@@ -1984,12 +1970,8 @@ static inline int sx_get_serial_info(struct specialix_port * port, ...@@ -1984,12 +1970,8 @@ static inline int sx_get_serial_info(struct specialix_port * port,
func_enter(); func_enter();
/*
if (!access_ok(VERIFY_WRITE, (void *) retinfo, sizeof(tmp)))
return -EFAULT;
*/
memset(&tmp, 0, sizeof(tmp)); memset(&tmp, 0, sizeof(tmp));
lock_kernel();
tmp.type = PORT_CIRRUS; tmp.type = PORT_CIRRUS;
tmp.line = port - sx_port; tmp.line = port - sx_port;
tmp.port = bp->base; tmp.port = bp->base;
...@@ -2000,6 +1982,7 @@ static inline int sx_get_serial_info(struct specialix_port * port, ...@@ -2000,6 +1982,7 @@ static inline int sx_get_serial_info(struct specialix_port * port,
tmp.closing_wait = port->closing_wait * HZ/100; tmp.closing_wait = port->closing_wait * HZ/100;
tmp.custom_divisor = port->custom_divisor; tmp.custom_divisor = port->custom_divisor;
tmp.xmit_fifo_size = CD186x_NFIFO; tmp.xmit_fifo_size = CD186x_NFIFO;
unlock_kernel();
if (copy_to_user(retinfo, &tmp, sizeof(tmp))) { if (copy_to_user(retinfo, &tmp, sizeof(tmp))) {
func_exit(); func_exit();
return -EFAULT; return -EFAULT;
...@@ -2045,23 +2028,6 @@ static int sx_ioctl(struct tty_struct * tty, struct file * filp, ...@@ -2045,23 +2028,6 @@ static int sx_ioctl(struct tty_struct * tty, struct file * filp,
sx_send_break(port, arg ? arg*(HZ/10) : HZ/4); sx_send_break(port, arg ? arg*(HZ/10) : HZ/4);
func_exit(); func_exit();
return 0; return 0;
case TIOCGSOFTCAR:
if (put_user(C_CLOCAL(tty)?1:0, (unsigned long __user *)argp)) {
func_exit();
return -EFAULT;
}
func_exit();
return 0;
case TIOCSSOFTCAR:
if (get_user(arg, (unsigned long __user *) argp)) {
func_exit();
return -EFAULT;
}
tty->termios->c_cflag =
((tty->termios->c_cflag & ~CLOCAL) |
(arg ? CLOCAL : 0));
func_exit();
return 0;
case TIOCGSERIAL: case TIOCGSERIAL:
func_exit(); func_exit();
return sx_get_serial_info(port, argp); return sx_get_serial_info(port, argp);
......
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