Am 08.04.2013 um 17:31 hat Stefan Hajnoczi geschrieben: > 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...
Indeed. I thought I had seen a case where only the flush handler is reset, but it seems I didn't look close enough. Kevin