aboutsummaryrefslogtreecommitdiff
path: root/block-raw-posix.c
diff options
context:
space:
mode:
Diffstat (limited to 'block-raw-posix.c')
-rw-r--r--block-raw-posix.c17
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);