From: Lennart Poettering Date: Thu, 17 Feb 2011 15:29:47 +0000 (+0100) Subject: util: retry opening a TTY on EIO X-Git-Tag: v19~53 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f73f76acff4fd1d90bfbef486eedb25c4462809b;p=systemd 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 --- 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) {