Revert "tty: hvc: Fix data abort due to race in hvc_open"
commitcf9c94456e
upstream. This reverts commite2bd1dcbe1
. In discussion on the mailing list, it has been determined that this is not the correct type of fix for this issue. Revert it so that we can do this correctly. Reported-by: Jiri Slaby <jslaby@suse.cz> Reported-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://lore.kernel.org/r/20200428032601.22127-1-rananta@codeaurora.org Cc: Raghavendra Rao Ananta <rananta@codeaurora.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
ffd40b7962
commit
a160afebd7
|
@ -75,8 +75,6 @@ static LIST_HEAD(hvc_structs);
|
||||||
*/
|
*/
|
||||||
static DEFINE_MUTEX(hvc_structs_mutex);
|
static DEFINE_MUTEX(hvc_structs_mutex);
|
||||||
|
|
||||||
/* Mutex to serialize hvc_open */
|
|
||||||
static DEFINE_MUTEX(hvc_open_mutex);
|
|
||||||
/*
|
/*
|
||||||
* This value is used to assign a tty->index value to a hvc_struct based
|
* This value is used to assign a tty->index value to a hvc_struct based
|
||||||
* upon order of exposure via hvc_probe(), when we can not match it to
|
* upon order of exposure via hvc_probe(), when we can not match it to
|
||||||
|
@ -348,24 +346,16 @@ static int hvc_install(struct tty_driver *driver, struct tty_struct *tty)
|
||||||
*/
|
*/
|
||||||
static int hvc_open(struct tty_struct *tty, struct file * filp)
|
static int hvc_open(struct tty_struct *tty, struct file * filp)
|
||||||
{
|
{
|
||||||
struct hvc_struct *hp;
|
struct hvc_struct *hp = tty->driver_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
mutex_lock(&hvc_open_mutex);
|
|
||||||
|
|
||||||
hp = tty->driver_data;
|
|
||||||
if (!hp) {
|
|
||||||
rc = -EIO;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock_irqsave(&hp->port.lock, flags);
|
spin_lock_irqsave(&hp->port.lock, flags);
|
||||||
/* Check and then increment for fast path open. */
|
/* Check and then increment for fast path open. */
|
||||||
if (hp->port.count++ > 0) {
|
if (hp->port.count++ > 0) {
|
||||||
spin_unlock_irqrestore(&hp->port.lock, flags);
|
spin_unlock_irqrestore(&hp->port.lock, flags);
|
||||||
hvc_kick();
|
hvc_kick();
|
||||||
goto out;
|
return 0;
|
||||||
} /* else count == 0 */
|
} /* else count == 0 */
|
||||||
spin_unlock_irqrestore(&hp->port.lock, flags);
|
spin_unlock_irqrestore(&hp->port.lock, flags);
|
||||||
|
|
||||||
|
@ -393,8 +383,6 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)
|
||||||
/* Force wakeup of the polling thread */
|
/* Force wakeup of the polling thread */
|
||||||
hvc_kick();
|
hvc_kick();
|
||||||
|
|
||||||
out:
|
|
||||||
mutex_unlock(&hvc_open_mutex);
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue