To modify Ixia port numbers and IP in pod.yaml
[kvmfornfv.git] / kernel / drivers / tty / tty_ldisc.c
index 3737f55..9bee25c 100644 (file)
 #undef LDISC_DEBUG_HANGUP
 
 #ifdef LDISC_DEBUG_HANGUP
-#define tty_ldisc_debug(tty, f, args...) ({                                   \
-       char __b[64];                                                          \
-       printk(KERN_DEBUG "%s: %s: " f, __func__, tty_name(tty, __b), ##args); \
-})
+#define tty_ldisc_debug(tty, f, args...)       tty_debug(tty, f, ##args)
 #else
 #define tty_ldisc_debug(tty, f, args...)
 #endif
@@ -322,7 +319,7 @@ __tty_ldisc_lock_nested(struct tty_struct *tty, unsigned long timeout)
 
 static inline void __tty_ldisc_unlock(struct tty_struct *tty)
 {
-       return ldsem_up_write(&tty->ldisc_sem);
+       ldsem_up_write(&tty->ldisc_sem);
 }
 
 static int __lockfunc
@@ -420,6 +417,10 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush);
  *     they are not on hot paths so a little discipline won't do
  *     any harm.
  *
+ *     The line discipline-related tty_struct fields are reset to
+ *     prevent the ldisc driver from re-using stale information for
+ *     the new ldisc instance.
+ *
  *     Locking: takes termios_rwsem
  */
 
@@ -428,6 +429,9 @@ static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
        down_write(&tty->termios_rwsem);
        tty->termios.c_line = num;
        up_write(&tty->termios_rwsem);
+
+       tty->disc_data = NULL;
+       tty->receive_room = 0;
 }
 
 /**
@@ -450,6 +454,8 @@ static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
                ret = ld->ops->open(tty);
                if (ret)
                        clear_bit(TTY_LDISC_OPEN, &tty->flags);
+
+               tty_ldisc_debug(tty, "%p: opened\n", tty->ldisc);
                return ret;
        }
        return 0;
@@ -470,6 +476,7 @@ static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
        clear_bit(TTY_LDISC_OPEN, &tty->flags);
        if (ld->ops->close)
                ld->ops->close(tty);
+       tty_ldisc_debug(tty, "%p: closed\n", tty->ldisc);
 }
 
 /**
@@ -483,7 +490,6 @@ static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
 
 static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
 {
-       char buf[64];
        struct tty_ldisc *new_ldisc;
        int r;
 
@@ -504,7 +510,7 @@ static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
                if (r < 0)
                        panic("Couldn't open N_TTY ldisc for "
                              "%s --- error %d.",
-                             tty_name(tty, buf), r);
+                             tty_name(tty), r);
        }
 }
 
@@ -593,7 +599,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
 
        /* Restart the work queue in case no characters kick it off. Safe if
           already running */
-       schedule_work(&tty->port->buf.work);
+       tty_buffer_restart_work(tty->port);
 
        tty_unlock(tty);
        return retval;
@@ -664,7 +670,7 @@ void tty_ldisc_hangup(struct tty_struct *tty)
        int reset = tty->driver->flags & TTY_DRIVER_RESET_TERMIOS;
        int err = 0;
 
-       tty_ldisc_debug(tty, "closing ldisc: %p\n", tty->ldisc);
+       tty_ldisc_debug(tty, "%p: closing\n", tty->ldisc);
 
        ld = tty_ldisc_ref(tty);
        if (ld != NULL) {
@@ -714,7 +720,7 @@ void tty_ldisc_hangup(struct tty_struct *tty)
        if (reset)
                tty_reset_termios(tty);
 
-       tty_ldisc_debug(tty, "re-opened ldisc: %p\n", tty->ldisc);
+       tty_ldisc_debug(tty, "%p: re-opened\n", tty->ldisc);
 }
 
 /**
@@ -778,8 +784,6 @@ void tty_ldisc_release(struct tty_struct *tty)
         * it does not race with the set_ldisc code path.
         */
 
-       tty_ldisc_debug(tty, "closing ldisc: %p\n", tty->ldisc);
-
        tty_ldisc_lock_pair(tty, o_tty);
        tty_ldisc_kill(tty);
        if (o_tty)
@@ -789,7 +793,7 @@ void tty_ldisc_release(struct tty_struct *tty)
        /* And the memory resources remaining (buffers, termios) will be
           disposed of when the kref hits zero */
 
-       tty_ldisc_debug(tty, "ldisc closed\n");
+       tty_ldisc_debug(tty, "released\n");
 }
 
 /**