Merge remote-tracking branches 'spi/fix/dw', 'spi/fix/orion', 'spi/fix/pl022', 'spi...
[firefly-linux-kernel-4.4.55.git] / drivers / tty / tty_ioctl.c
index dcf5c0af7de9adc8e3c46e20ee4c55aaa7926fe0..62380ccf70fb469f3e3c676452819ecfdf6ff4b5 100644 (file)
@@ -911,35 +911,6 @@ static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
 }
 #endif
 
-/**
- *     send_prio_char          -       send priority character
- *
- *     Send a high priority character to the tty even if stopped
- *
- *     Locking: none for xchar method, write ordering for write method.
- */
-
-static int send_prio_char(struct tty_struct *tty, char ch)
-{
-       int     was_stopped = tty->stopped;
-
-       if (tty->ops->send_xchar) {
-               tty->ops->send_xchar(tty, ch);
-               return 0;
-       }
-
-       if (tty_write_lock(tty, 0) < 0)
-               return -ERESTARTSYS;
-
-       if (was_stopped)
-               start_tty(tty);
-       tty->ops->write(tty, &ch, 1);
-       if (was_stopped)
-               stop_tty(tty);
-       tty_write_unlock(tty);
-       return 0;
-}
-
 /**
  *     tty_change_softcar      -       carrier change ioctl helper
  *     @tty: tty to update
@@ -1193,17 +1164,21 @@ int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
                        spin_unlock_irq(&tty->flow_lock);
                        break;
                case TCIOFF:
+                       down_read(&tty->termios_rwsem);
                        if (STOP_CHAR(tty) != __DISABLED_CHAR)
-                               return send_prio_char(tty, STOP_CHAR(tty));
+                               retval = tty_send_xchar(tty, STOP_CHAR(tty));
+                       up_read(&tty->termios_rwsem);
                        break;
                case TCION:
+                       down_read(&tty->termios_rwsem);
                        if (START_CHAR(tty) != __DISABLED_CHAR)
-                               return send_prio_char(tty, START_CHAR(tty));
+                               retval = tty_send_xchar(tty, START_CHAR(tty));
+                       up_read(&tty->termios_rwsem);
                        break;
                default:
                        return -EINVAL;
                }
-               return 0;
+               return retval;
        case TCFLSH:
                retval = tty_check_change(tty);
                if (retval)