}
 }
 
-static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
-                             char *fp, int count)
-{
-       int room, n;
-
-       down_read(&tty->termios_rwsem);
-
-       while (1) {
-               room = receive_room(tty);
-               n = min(count, room);
-               if (!n)
-                       break;
-               __receive_buf(tty, cp, fp, n);
-               cp += n;
-               if (fp)
-                       fp += n;
-               count -= n;
-       }
-
-       tty->receive_room = room;
-       n_tty_check_throttle(tty);
-       up_read(&tty->termios_rwsem);
-}
-
-static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,
-                             char *fp, int count)
+static int
+n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp,
+                        char *fp, int count, int flow)
 {
        struct n_tty_data *ldata = tty->disc_data;
        int room, n, rcvd = 0;
                room = receive_room(tty);
                n = min(count, room);
                if (!n) {
-                       if (!room)
+                       if (flow && !room)
                                ldata->no_room = 1;
                        break;
                }
        return rcvd;
 }
 
+static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
+                             char *fp, int count)
+{
+       n_tty_receive_buf_common(tty, cp, fp, count, 0);
+}
+
+static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,
+                             char *fp, int count)
+{
+       return n_tty_receive_buf_common(tty, cp, fp, count, 1);
+}
+
 int is_ignored(int sig)
 {
        return (sigismember(¤t->blocked, sig) ||