From f73f76acff4fd1d90bfbef486eedb25c4462809b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 17 Feb 2011 16:29:47 +0100 Subject: [PATCH] util: retry opening a TTY on EIO https://bugs.freedesktop.org/show_bug.cgi?id=33996 https://bugs.launchpad.net/ubuntu/+source/linux/+bug/554172/comments/245 --- src/util.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/util.c b/src/util.c index 92268b69..b8e73ef4 100644 --- a/src/util.c +++ b/src/util.c @@ -2134,8 +2134,32 @@ finish: int open_terminal(const char *name, int mode) { int fd, r; + unsigned c = 0; - if ((fd = open(name, mode)) < 0) + /* + * If a TTY is in the process of being closed opening it might + * cause EIO. This is horribly awful, but unlikely to be + * changed in the kernel. Hence we work around this problem by + * retrying a couple of times. + * + * https://bugs.launchpad.net/ubuntu/+source/linux/+bug/554172/comments/245 + */ + + for (;;) { + if ((fd = open(name, mode)) >= 0) + break; + + if (errno != EIO) + return -errno; + + if (c >= 20) + return -errno; + + usleep(50 * USEC_PER_MSEC); + c++; + } + + if (fd < 0) return -errno; if ((r = isatty(fd)) < 0) { -- 2.39.5