diff options
Diffstat (limited to 'arch/um/drivers')
| -rw-r--r-- | arch/um/drivers/chan.h | 2 | ||||
| -rw-r--r-- | arch/um/drivers/chan_kern.c | 4 | ||||
| -rw-r--r-- | arch/um/drivers/chan_user.c | 12 | ||||
| -rw-r--r-- | arch/um/drivers/chan_user.h | 6 | ||||
| -rw-r--r-- | arch/um/drivers/line.c | 42 | ||||
| -rw-r--r-- | arch/um/drivers/net_kern.c | 2 | ||||
| -rw-r--r-- | arch/um/drivers/ssl.c | 1 | ||||
| -rw-r--r-- | arch/um/drivers/stdio_console.c | 1 | 
8 files changed, 38 insertions, 32 deletions
| diff --git a/arch/um/drivers/chan.h b/arch/um/drivers/chan.h index 78f1b899996..c512b0306dd 100644 --- a/arch/um/drivers/chan.h +++ b/arch/um/drivers/chan.h @@ -37,7 +37,7 @@ extern int console_write_chan(struct chan *chan, const char *buf,  extern int console_open_chan(struct line *line, struct console *co);  extern void deactivate_chan(struct chan *chan, int irq);  extern void reactivate_chan(struct chan *chan, int irq); -extern void chan_enable_winch(struct chan *chan, struct tty_struct *tty); +extern void chan_enable_winch(struct chan *chan, struct tty_port *port);  extern int enable_chan(struct line *line);  extern void close_chan(struct line *line);  extern int chan_window_size(struct line *line,  diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c index 15c553c239a..80b47cb71e0 100644 --- a/arch/um/drivers/chan_kern.c +++ b/arch/um/drivers/chan_kern.c @@ -122,10 +122,10 @@ static int open_chan(struct list_head *chans)  	return err;  } -void chan_enable_winch(struct chan *chan, struct tty_struct *tty) +void chan_enable_winch(struct chan *chan, struct tty_port *port)  {  	if (chan && chan->primary && chan->ops->winch) -		register_winch(chan->fd, tty); +		register_winch(chan->fd, port);  }  static void line_timer_cb(struct work_struct *work) diff --git a/arch/um/drivers/chan_user.c b/arch/um/drivers/chan_user.c index 9be670ad23b..3fd7c3efdb1 100644 --- a/arch/um/drivers/chan_user.c +++ b/arch/um/drivers/chan_user.c @@ -216,7 +216,7 @@ static int winch_thread(void *arg)  	}  } -static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out, +static int winch_tramp(int fd, struct tty_port *port, int *fd_out,  		       unsigned long *stack_out)  {  	struct winch_data data; @@ -271,7 +271,7 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out,  	return err;  } -void register_winch(int fd, struct tty_struct *tty) +void register_winch(int fd, struct tty_port *port)  {  	unsigned long stack;  	int pid, thread, count, thread_fd = -1; @@ -281,17 +281,17 @@ void register_winch(int fd, struct tty_struct *tty)  		return;  	pid = tcgetpgrp(fd); -	if (is_skas_winch(pid, fd, tty)) { -		register_winch_irq(-1, fd, -1, tty, 0); +	if (is_skas_winch(pid, fd, port)) { +		register_winch_irq(-1, fd, -1, port, 0);  		return;  	}  	if (pid == -1) { -		thread = winch_tramp(fd, tty, &thread_fd, &stack); +		thread = winch_tramp(fd, port, &thread_fd, &stack);  		if (thread < 0)  			return; -		register_winch_irq(thread_fd, fd, thread, tty, stack); +		register_winch_irq(thread_fd, fd, thread, port, stack);  		count = write(thread_fd, &c, sizeof(c));  		if (count != sizeof(c)) diff --git a/arch/um/drivers/chan_user.h b/arch/um/drivers/chan_user.h index dc693298eb8..03f1b565c5f 100644 --- a/arch/um/drivers/chan_user.h +++ b/arch/um/drivers/chan_user.h @@ -38,10 +38,10 @@ extern int generic_window_size(int fd, void *unused, unsigned short *rows_out,  			       unsigned short *cols_out);  extern void generic_free(void *data); -struct tty_struct; -extern void register_winch(int fd,  struct tty_struct *tty); +struct tty_port; +extern void register_winch(int fd,  struct tty_port *port);  extern void register_winch_irq(int fd, int tty_fd, int pid, -			       struct tty_struct *tty, unsigned long stack); +			       struct tty_port *port, unsigned long stack);  #define __channel_help(fn, prefix) \  __uml_help(fn, prefix "[0-9]*=<channel description>\n" \ diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c index f1b38571f94..be541cf69fd 100644 --- a/arch/um/drivers/line.c +++ b/arch/um/drivers/line.c @@ -305,7 +305,7 @@ static int line_activate(struct tty_port *port, struct tty_struct *tty)  		return ret;  	if (!line->sigio) { -		chan_enable_winch(line->chan_out, tty); +		chan_enable_winch(line->chan_out, port);  		line->sigio = 1;  	} @@ -315,8 +315,22 @@ static int line_activate(struct tty_port *port, struct tty_struct *tty)  	return 0;  } +static void unregister_winch(struct tty_struct *tty); + +static void line_destruct(struct tty_port *port) +{ +	struct tty_struct *tty = tty_port_tty_get(port); +	struct line *line = tty->driver_data; + +	if (line->sigio) { +		unregister_winch(tty); +		line->sigio = 0; +	} +} +  static const struct tty_port_operations line_port_ops = {  	.activate = line_activate, +	.destruct = line_destruct,  };  int line_open(struct tty_struct *tty, struct file *filp) @@ -340,18 +354,6 @@ int line_install(struct tty_driver *driver, struct tty_struct *tty,  	return 0;  } -static void unregister_winch(struct tty_struct *tty); - -void line_cleanup(struct tty_struct *tty) -{ -	struct line *line = tty->driver_data; - -	if (line->sigio) { -		unregister_winch(tty); -		line->sigio = 0; -	} -} -  void line_close(struct tty_struct *tty, struct file * filp)  {  	struct line *line = tty->driver_data; @@ -601,7 +603,7 @@ struct winch {  	int fd;  	int tty_fd;  	int pid; -	struct tty_struct *tty; +	struct tty_port *port;  	unsigned long stack;  	struct work_struct work;  }; @@ -655,7 +657,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)  			goto out;  		}  	} -	tty = winch->tty; +	tty = tty_port_tty_get(winch->port);  	if (tty != NULL) {  		line = tty->driver_data;  		if (line != NULL) { @@ -663,6 +665,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)  					 &tty->winsize.ws_col);  			kill_pgrp(tty->pgrp, SIGWINCH, 1);  		} +		tty_kref_put(tty);  	}   out:  	if (winch->fd != -1) @@ -670,7 +673,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)  	return IRQ_HANDLED;  } -void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty, +void register_winch_irq(int fd, int tty_fd, int pid, struct tty_port *port,  			unsigned long stack)  {  	struct winch *winch; @@ -685,7 +688,7 @@ void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty,  				   .fd  	= fd,  				   .tty_fd 	= tty_fd,  				   .pid  	= pid, -				   .tty 	= tty, +				   .port 	= port,  				   .stack	= stack });  	if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt, @@ -714,15 +717,18 @@ static void unregister_winch(struct tty_struct *tty)  {  	struct list_head *ele, *next;  	struct winch *winch; +	struct tty_struct *wtty;  	spin_lock(&winch_handler_lock);  	list_for_each_safe(ele, next, &winch_handlers) {  		winch = list_entry(ele, struct winch, list); -		if (winch->tty == tty) { +		wtty = tty_port_tty_get(winch->port); +		if (wtty == tty) {  			free_winch(winch);  			break;  		} +		tty_kref_put(wtty);  	}  	spin_unlock(&winch_handler_lock);  } diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c index d8926c30362..39f186252e0 100644 --- a/arch/um/drivers/net_kern.c +++ b/arch/um/drivers/net_kern.c @@ -218,6 +218,7 @@ static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev)  	spin_lock_irqsave(&lp->lock, flags);  	len = (*lp->write)(lp->fd, skb, lp); +	skb_tx_timestamp(skb);  	if (len == skb->len) {  		dev->stats.tx_packets++; @@ -281,6 +282,7 @@ static void uml_net_get_drvinfo(struct net_device *dev,  static const struct ethtool_ops uml_net_ethtool_ops = {  	.get_drvinfo	= uml_net_get_drvinfo,  	.get_link	= ethtool_op_get_link, +	.get_ts_info	= ethtool_op_get_ts_info,  };  static void uml_net_user_timer_expire(unsigned long _conn) diff --git a/arch/um/drivers/ssl.c b/arch/um/drivers/ssl.c index 16fdd0a0f9d..b8d14fa5205 100644 --- a/arch/um/drivers/ssl.c +++ b/arch/um/drivers/ssl.c @@ -105,7 +105,6 @@ static const struct tty_operations ssl_ops = {  	.throttle 		= line_throttle,  	.unthrottle 		= line_unthrottle,  	.install		= ssl_install, -	.cleanup		= line_cleanup,  	.hangup			= line_hangup,  }; diff --git a/arch/um/drivers/stdio_console.c b/arch/um/drivers/stdio_console.c index 827777af3f6..7b361f36ca9 100644 --- a/arch/um/drivers/stdio_console.c +++ b/arch/um/drivers/stdio_console.c @@ -110,7 +110,6 @@ static const struct tty_operations console_ops = {  	.set_termios 		= line_set_termios,  	.throttle 		= line_throttle,  	.unthrottle 		= line_unthrottle, -	.cleanup		= line_cleanup,  	.hangup			= line_hangup,  }; |