Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ffb6a445 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull UML fixes from Richard Weinberger:
 "This update brings various fixes.
  Nothing special...

  In my local queue I have some more fixes which will be sent later to
  you.  3.9 uncovered strange UML issues.  :("

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml:
  um: Use tty_port in SIGWINCH handler
  um: Use tty_port_operations->destruct
  um: fix build failure due to mess-up of sig_info protorype
  um: add missing declaration of 'getrlimit()' and friends
  net : enable tx time stamping in the vde driver.
  hostfs: fix a not needed double check
parents 152fcb27 2116bda6
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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 int console_open_chan(struct line *line, struct console *co);
extern void deactivate_chan(struct chan *chan, int irq);
extern void deactivate_chan(struct chan *chan, int irq);
extern void reactivate_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 int enable_chan(struct line *line);
extern void close_chan(struct line *line);
extern void close_chan(struct line *line);
extern int chan_window_size(struct line *line, 
extern int chan_window_size(struct line *line, 
+2 −2
Original line number Original line Diff line number Diff line
@@ -122,10 +122,10 @@ static int open_chan(struct list_head *chans)
	return err;
	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)
	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)
static void line_timer_cb(struct work_struct *work)
+6 −6
Original line number Original line Diff line number Diff line
@@ -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)
		       unsigned long *stack_out)
{
{
	struct winch_data data;
	struct winch_data data;
@@ -271,7 +271,7 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out,
	return err;
	return err;
}
}


void register_winch(int fd, struct tty_struct *tty)
void register_winch(int fd, struct tty_port *port)
{
{
	unsigned long stack;
	unsigned long stack;
	int pid, thread, count, thread_fd = -1;
	int pid, thread, count, thread_fd = -1;
@@ -281,17 +281,17 @@ void register_winch(int fd, struct tty_struct *tty)
		return;
		return;


	pid = tcgetpgrp(fd);
	pid = tcgetpgrp(fd);
	if (is_skas_winch(pid, fd, tty)) {
	if (is_skas_winch(pid, fd, port)) {
		register_winch_irq(-1, fd, -1, tty, 0);
		register_winch_irq(-1, fd, -1, port, 0);
		return;
		return;
	}
	}


	if (pid == -1) {
	if (pid == -1) {
		thread = winch_tramp(fd, tty, &thread_fd, &stack);
		thread = winch_tramp(fd, port, &thread_fd, &stack);
		if (thread < 0)
		if (thread < 0)
			return;
			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));
		count = write(thread_fd, &c, sizeof(c));
		if (count != sizeof(c))
		if (count != sizeof(c))
+3 −3
Original line number Original line Diff line number Diff line
@@ -38,10 +38,10 @@ extern int generic_window_size(int fd, void *unused, unsigned short *rows_out,
			       unsigned short *cols_out);
			       unsigned short *cols_out);
extern void generic_free(void *data);
extern void generic_free(void *data);


struct tty_struct;
struct tty_port;
extern void register_winch(int fd,  struct tty_struct *tty);
extern void register_winch(int fd,  struct tty_port *port);
extern void register_winch_irq(int fd, int tty_fd, int pid,
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) \
#define __channel_help(fn, prefix) \
__uml_help(fn, prefix "[0-9]*=<channel description>\n" \
__uml_help(fn, prefix "[0-9]*=<channel description>\n" \
+24 −18
Original line number Original line Diff line number Diff line
@@ -305,7 +305,7 @@ static int line_activate(struct tty_port *port, struct tty_struct *tty)
		return ret;
		return ret;


	if (!line->sigio) {
	if (!line->sigio) {
		chan_enable_winch(line->chan_out, tty);
		chan_enable_winch(line->chan_out, port);
		line->sigio = 1;
		line->sigio = 1;
	}
	}


@@ -315,8 +315,22 @@ static int line_activate(struct tty_port *port, struct tty_struct *tty)
	return 0;
	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 = {
static const struct tty_port_operations line_port_ops = {
	.activate = line_activate,
	.activate = line_activate,
	.destruct = line_destruct,
};
};


int line_open(struct tty_struct *tty, struct file *filp)
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;
	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)
void line_close(struct tty_struct *tty, struct file * filp)
{
{
	struct line *line = tty->driver_data;
	struct line *line = tty->driver_data;
@@ -601,7 +603,7 @@ struct winch {
	int fd;
	int fd;
	int tty_fd;
	int tty_fd;
	int pid;
	int pid;
	struct tty_struct *tty;
	struct tty_port *port;
	unsigned long stack;
	unsigned long stack;
	struct work_struct work;
	struct work_struct work;
};
};
@@ -655,7 +657,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)
			goto out;
			goto out;
		}
		}
	}
	}
	tty = winch->tty;
	tty = tty_port_tty_get(winch->port);
	if (tty != NULL) {
	if (tty != NULL) {
		line = tty->driver_data;
		line = tty->driver_data;
		if (line != NULL) {
		if (line != NULL) {
@@ -663,6 +665,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)
					 &tty->winsize.ws_col);
					 &tty->winsize.ws_col);
			kill_pgrp(tty->pgrp, SIGWINCH, 1);
			kill_pgrp(tty->pgrp, SIGWINCH, 1);
		}
		}
		tty_kref_put(tty);
	}
	}
 out:
 out:
	if (winch->fd != -1)
	if (winch->fd != -1)
@@ -670,7 +673,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)
	return IRQ_HANDLED;
	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)
			unsigned long stack)
{
{
	struct winch *winch;
	struct winch *winch;
@@ -685,7 +688,7 @@ void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty,
				   .fd  	= fd,
				   .fd  	= fd,
				   .tty_fd 	= tty_fd,
				   .tty_fd 	= tty_fd,
				   .pid  	= pid,
				   .pid  	= pid,
				   .tty 	= tty,
				   .port 	= port,
				   .stack	= stack });
				   .stack	= stack });


	if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt,
	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 list_head *ele, *next;
	struct winch *winch;
	struct winch *winch;
	struct tty_struct *wtty;


	spin_lock(&winch_handler_lock);
	spin_lock(&winch_handler_lock);


	list_for_each_safe(ele, next, &winch_handlers) {
	list_for_each_safe(ele, next, &winch_handlers) {
		winch = list_entry(ele, struct winch, list);
		winch = list_entry(ele, struct winch, list);
		if (winch->tty == tty) {
		wtty = tty_port_tty_get(winch->port);
		if (wtty == tty) {
			free_winch(winch);
			free_winch(winch);
			break;
			break;
		}
		}
		tty_kref_put(wtty);
	}
	}
	spin_unlock(&winch_handler_lock);
	spin_unlock(&winch_handler_lock);
}
}
Loading