linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / char / n_tty.c
index 603b9ad..ccad7ae 100644 (file)
@@ -132,7 +132,7 @@ static void put_tty_queue(unsigned char c, struct tty_struct *tty)
  *     We test the TTY_THROTTLED bit first so that it always
  *     indicates the current state. The decision about whether
  *     it is worth allowing more input has been taken by the caller.
- *     Can sleep, may be called under the atomic_read_lock mutex but
+ *     Can sleep, may be called under the atomic_read semaphore but
  *     this is not guaranteed.
  */
  
@@ -1132,7 +1132,7 @@ static inline int input_available_p(struct tty_struct *tty, int amt)
  *     buffer, and once to drain the space from the (physical) beginning of
  *     the buffer to head pointer.
  *
- *     Called under the tty->atomic_read_lock sem
+ *     Called under the tty->atomic_read sem and with TTY_DONT_FLIP set
  *
  */
  
@@ -1262,15 +1262,16 @@ do_it_again:
         *      Internal serialization of reads.
         */
        if (file->f_flags & O_NONBLOCK) {
-               if (!mutex_trylock(&tty->atomic_read_lock))
+               if (down_trylock(&tty->atomic_read))
                        return -EAGAIN;
        }
        else {
-               if (mutex_lock_interruptible(&tty->atomic_read_lock))
+               if (down_interruptible(&tty->atomic_read))
                        return -ERESTARTSYS;
        }
 
        add_wait_queue(&tty->read_wait, &wait);
+       set_bit(TTY_DONT_FLIP, &tty->flags);
        while (nr) {
                /* First test for status change. */
                if (tty->packet && tty->link->ctrl_status) {
@@ -1314,7 +1315,9 @@ do_it_again:
                                break;
                        }
                        n_tty_set_room(tty);
+                       clear_bit(TTY_DONT_FLIP, &tty->flags);
                        timeout = schedule_timeout(timeout);
+                       set_bit(TTY_DONT_FLIP, &tty->flags);
                        continue;
                }
                __set_current_state(TASK_RUNNING);
@@ -1381,17 +1384,16 @@ do_it_again:
                 * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode,
                 * we won't get any more characters.
                 */
-               if (n_tty_chars_in_buffer(tty) <= TTY_THRESHOLD_UNTHROTTLE) {
-                       n_tty_set_room(tty);
+               if (n_tty_chars_in_buffer(tty) <= TTY_THRESHOLD_UNTHROTTLE)
                        check_unthrottle(tty);
-               }
 
                if (b - buf >= minimum)
                        break;
                if (time)
                        timeout = time;
        }
-       mutex_unlock(&tty->atomic_read_lock);
+       clear_bit(TTY_DONT_FLIP, &tty->flags);
+       up(&tty->atomic_read);
        remove_wait_queue(&tty->read_wait, &wait);
 
        if (!waitqueue_active(&tty->read_wait))