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

Commit f309532b authored by Linus Torvalds's avatar Linus Torvalds
Browse files

tty: Revert the tty locking series, it needs more work



This reverts the tty layer change to use per-tty locking, because it's
not correct yet, and fixing it will require some more deep surgery.

The main revert is d29f3ef3 ("tty_lock: Localise the lock"), but
there are several smaller commits that built upon it, they also get
reverted here. The list of reverted commits is:

  fde86d31 - tty: add lockdep annotations
  8f6576ad - tty: fix ldisc lock inversion trace
  d3ca8b64 - pty: Fix lock inversion
  b1d679af - tty: drop the pty lock during hangup
  abcefe5f - tty/amiserial: Add missing argument for tty_unlock()
  fd11b42e - cris: fix missing tty arg in wait_event_interruptible_tty call
  d29f3ef3 - tty_lock: Localise the lock

The revert had a trivial conflict in the 68360serial.c staging driver
that got removed in the meantime.

Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 233e562e
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -1033,7 +1033,7 @@ static int get_serial_info(struct tty_struct *tty, struct serial_state *state,
	if (!retinfo)
		return -EFAULT;
	memset(&tmp, 0, sizeof(tmp));
	tty_lock(tty);
	tty_lock();
	tmp.line = tty->index;
	tmp.port = state->port;
	tmp.flags = state->tport.flags;
@@ -1042,7 +1042,7 @@ static int get_serial_info(struct tty_struct *tty, struct serial_state *state,
	tmp.close_delay = state->tport.close_delay;
	tmp.closing_wait = state->tport.closing_wait;
	tmp.custom_divisor = state->custom_divisor;
	tty_unlock(tty);
	tty_unlock();
	if (copy_to_user(retinfo,&tmp,sizeof(*retinfo)))
		return -EFAULT;
	return 0;
@@ -1059,12 +1059,12 @@ static int set_serial_info(struct tty_struct *tty, struct serial_state *state,
	if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
		return -EFAULT;

	tty_lock(tty);
	tty_lock();
	change_spd = ((new_serial.flags ^ port->flags) & ASYNC_SPD_MASK) ||
		new_serial.custom_divisor != state->custom_divisor;
	if (new_serial.irq || new_serial.port != state->port ||
			new_serial.xmit_fifo_size != state->xmit_fifo_size) {
		tty_unlock(tty);
		tty_unlock();
		return -EINVAL;
	}
  
@@ -1074,7 +1074,7 @@ static int set_serial_info(struct tty_struct *tty, struct serial_state *state,
		    (new_serial.xmit_fifo_size != state->xmit_fifo_size) ||
		    ((new_serial.flags & ~ASYNC_USR_MASK) !=
		     (port->flags & ~ASYNC_USR_MASK))) {
			tty_unlock(tty);
			tty_unlock();
			return -EPERM;
		}
		port->flags = ((port->flags & ~ASYNC_USR_MASK) |
@@ -1084,7 +1084,7 @@ static int set_serial_info(struct tty_struct *tty, struct serial_state *state,
	}

	if (new_serial.baud_base < 9600) {
		tty_unlock(tty);
		tty_unlock();
		return -EINVAL;
	}

@@ -1116,7 +1116,7 @@ check_and_exit:
		}
	} else
		retval = startup(tty, state);
	tty_unlock(tty);
	tty_unlock();
	return retval;
}

+1 −1
Original line number Diff line number Diff line
@@ -1599,7 +1599,7 @@ static int cy_open(struct tty_struct *tty, struct file *filp)
	 * If the port is the middle of closing, bail out now
	 */
	if (tty_hung_up_p(filp) || (info->port.flags & ASYNC_CLOSING)) {
		wait_event_interruptible_tty(tty, info->port.close_wait,
		wait_event_interruptible_tty(info->port.close_wait,
				!(info->port.flags & ASYNC_CLOSING));
		return (info->port.flags & ASYNC_HUP_NOTIFY) ? -EAGAIN: -ERESTARTSYS;
	}
+5 −6
Original line number Diff line number Diff line
@@ -1065,8 +1065,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file,

	TRACE_L("read()");

	/* FIXME: should use a private lock */
	tty_lock(tty);
	tty_lock();

	pClient = findClient(pInfo, task_pid(current));
	if (pClient) {
@@ -1078,7 +1077,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file,
				goto unlock;
			}
			/* block until there is a message: */
			wait_event_interruptible_tty(tty, pInfo->read_wait,
			wait_event_interruptible_tty(pInfo->read_wait,
					(pMsg = remove_msg(pInfo, pClient)));
		}

@@ -1108,7 +1107,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file,
	}
	ret = -EPERM;
unlock:
	tty_unlock(tty);
	tty_unlock();
	return ret;
}

@@ -1157,7 +1156,7 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file,
	pHeader->locks = 0;
	pHeader->owner = NULL;

	tty_lock(tty);
	tty_lock();

	pClient = findClient(pInfo, task_pid(current));
	if (pClient) {
@@ -1176,7 +1175,7 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file,
	add_tx_queue(pInfo, pHeader);
	trigger_transmit(pInfo);

	tty_unlock(tty);
	tty_unlock();

	return 0;
}
+11 −14
Original line number Diff line number Diff line
@@ -47,7 +47,6 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
	wake_up_interruptible(&tty->read_wait);
	wake_up_interruptible(&tty->write_wait);
	tty->packet = 0;
	/* Review - krefs on tty_link ?? */
	if (!tty->link)
		return;
	tty->link->packet = 0;
@@ -63,9 +62,9 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
		        mutex_unlock(&devpts_mutex);
		}
#endif
		tty_unlock(tty);
		tty_unlock();
		tty_vhangup(tty->link);
		tty_lock(tty);
		tty_lock();
	}
}

@@ -623,27 +622,26 @@ static int ptmx_open(struct inode *inode, struct file *filp)
		return retval;

	/* find a device that is not in use. */
	mutex_lock(&devpts_mutex);
	tty_lock();
	index = devpts_new_index(inode);
	tty_unlock();
	if (index < 0) {
		retval = index;
		goto err_file;
	}

	mutex_unlock(&devpts_mutex);

	mutex_lock(&tty_mutex);
	mutex_lock(&devpts_mutex);
	tty = tty_init_dev(ptm_driver, index);
	mutex_unlock(&devpts_mutex);
	tty_lock();
	mutex_unlock(&tty_mutex);

	if (IS_ERR(tty)) {
		retval = PTR_ERR(tty);
		goto out;
	}

	/* The tty returned here is locked so we can safely
	   drop the mutex */
	mutex_unlock(&tty_mutex);

	set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */

	tty_add_file(tty, filp);
@@ -656,17 +654,16 @@ static int ptmx_open(struct inode *inode, struct file *filp)
	if (retval)
		goto err_release;

	tty_unlock(tty);
	tty_unlock();
	return 0;
err_release:
	tty_unlock(tty);
	tty_unlock();
	tty_release(inode, filp);
	return retval;
out:
	mutex_unlock(&tty_mutex);
	devpts_kill_index(inode, index);
	tty_unlock();
err_file:
        mutex_unlock(&devpts_mutex);
	tty_free_file(filp);
	return retval;
}
+4 −4
Original line number Diff line number Diff line
@@ -3976,7 +3976,7 @@ block_til_ready(struct tty_struct *tty, struct file * filp,
	 */
	if (tty_hung_up_p(filp) ||
	    (info->flags & ASYNC_CLOSING)) {
		wait_event_interruptible_tty(tty, info->close_wait,
		wait_event_interruptible_tty(info->close_wait,
			!(info->flags & ASYNC_CLOSING));
#ifdef SERIAL_DO_RESTART
		if (info->flags & ASYNC_HUP_NOTIFY)
@@ -4052,9 +4052,9 @@ block_til_ready(struct tty_struct *tty, struct file * filp,
		printk("block_til_ready blocking: ttyS%d, count = %d\n",
		       info->line, info->count);
#endif
		tty_unlock(tty);
		tty_unlock();
		schedule();
		tty_lock(tty);
		tty_lock();
	}
	set_current_state(TASK_RUNNING);
	remove_wait_queue(&info->open_wait, &wait);
@@ -4115,7 +4115,7 @@ rs_open(struct tty_struct *tty, struct file * filp)
	 */
	if (tty_hung_up_p(filp) ||
	    (info->flags & ASYNC_CLOSING)) {
		wait_event_interruptible_tty(tty, info->close_wait,
		wait_event_interruptible_tty(info->close_wait,
			!(info->flags & ASYNC_CLOSING));
#ifdef SERIAL_DO_RESTART
		return ((info->flags & ASYNC_HUP_NOTIFY) ?
Loading