Here are a few small tty/serial driver fixes for 4.4-rc2 that resolve
 some reported problems.
 
 All have been in linux-next, full details are in the shortlog below.
 
 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
 iEYEABECAAYFAlZSCjgACgkQMUfUDdst+yl4kQCgyYYsaVVUcG2i3HQUpio4CAJg
 EFQAn03Z0OD/EGNHKw7FtsICSgAhSatG
 =JRcn
 -----END PGP SIGNATURE-----

Merge tag 'tty-4.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty

Pull tty/serial fixes from Greg KH:
 "Here are a few small tty/serial driver fixes for 4.4-rc2 that resolve
  some reported problems.

  All have been in linux-next, full details are in the shortlog below"

* tag 'tty-4.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  serial: export fsl8250_handle_irq
  serial: 8250_mid: Add missing dependency
  tty: audit: Fix audit source
  serial: etraxfs-uart: Fix crash
  serial: fsl_lpuart: Fix earlycon support
  bcm63xx_uart: Use the device name when registering an interrupt
  tty: Fix direct use of tty buffer work
  tty: Fix tty_send_xchar() lock order inversion
This commit is contained in:
Linus Torvalds 2015-11-22 15:10:57 -08:00
Родитель 7f21739301 bd63acf9e9
Коммит dcfeda9d5f
11 изменённых файлов: 15 добавлений и 13 удалений

Просмотреть файл

@ -169,7 +169,7 @@ static inline int tty_copy_to_user(struct tty_struct *tty,
{ {
struct n_tty_data *ldata = tty->disc_data; struct n_tty_data *ldata = tty->disc_data;
tty_audit_add_data(tty, to, n, ldata->icanon); tty_audit_add_data(tty, from, n, ldata->icanon);
return copy_to_user(to, from, n); return copy_to_user(to, from, n);
} }

Просмотреть файл

@ -60,3 +60,4 @@ int fsl8250_handle_irq(struct uart_port *port)
spin_unlock_irqrestore(&up->port.lock, flags); spin_unlock_irqrestore(&up->port.lock, flags);
return 1; return 1;
} }
EXPORT_SYMBOL_GPL(fsl8250_handle_irq);

Просмотреть файл

@ -373,6 +373,7 @@ config SERIAL_8250_MID
depends on SERIAL_8250 && PCI depends on SERIAL_8250 && PCI
select HSU_DMA if SERIAL_8250_DMA select HSU_DMA if SERIAL_8250_DMA
select HSU_DMA_PCI if X86_INTEL_MID select HSU_DMA_PCI if X86_INTEL_MID
select RATIONAL
help help
Selecting this option will enable handling of the extra features Selecting this option will enable handling of the extra features
present on the UART found on Intel Medfield SOC and various other present on the UART found on Intel Medfield SOC and various other

Просмотреть файл

@ -1539,7 +1539,6 @@ config SERIAL_FSL_LPUART
tristate "Freescale lpuart serial port support" tristate "Freescale lpuart serial port support"
depends on HAS_DMA depends on HAS_DMA
select SERIAL_CORE select SERIAL_CORE
select SERIAL_EARLYCON
help help
Support for the on-chip lpuart on some Freescale SOCs. Support for the on-chip lpuart on some Freescale SOCs.
@ -1547,6 +1546,7 @@ config SERIAL_FSL_LPUART_CONSOLE
bool "Console on Freescale lpuart serial port" bool "Console on Freescale lpuart serial port"
depends on SERIAL_FSL_LPUART=y depends on SERIAL_FSL_LPUART=y
select SERIAL_CORE_CONSOLE select SERIAL_CORE_CONSOLE
select SERIAL_EARLYCON
help help
If you have enabled the lpuart serial port on the Freescale SoCs, If you have enabled the lpuart serial port on the Freescale SoCs,
you can make it the console by answering Y to this option. you can make it the console by answering Y to this option.

Просмотреть файл

@ -474,7 +474,7 @@ static int bcm_uart_startup(struct uart_port *port)
/* register irq and enable rx interrupts */ /* register irq and enable rx interrupts */
ret = request_irq(port->irq, bcm_uart_interrupt, 0, ret = request_irq(port->irq, bcm_uart_interrupt, 0,
bcm_uart_type(port), port); dev_name(port->dev), port);
if (ret) if (ret)
return ret; return ret;
bcm_uart_writel(port, UART_RX_INT_MASK, UART_IR_REG); bcm_uart_writel(port, UART_RX_INT_MASK, UART_IR_REG);

Просмотреть файл

@ -894,7 +894,7 @@ static int etraxfs_uart_probe(struct platform_device *pdev)
up->regi_ser = of_iomap(np, 0); up->regi_ser = of_iomap(np, 0);
up->port.dev = &pdev->dev; up->port.dev = &pdev->dev;
up->gpios = mctrl_gpio_init(&pdev->dev, 0); up->gpios = mctrl_gpio_init_noauto(&pdev->dev, 0);
if (IS_ERR(up->gpios)) if (IS_ERR(up->gpios))
return PTR_ERR(up->gpios); return PTR_ERR(up->gpios);

Просмотреть файл

@ -265,7 +265,7 @@ static struct tty_audit_buf *tty_audit_buf_get(struct tty_struct *tty,
* *
* Audit @data of @size from @tty, if necessary. * Audit @data of @size from @tty, if necessary.
*/ */
void tty_audit_add_data(struct tty_struct *tty, unsigned char *data, void tty_audit_add_data(struct tty_struct *tty, const void *data,
size_t size, unsigned icanon) size_t size, unsigned icanon)
{ {
struct tty_audit_buf *buf; struct tty_audit_buf *buf;

Просмотреть файл

@ -1282,18 +1282,22 @@ int tty_send_xchar(struct tty_struct *tty, char ch)
int was_stopped = tty->stopped; int was_stopped = tty->stopped;
if (tty->ops->send_xchar) { if (tty->ops->send_xchar) {
down_read(&tty->termios_rwsem);
tty->ops->send_xchar(tty, ch); tty->ops->send_xchar(tty, ch);
up_read(&tty->termios_rwsem);
return 0; return 0;
} }
if (tty_write_lock(tty, 0) < 0) if (tty_write_lock(tty, 0) < 0)
return -ERESTARTSYS; return -ERESTARTSYS;
down_read(&tty->termios_rwsem);
if (was_stopped) if (was_stopped)
start_tty(tty); start_tty(tty);
tty->ops->write(tty, &ch, 1); tty->ops->write(tty, &ch, 1);
if (was_stopped) if (was_stopped)
stop_tty(tty); stop_tty(tty);
up_read(&tty->termios_rwsem);
tty_write_unlock(tty); tty_write_unlock(tty);
return 0; return 0;
} }

Просмотреть файл

@ -1147,16 +1147,12 @@ int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
spin_unlock_irq(&tty->flow_lock); spin_unlock_irq(&tty->flow_lock);
break; break;
case TCIOFF: case TCIOFF:
down_read(&tty->termios_rwsem);
if (STOP_CHAR(tty) != __DISABLED_CHAR) if (STOP_CHAR(tty) != __DISABLED_CHAR)
retval = tty_send_xchar(tty, STOP_CHAR(tty)); retval = tty_send_xchar(tty, STOP_CHAR(tty));
up_read(&tty->termios_rwsem);
break; break;
case TCION: case TCION:
down_read(&tty->termios_rwsem);
if (START_CHAR(tty) != __DISABLED_CHAR) if (START_CHAR(tty) != __DISABLED_CHAR)
retval = tty_send_xchar(tty, START_CHAR(tty)); retval = tty_send_xchar(tty, START_CHAR(tty));
up_read(&tty->termios_rwsem);
break; break;
default: default:
return -EINVAL; return -EINVAL;

Просмотреть файл

@ -592,7 +592,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
/* Restart the work queue in case no characters kick it off. Safe if /* Restart the work queue in case no characters kick it off. Safe if
already running */ already running */
schedule_work(&tty->port->buf.work); tty_buffer_restart_work(tty->port);
tty_unlock(tty); tty_unlock(tty);
return retval; return retval;

Просмотреть файл

@ -607,7 +607,7 @@ extern void n_tty_inherit_ops(struct tty_ldisc_ops *ops);
/* tty_audit.c */ /* tty_audit.c */
#ifdef CONFIG_AUDIT #ifdef CONFIG_AUDIT
extern void tty_audit_add_data(struct tty_struct *tty, unsigned char *data, extern void tty_audit_add_data(struct tty_struct *tty, const void *data,
size_t size, unsigned icanon); size_t size, unsigned icanon);
extern void tty_audit_exit(void); extern void tty_audit_exit(void);
extern void tty_audit_fork(struct signal_struct *sig); extern void tty_audit_fork(struct signal_struct *sig);
@ -615,8 +615,8 @@ extern void tty_audit_tiocsti(struct tty_struct *tty, char ch);
extern void tty_audit_push(struct tty_struct *tty); extern void tty_audit_push(struct tty_struct *tty);
extern int tty_audit_push_current(void); extern int tty_audit_push_current(void);
#else #else
static inline void tty_audit_add_data(struct tty_struct *tty, static inline void tty_audit_add_data(struct tty_struct *tty, const void *data,
unsigned char *data, size_t size, unsigned icanon) size_t size, unsigned icanon)
{ {
} }
static inline void tty_audit_tiocsti(struct tty_struct *tty, char ch) static inline void tty_audit_tiocsti(struct tty_struct *tty, char ch)