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

Commit 5552c28f authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds
Browse files

[PATCH] Fix locking error in esp



Noted by Al Viro.

Also remove unused tmp_buf

Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 30379440
Loading
Loading
Loading
Loading
+2 −20
Original line number Diff line number Diff line
@@ -150,17 +150,6 @@ static void rs_wait_until_sent(struct tty_struct *, int);
/* Standard COM flags (except for COM4, because of the 8514 problem) */
#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)

/*
 * tmp_buf is used as a temporary buffer by serial_write.  We need to
 * lock it in case the memcpy_fromfs blocks while swapping in a page,
 * and some other program tries to do a serial write at the same time.
 * Since the lock will only come under contention when the system is
 * swapping and available memory is low, it makes sense to share one
 * buffer across all the serial ports, since it significantly saves
 * memory if large numbers of serial ports are open.
 */
static unsigned char *tmp_buf;

static inline int serial_paranoia_check(struct esp_struct *info,
					char *name, const char *routine)
{
@@ -1267,7 +1256,7 @@ static int rs_write(struct tty_struct * tty,
	if (serial_paranoia_check(info, tty->name, "rs_write"))
		return 0;

	if (!tty || !info->xmit_buf || !tmp_buf)
	if (!tty || !info->xmit_buf)
		return 0;
	    
	while (1) {
@@ -2291,11 +2280,7 @@ static int esp_open(struct tty_struct *tty, struct file * filp)
	tty->driver_data = info;
	info->tty = tty;

	if (!tmp_buf) {
		tmp_buf = (unsigned char *) get_zeroed_page(GFP_KERNEL);
		if (!tmp_buf)
			return -ENOMEM;
	}
	spin_unlock_irqrestore(&info->lock, flags);
	
	/*
	 * Start up serial port
@@ -2602,9 +2587,6 @@ static void __exit espserial_exit(void)
		free_pages((unsigned long)dma_buffer,
			get_order(DMA_BUFFER_SZ));

	if (tmp_buf)
		free_page((unsigned long)tmp_buf);

	while (free_pio_buf) {
		pio_buf = free_pio_buf->next;
		kfree(free_pio_buf);