aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/serial/serial_core.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 977ce820ce30..f7263e104d81 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -914,14 +914,14 @@ static void uart_break_ctl(struct tty_struct *tty, int break_state)
914 struct uart_state *state = tty->driver_data; 914 struct uart_state *state = tty->driver_data;
915 struct uart_port *port = state->port; 915 struct uart_port *port = state->port;
916 916
917 BUG_ON(!kernel_locked()); 917 lock_kernel();
918
919 mutex_lock(&state->mutex); 918 mutex_lock(&state->mutex);
920 919
921 if (port->type != PORT_UNKNOWN) 920 if (port->type != PORT_UNKNOWN)
922 port->ops->break_ctl(port, break_state); 921 port->ops->break_ctl(port, break_state);
923 922
924 mutex_unlock(&state->mutex); 923 mutex_unlock(&state->mutex);
924 unlock_kernel();
925} 925}
926 926
927static int uart_do_autoconfig(struct uart_state *state) 927static int uart_do_autoconfig(struct uart_state *state)
@@ -1059,7 +1059,7 @@ static int uart_get_count(struct uart_state *state,
1059} 1059}
1060 1060
1061/* 1061/*
1062 * Called via sys_ioctl under the BKL. We can use spin_lock_irq() here. 1062 * Called via sys_ioctl. We can use spin_lock_irq() here.
1063 */ 1063 */
1064static int 1064static int
1065uart_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd, 1065uart_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd,
@@ -1069,8 +1069,8 @@ uart_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd,
1069 void __user *uarg = (void __user *)arg; 1069 void __user *uarg = (void __user *)arg;
1070 int ret = -ENOIOCTLCMD; 1070 int ret = -ENOIOCTLCMD;
1071 1071
1072 BUG_ON(!kernel_locked());
1073 1072
1073 lock_kernel();
1074 /* 1074 /*
1075 * These ioctls don't rely on the hardware to be present. 1075 * These ioctls don't rely on the hardware to be present.
1076 */ 1076 */
@@ -1143,6 +1143,7 @@ uart_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd,
1143 out_up: 1143 out_up:
1144 mutex_unlock(&state->mutex); 1144 mutex_unlock(&state->mutex);
1145 out: 1145 out:
1146 unlock_kernel();
1146 return ret; 1147 return ret;
1147} 1148}
1148 1149
@@ -1153,7 +1154,6 @@ static void uart_set_termios(struct tty_struct *tty,
1153 unsigned long flags; 1154 unsigned long flags;
1154 unsigned int cflag = tty->termios->c_cflag; 1155 unsigned int cflag = tty->termios->c_cflag;
1155 1156
1156 BUG_ON(!kernel_locked());
1157 1157
1158 /* 1158 /*
1159 * These are the bits that are used to setup various 1159 * These are the bits that are used to setup various
@@ -1165,9 +1165,11 @@ static void uart_set_termios(struct tty_struct *tty,
1165 if ((cflag ^ old_termios->c_cflag) == 0 && 1165 if ((cflag ^ old_termios->c_cflag) == 0 &&
1166 tty->termios->c_ospeed == old_termios->c_ospeed && 1166 tty->termios->c_ospeed == old_termios->c_ospeed &&
1167 tty->termios->c_ispeed == old_termios->c_ispeed && 1167 tty->termios->c_ispeed == old_termios->c_ispeed &&
1168 RELEVANT_IFLAG(tty->termios->c_iflag ^ old_termios->c_iflag) == 0) 1168 RELEVANT_IFLAG(tty->termios->c_iflag ^ old_termios->c_iflag) == 0) {
1169 return; 1169 return;
1170 }
1170 1171
1172 lock_kernel();
1171 uart_change_speed(state, old_termios); 1173 uart_change_speed(state, old_termios);
1172 1174
1173 /* Handle transition to B0 status */ 1175 /* Handle transition to B0 status */
@@ -1200,7 +1202,7 @@ static void uart_set_termios(struct tty_struct *tty,
1200 } 1202 }
1201 spin_unlock_irqrestore(&state->port->lock, flags); 1203 spin_unlock_irqrestore(&state->port->lock, flags);
1202 } 1204 }
1203 1205 unlock_kernel();
1204#if 0 1206#if 0
1205 /* 1207 /*
1206 * No need to wake up processes in open wait, since they 1208 * No need to wake up processes in open wait, since they