forked from mirrors/linux
		
	tty: Unify receive_buf() code paths
Instead of two distinct code branches for receive_buf() handling, use tty_ldisc_receive_buf() as the single code path. Signed-off-by: Peter Hurley <peter@hurleysoftware.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									f33798deec
								
							
						
					
					
						commit
						8d082cd300
					
				
					 2 changed files with 30 additions and 25 deletions
				
			
		| 
						 | 
					@ -435,25 +435,42 @@ int tty_prepare_flip_string(struct tty_port *port, unsigned char **chars,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
 | 
					EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 *	tty_ldisc_receive_buf		-	forward data to line discipline
 | 
				
			||||||
 | 
					 *	@ld:	line discipline to process input
 | 
				
			||||||
 | 
					 *	@p:	char buffer
 | 
				
			||||||
 | 
					 *	@f:	TTY_* flags buffer
 | 
				
			||||||
 | 
					 *	@count:	number of bytes to process
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Callers other than flush_to_ldisc() need to exclude the kworker
 | 
				
			||||||
 | 
					 *	from concurrent use of the line discipline, see paste_selection().
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Returns the number of bytes not processed
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int tty_ldisc_receive_buf(struct tty_ldisc *ld, unsigned char *p,
 | 
				
			||||||
 | 
								  char *f, int count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (ld->ops->receive_buf2)
 | 
				
			||||||
 | 
							count = ld->ops->receive_buf2(ld->tty, p, f, count);
 | 
				
			||||||
 | 
						else {
 | 
				
			||||||
 | 
							count = min_t(int, count, ld->tty->receive_room);
 | 
				
			||||||
 | 
							if (count && ld->ops->receive_buf)
 | 
				
			||||||
 | 
								ld->ops->receive_buf(ld->tty, p, f, count);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return count;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL_GPL(tty_ldisc_receive_buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count)
 | 
					receive_buf(struct tty_ldisc *ld, struct tty_buffer *head, int count)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct tty_ldisc *disc = tty->ldisc;
 | 
					 | 
				
			||||||
	unsigned char *p = char_buf_ptr(head, head->read);
 | 
						unsigned char *p = char_buf_ptr(head, head->read);
 | 
				
			||||||
	char	      *f = NULL;
 | 
						char	      *f = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (~head->flags & TTYB_NORMAL)
 | 
						if (~head->flags & TTYB_NORMAL)
 | 
				
			||||||
		f = flag_buf_ptr(head, head->read);
 | 
							f = flag_buf_ptr(head, head->read);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (disc->ops->receive_buf2)
 | 
						return tty_ldisc_receive_buf(ld, p, f, count);
 | 
				
			||||||
		count = disc->ops->receive_buf2(tty, p, f, count);
 | 
					 | 
				
			||||||
	else {
 | 
					 | 
				
			||||||
		count = min_t(int, count, tty->receive_room);
 | 
					 | 
				
			||||||
		if (count && disc->ops->receive_buf)
 | 
					 | 
				
			||||||
			disc->ops->receive_buf(tty, p, f, count);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return count;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -514,7 +531,7 @@ static void flush_to_ldisc(struct work_struct *work)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		count = receive_buf(tty, head, count);
 | 
							count = receive_buf(disc, head, count);
 | 
				
			||||||
		if (!count)
 | 
							if (!count)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		head->read += count;
 | 
							head->read += count;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -571,20 +571,8 @@ extern int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty);
 | 
				
			||||||
extern void tty_ldisc_release(struct tty_struct *tty);
 | 
					extern void tty_ldisc_release(struct tty_struct *tty);
 | 
				
			||||||
extern void tty_ldisc_init(struct tty_struct *tty);
 | 
					extern void tty_ldisc_init(struct tty_struct *tty);
 | 
				
			||||||
extern void tty_ldisc_deinit(struct tty_struct *tty);
 | 
					extern void tty_ldisc_deinit(struct tty_struct *tty);
 | 
				
			||||||
 | 
					extern int tty_ldisc_receive_buf(struct tty_ldisc *ld, unsigned char *p,
 | 
				
			||||||
static inline int tty_ldisc_receive_buf(struct tty_ldisc *ld, unsigned char *p,
 | 
									 char *f, int count);
 | 
				
			||||||
					char *f, int count)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (ld->ops->receive_buf2)
 | 
					 | 
				
			||||||
		count = ld->ops->receive_buf2(ld->tty, p, f, count);
 | 
					 | 
				
			||||||
	else {
 | 
					 | 
				
			||||||
		count = min_t(int, count, ld->tty->receive_room);
 | 
					 | 
				
			||||||
		if (count && ld->ops->receive_buf)
 | 
					 | 
				
			||||||
			ld->ops->receive_buf(ld->tty, p, f, count);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return count;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* n_tty.c */
 | 
					/* n_tty.c */
 | 
				
			||||||
extern void n_tty_inherit_ops(struct tty_ldisc_ops *ops);
 | 
					extern void n_tty_inherit_ops(struct tty_ldisc_ops *ops);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue