lkml.org 
[lkml]   [2009]   [Jul]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: [PATCH] kdesu broken
    Date
    Alan Cox <alan@lxorguk.ukuu.org.uk> writes:

    >> And if it's right, unfortunately, I guess we can't return -EAGAIN in
    >> this case to preserve behavior.
    >
    > To avoid the EAGAIN the close needs to block until all queued I/O has
    > been processed by the ldisc the other end. That's not standards
    > guaranteed or even what happens with a non pty port, but it is doable
    > unless you take signals - we can't block signals or it can all deadlock.

    Just a quick hack though. Is this wrong/unpreferable way?

    n_tty_read() checks the pending buffer and consume it before
    input_available_p().

    Thanks.
    --
    OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>



    Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
    ---

    drivers/char/n_tty.c | 1 +
    drivers/char/pty.c | 1 -
    drivers/char/tty_buffer.c | 7 +++++--
    include/linux/tty.h | 1 +
    4 files changed, 7 insertions(+), 3 deletions(-)

    diff -puN drivers/char/pty.c~pty-fixes4-fix2 drivers/char/pty.c
    --- linux-2.6/drivers/char/pty.c~pty-fixes4-fix2 2009-07-28 05:00:45.000000000 +0900
    +++ linux-2.6-hirofumi/drivers/char/pty.c 2009-07-28 05:00:48.000000000 +0900
    @@ -64,7 +64,6 @@ static void pty_close(struct tty_struct
    set_bit(TTY_EOFPENDING, &pair->flags);
    set_bit(TTY_OTHER_CLOSED, &pair->flags);
    spin_unlock_irqrestore(&pair->buf.lock, flags);
    - tty_flip_buffer_push(pair);
    wake_up_interruptible(&pair->read_wait);
    wake_up_interruptible(&pair->write_wait);
    if (tty->driver->subtype == PTY_TYPE_MASTER) {
    diff -puN drivers/char/n_tty.c~pty-fixes4-fix2 drivers/char/n_tty.c
    --- linux-2.6/drivers/char/n_tty.c~pty-fixes4-fix2 2009-07-28 05:01:10.000000000 +0900
    +++ linux-2.6-hirofumi/drivers/char/n_tty.c 2009-07-28 05:07:49.000000000 +0900
    @@ -1776,6 +1776,7 @@ do_it_again:
    ((minimum - (b - buf)) >= 1))
    tty->minimum_to_wake = (minimum - (b - buf));

    + tty_flush_to_ldisc(tty);
    if (!input_available_p(tty, 0)) {
    if (test_bit(TTY_EOF, &tty->flags)) {
    /* PTY pair closed and all data consumed */
    diff -puN include/linux/tty.h~pty-fixes4-fix2 include/linux/tty.h
    --- linux-2.6/include/linux/tty.h~pty-fixes4-fix2 2009-07-28 05:07:07.000000000 +0900
    +++ linux-2.6-hirofumi/include/linux/tty.h 2009-07-28 05:07:30.000000000 +0900
    @@ -396,6 +396,7 @@ extern void __do_SAK(struct tty_struct *
    extern void disassociate_ctty(int priv);
    extern void no_tty(void);
    extern void tty_flip_buffer_push(struct tty_struct *tty);
    +extern void tty_flush_to_ldisc(struct tty_struct *tty);
    extern void tty_buffer_free_all(struct tty_struct *tty);
    extern void tty_buffer_flush(struct tty_struct *tty);
    extern void tty_buffer_init(struct tty_struct *tty);
    diff -puN drivers/char/tty_buffer.c~pty-fixes4-fix2 drivers/char/tty_buffer.c
    --- linux-2.6/drivers/char/tty_buffer.c~pty-fixes4-fix2 2009-07-28 05:41:12.000000000 +0900
    +++ linux-2.6-hirofumi/drivers/char/tty_buffer.c 2009-07-28 14:24:48.000000000 +0900
    @@ -388,8 +388,6 @@ int tty_prepare_flip_string_flags(struct
    }
    EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags);

    -
    -
    /**
    * flush_to_ldisc
    * @work: tty structure passed from work queue.
    @@ -473,6 +471,11 @@ static void flush_to_ldisc(struct work_s
    tty_ldisc_deref(disc);
    }

    +void tty_flush_to_ldisc(struct tty_struct *tty)
    +{
    + flush_to_ldisc(&tty->buf.work.work);
    +}
    +
    /**
    * tty_flip_buffer_push - terminal
    * @tty: tty to push
    _

    \
     
     \ /
      Last update: 2009-07-28 07:37    [W:0.031 / U:6.076 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site