On 6/26/19 11:29 PM, Eric Blake wrote:
Make nbd_poll slightly more like poll(), allowing a user to detect
timeouts by returning 0 on timeout and 1 when we made progress. It
turns out that none of our internal uses ever expect a timeout (we
only call nbd_internal_poll with timeout==-1 because we expect a reply
from the server), but the public function might as well be nicer.
Also handle POLLERR (server closed its read end, so our writes will
fail) and POLLNVAL (the fd itself is closed) as outright errors, and
POLLHUP the same as POLLIN (the server closed its write end, so read()
will eventually see EOF even if we have to drain a buffer first).
Perhaps we also want to add an nbd_aio_notify_err() that can inform
the machine of any externally-detected error on the fd to the server,
where the poll loop invokes that on POLLERR, and where we tweak the
generator to permit that external event in any other public state.
But that's a bigger patch.
---
generator/generator | 18 +++++++++++++-----
lib/poll.c | 13 ++++++++++---
2 files changed, 23 insertions(+), 8 deletions(-)
+++ b/lib/poll.c
@@ -57,21 +57,28 @@ nbd_unlocked_poll (struct nbd_handle *h, int timeout)
set_error (errno, "poll");
return -1;
}
I also need to squash in this, to fix our use of an uninitialized
variable when nbd_aio_get_direction returns 0 (such as when we are
already DEAD):
diff --git i/lib/poll.c w/lib/poll.c
index d356afe..fc6aae5 100644
--- i/lib/poll.c
+++ w/lib/poll.c
@@ -45,6 +45,8 @@ nbd_unlocked_poll (struct nbd_handle *h, int timeout)
case LIBNBD_AIO_DIRECTION_BOTH:
fds[0].events = POLLIN|POLLOUT;
break;
+ default:
+ fds[0].events = 0;
}
fds[0].revents = 0;
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization:
qemu.org |
libvirt.org