|
@@ -601,6 +601,24 @@ extern long vt_compat_ioctl(struct tty_struct *tty,
|
|
|
extern void __lockfunc tty_lock(void) __acquires(tty_lock);
|
|
|
extern void __lockfunc tty_unlock(void) __releases(tty_lock);
|
|
|
|
|
|
+/*
|
|
|
+ * this shall be called only from where BTM is held (like close)
|
|
|
+ *
|
|
|
+ * We need this to ensure nobody waits for us to finish while we are waiting.
|
|
|
+ * Without this we were encountering system stalls.
|
|
|
+ *
|
|
|
+ * This should be indeed removed with BTM removal later.
|
|
|
+ *
|
|
|
+ * Locking: BTM required. Nobody is allowed to hold port->mutex.
|
|
|
+ */
|
|
|
+static inline void tty_wait_until_sent_from_close(struct tty_struct *tty,
|
|
|
+ long timeout)
|
|
|
+{
|
|
|
+ tty_unlock(); /* tty->ops->close holds the BTM, drop it while waiting */
|
|
|
+ tty_wait_until_sent(tty, timeout);
|
|
|
+ tty_lock();
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* wait_event_interruptible_tty -- wait for a condition with the tty lock held
|
|
|
*
|