diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-23 12:23:20 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-23 12:23:20 -0700 | 
| commit | 99dff5856220a02b8711f2e8746413ea6e53ccf6 (patch) | |
| tree | d8bae7ccdf8f7ad5221b053bb74a6220df996b3a /drivers/tty/tty_io.c | |
| parent | bb74e8ca352eecefdc5c1a9ebab01f18aa2f6f3c (diff) | |
| parent | d9a0fbfd7bc5d2c42f0fa9bcbdab62c4942d0388 (diff) | |
| download | olio-linux-3.10-99dff5856220a02b8711f2e8746413ea6e53ccf6.tar.xz olio-linux-3.10-99dff5856220a02b8711f2e8746413ea6e53ccf6.zip  | |
Merge branch 'tty-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6
* 'tty-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6: (48 commits)
  serial: 8250_pci: add support for Cronyx Omega PCI multiserial board.
  tty/serial: Fix break handling for PORT_TEGRA
  tty/serial: Add explicit PORT_TEGRA type
  n_tracerouter and n_tracesink ldisc additions.
  Intel PTI implementaiton of MIPI 1149.7.
  Kernel documentation for the PTI feature.
  export kernel call get_task_comm().
  tty: Remove to support serial for S5P6442
  pch_phub: Support new device ML7223
  8250_pci: Add support for the Digi/IBM PCIe 2-port Adapter
  ASoC: Update cx20442 for TTY API change
  pch_uart: Support new device ML7223 IOH
  parport: Use request_muxed_region for IT87 probe and lock
  tty/serial: add support for Xilinx PS UART
  n_gsm: Use print_hex_dump_bytes
  drivers/tty/moxa.c: Put correct tty value
  TTY: tty_io, annotate locking functions
  TTY: serial_core, remove superfluous set_task_state
  TTY: serial_core, remove invalid test
  Char: moxa, fix locking in moxa_write
  ...
Fix up trivial conflicts in drivers/bluetooth/hci_ldisc.c and
drivers/tty/serial/Makefile.
I did the hci_ldisc thing as an evil merge, cleaning things up.
Diffstat (limited to 'drivers/tty/tty_io.c')
| -rw-r--r-- | drivers/tty/tty_io.c | 53 | 
1 files changed, 34 insertions, 19 deletions
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index d7d50b48287..6556f7452ba 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -1,6 +1,4 @@  /* - *  linux/drivers/char/tty_io.c - *   *  Copyright (C) 1991, 1992  Linus Torvalds   */ @@ -964,12 +962,14 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count,  }  void tty_write_unlock(struct tty_struct *tty) +	__releases(&tty->atomic_write_lock)  {  	mutex_unlock(&tty->atomic_write_lock);  	wake_up_interruptible_poll(&tty->write_wait, POLLOUT);  }  int tty_write_lock(struct tty_struct *tty, int ndelay) +	__acquires(&tty->atomic_write_lock)  {  	if (!mutex_trylock(&tty->atomic_write_lock)) {  		if (ndelay) @@ -1391,16 +1391,15 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,  		return ERR_PTR(-ENODEV);  	tty = alloc_tty_struct(); -	if (!tty) -		goto fail_no_mem; +	if (!tty) { +		retval = -ENOMEM; +		goto err_module_put; +	}  	initialize_tty_struct(tty, driver, idx);  	retval = tty_driver_install_tty(driver, tty); -	if (retval < 0) { -		free_tty_struct(tty); -		module_put(driver->owner); -		return ERR_PTR(retval); -	} +	if (retval < 0) +		goto err_deinit_tty;  	/*  	 * Structures all installed ... call the ldisc open routines. @@ -1409,15 +1408,18 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,  	 */  	retval = tty_ldisc_setup(tty, tty->link);  	if (retval) -		goto release_mem_out; +		goto err_release_tty;  	return tty; -fail_no_mem: +err_deinit_tty: +	deinitialize_tty_struct(tty); +	free_tty_struct(tty); +err_module_put:  	module_put(driver->owner); -	return ERR_PTR(-ENOMEM); +	return ERR_PTR(retval);  	/* call the tty release_tty routine to clean out this slot */ -release_mem_out: +err_release_tty:  	if (printk_ratelimit())  		printk(KERN_INFO "tty_init_dev: ldisc open failed, "  				 "clearing slot %d\n", idx); @@ -1892,6 +1894,7 @@ got_driver:  	retval = tty_add_file(tty, filp);  	if (retval) {  		tty_unlock(); +		tty_release(inode, filp);  		return retval;  	} @@ -1902,12 +1905,10 @@ got_driver:  #ifdef TTY_DEBUG_HANGUP  	printk(KERN_DEBUG "opening %s...", tty->name);  #endif -	if (!retval) { -		if (tty->ops->open) -			retval = tty->ops->open(tty, filp); -		else -			retval = -ENODEV; -	} +	if (tty->ops->open) +		retval = tty->ops->open(tty, filp); +	else +		retval = -ENODEV;  	filp->f_flags = saved_flags;  	if (!retval && test_bit(TTY_EXCLUSIVE, &tty->flags) && @@ -2888,6 +2889,20 @@ void initialize_tty_struct(struct tty_struct *tty,  }  /** + *	deinitialize_tty_struct + *	@tty: tty to deinitialize + * + *	This subroutine deinitializes a tty structure that has been newly + *	allocated but tty_release cannot be called on that yet. + * + *	Locking: none - tty in question must not be exposed at this point + */ +void deinitialize_tty_struct(struct tty_struct *tty) +{ +	tty_ldisc_deinit(tty); +} + +/**   *	tty_put_char	-	write one character to a tty   *	@tty: tty   *	@ch: character  |