On Tue, Apr 02, 2013 at 10:37:24AM +0200, Kevin Wolf wrote: > Am 28.03.2013 um 22:52 hat Anthony Liguori geschrieben: > > Signed-off-by: Anthony Liguori <aligu...@us.ibm.com> > > --- > > block/sheepdog.c | 11 ++--------- > > 1 file changed, 2 insertions(+), 9 deletions(-) > > > > diff --git a/block/sheepdog.c b/block/sheepdog.c > > index bb67c4c..2bccd9b 100644 > > --- a/block/sheepdog.c > > +++ b/block/sheepdog.c > > @@ -503,13 +503,6 @@ static void restart_co_req(void *opaque) > > qemu_coroutine_enter(co, NULL); > > } > > > > -static int have_co_req(void *opaque) > > -{ > > - /* this handler is set only when there is a pending request, so > > - * always returns 1. */ > > Now you return 1 even when no request is pending (which is the case in > which no io_flush handler would be set before). Why is this correct? > (This is actually a question about PATCH 1/3, I just noticed it here. > Are there more cases like this?)
The trick with return 1 handlers is that they are deleted when there are no more requests. The pattern is: ...begin processing request... qemu_set_fd_handler2(fd, ..., have_co_req); qemu_coroutine_yield() qemu_set_fd_handler2(fd, NULL, NULL, NULL, NULL); /* delete handler */ ...finish processing request... Stefan