diff options
Diffstat (limited to 'block-raw-posix.c')
-rw-r--r-- | block-raw-posix.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/block-raw-posix.c b/block-raw-posix.c index c06e38d12e..0a06a12fb6 100644 --- a/block-raw-posix.c +++ b/block-raw-posix.c @@ -497,15 +497,17 @@ static void posix_aio_read(void *opaque) int ret; ssize_t len; - do { - char byte; + /* read all bytes from signal pipe */ + for (;;) { + char bytes[16]; - len = read(s->rfd, &byte, 1); + len = read(s->rfd, bytes, sizeof(bytes)); if (len == -1 && errno == EINTR) - continue; - if (len == -1 && errno == EAGAIN) - break; - } while (len == -1); + continue; /* try again */ + if (len == sizeof(bytes)) + continue; /* more to read */ + break; + } for(;;) { pacb = &s->first_aio; @@ -591,6 +593,7 @@ static int posix_aio_init(void) s->rfd = fds[0]; s->wfd = fds[1]; + fcntl(s->rfd, F_SETFL, O_NONBLOCK); fcntl(s->wfd, F_SETFL, O_NONBLOCK); qemu_aio_set_fd_handler(s->rfd, posix_aio_read, NULL, posix_aio_flush, s); |