]> git.hungrycats.org Git - linux/commitdiff
[PATCH] small tty irq race fix
authorNicolas Pitre <nico@cam.org>
Mon, 3 Mar 2003 10:11:31 +0000 (02:11 -0800)
committerRussell King <rmk@flint.arm.linux.org.uk>
Mon, 3 Mar 2003 10:11:31 +0000 (02:11 -0800)
drivers/char/tty_io.c

index 019d97d40bd82272421dfff4b8fd7a108e4fce7e..08d7a1890371f65ad96714245b4d13680730401c 100644 (file)
@@ -1944,27 +1944,25 @@ static void flush_to_ldisc(void *private_)
                schedule_delayed_work(&tty->flip.work, 1);
                return;
        }
+
+       spin_lock_irqsave(&tty->read_lock, flags);
        if (tty->flip.buf_num) {
                cp = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
                fp = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
                tty->flip.buf_num = 0;
-
-               local_irq_save(flags); // FIXME: is this safe?
                tty->flip.char_buf_ptr = tty->flip.char_buf;
                tty->flip.flag_buf_ptr = tty->flip.flag_buf;
        } else {
                cp = tty->flip.char_buf;
                fp = tty->flip.flag_buf;
                tty->flip.buf_num = 1;
-
-               local_irq_save(flags); // FIXME: is this safe?
                tty->flip.char_buf_ptr = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
                tty->flip.flag_buf_ptr = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
        }
        count = tty->flip.count;
        tty->flip.count = 0;
-       local_irq_restore(flags); // FIXME: is this safe?
-       
+       spin_unlock_irqrestore(&tty->read_lock, flags);
+
        tty->ldisc.receive_buf(tty, cp, fp, count);
 }