diff options
author | Benjamin Berg <[email protected]> | 2023-11-10 12:03:43 +0100 |
---|---|---|
committer | Richard Weinberger <[email protected]> | 2024-01-04 23:51:23 +0100 |
commit | 139e6e8ef6ee9a56fc1737240ecd8402fbcadd82 (patch) | |
tree | 76dd2aadcfe4fdd3892f9646e36714e2a0f2b407 /arch/um/drivers/line.c | |
parent | 1818b8406678a78b823dad44c91580f859403ced (diff) |
um: Reap winch thread if it fails
When the winch thread runs into an error condition, it would exit(1) and
never be reaped until shutdown time. Change this to write a command byte
which causes the driver to kill it, therefore reaping the child.
Signed-off-by: Benjamin Berg <[email protected]>
Signed-off-by: Richard Weinberger <[email protected]>
Diffstat (limited to 'arch/um/drivers/line.c')
-rw-r--r-- | arch/um/drivers/line.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c index b98545f3edb5..449d320c3f55 100644 --- a/arch/um/drivers/line.c +++ b/arch/um/drivers/line.c @@ -629,15 +629,18 @@ static irqreturn_t winch_interrupt(int irq, void *data) if (fd != -1) { err = generic_read(fd, &c, NULL); - if (err < 0) { + /* A read of 2 means the winch thread failed and has warned */ + if (err < 0 || (err == 1 && c == 2)) { if (err != -EAGAIN) { winch->fd = -1; list_del(&winch->list); os_close_file(fd); - printk(KERN_ERR "winch_interrupt : " - "read failed, errno = %d\n", -err); - printk(KERN_ERR "fd %d is losing SIGWINCH " - "support\n", winch->tty_fd); + if (err < 0) { + printk(KERN_ERR "winch_interrupt : read failed, errno = %d\n", + -err); + printk(KERN_ERR "fd %d is losing SIGWINCH support\n", + winch->tty_fd); + } INIT_WORK(&winch->work, __free_winch); schedule_work(&winch->work); return IRQ_HANDLED; |