Commit ed9ba724 authored by MORITA Kazutaka's avatar MORITA Kazutaka Committed by Stefan Hajnoczi
Browse files

sheepdog: set io_flush handler in do_co_req



If an io_flush handler is not set, qemu_aio_wait doesn't invoke
callbacks.

Signed-off-by: default avatarMORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>
Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
parent 0d6db300
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -501,6 +501,13 @@ 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. */
    return 1;
}

typedef struct SheepdogReqCo {
    int sockfd;
    SheepdogReq *hdr;
@@ -523,14 +530,14 @@ static coroutine_fn void do_co_req(void *opaque)
    unsigned int *rlen = srco->rlen;

    co = qemu_coroutine_self();
    qemu_aio_set_fd_handler(sockfd, NULL, restart_co_req, NULL, co);
    qemu_aio_set_fd_handler(sockfd, NULL, restart_co_req, have_co_req, co);

    ret = send_co_req(sockfd, hdr, data, wlen);
    if (ret < 0) {
        goto out;
    }

    qemu_aio_set_fd_handler(sockfd, restart_co_req, NULL, NULL, co);
    qemu_aio_set_fd_handler(sockfd, restart_co_req, NULL, have_co_req, co);

    ret = qemu_co_recv(sockfd, hdr, sizeof(*hdr));
    if (ret < sizeof(*hdr)) {
@@ -553,6 +560,8 @@ static coroutine_fn void do_co_req(void *opaque)
    }
    ret = 0;
out:
    /* there is at most one request for this sockfd, so it is safe to
     * set each handler to NULL. */
    qemu_aio_set_fd_handler(sockfd, NULL, NULL, NULL, NULL);

    srco->ret = ret;