From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54779) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c4t0b-000167-4t for qemu-devel@nongnu.org; Thu, 10 Nov 2016 12:19:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c4t0Z-0007xB-42 for qemu-devel@nongnu.org; Thu, 10 Nov 2016 12:19:29 -0500 From: Kevin Wolf Date: Thu, 10 Nov 2016 18:19:06 +0100 Message-Id: <1478798349-28983-6-git-send-email-kwolf@redhat.com> In-Reply-To: <1478798349-28983-1-git-send-email-kwolf@redhat.com> References: <1478798349-28983-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [RFC PATCH 5/8] quorum: Inline quorum_aio_cb() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-block@nongnu.org Cc: kwolf@redhat.com, mreitz@redhat.com, berto@igalia.com, qemu-devel@nongnu.org This is a conversion to a more natural coroutine style and improves the readability of the driver. Signed-off-by: Kevin Wolf --- block/quorum.c | 112 ++++++++++++++++++++++++++------------------------------- 1 file changed, 51 insertions(+), 61 deletions(-) diff --git a/block/quorum.c b/block/quorum.c index a225327..b2bb3af 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -130,7 +130,6 @@ struct QuorumAIOCB { QuorumVotes votes; bool is_read; - bool has_completed; int vote_ret; int children_read; /* how many children have been read from */ }; @@ -173,7 +172,6 @@ static QuorumAIOCB *quorum_aio_get(BlockDriverState *bs, acb->rewrite_count = 0; acb->votes.compare = quorum_sha256_compare; QLIST_INIT(&acb->votes.vote_list); - acb->has_completed = false; acb->is_read = false; acb->vote_ret = 0; @@ -226,13 +224,6 @@ static void quorum_rewrite_aio_cb(void *opaque, int ret) /* one less rewrite to do */ acb->rewrite_count--; - - /* wait until all rewrite callbacks have completed */ - if (acb->rewrite_count) { - return; - } - - acb->has_completed = true; qemu_coroutine_enter_if_inactive(acb->co); } @@ -283,45 +274,6 @@ static int quorum_fifo_aio_cb(void *opaque, int ret) return ret; } -static void quorum_aio_cb(void *opaque, int ret) -{ - QuorumChildRequest *sacb = opaque; - QuorumAIOCB *acb = sacb->parent; - BDRVQuorumState *s = acb->bs->opaque; - bool rewrite = false; - int i; - - sacb->ret = ret; - if (ret == 0) { - acb->success_count++; - } else { - quorum_report_bad_acb(sacb, ret); - } - acb->count++; - assert(acb->count <= s->num_children); - assert(acb->success_count <= s->num_children); - if (acb->count < s->num_children) { - return; - } - - /* Do the vote on read */ - if (acb->is_read) { - rewrite = quorum_vote(acb); - for (i = 0; i < s->num_children; i++) { - qemu_vfree(acb->qcrs[i].buf); - qemu_iovec_destroy(&acb->qcrs[i].qiov); - } - } else { - quorum_has_too_much_io_failed(acb); - } - - /* if no rewrite is done the code will finish right away */ - if (!rewrite) { - acb->has_completed = true; - qemu_coroutine_enter_if_inactive(acb->co); - } -} - static void quorum_report_bad_versions(BDRVQuorumState *s, QuorumAIOCB *acb, QuorumVoteValue *value) @@ -645,19 +597,32 @@ static void read_quorum_children_entry(void *opaque) QuorumAIOCB *acb = co->acb; BDRVQuorumState *s = acb->bs->opaque; int i = co->i; - int ret; + QuorumChildRequest *sacb = &acb->qcrs[i]; co = NULL; /* Not valid after the first yield */ - acb->qcrs[i].bs = s->children[i]->bs; - ret = bdrv_co_preadv(s->children[i], acb->sector_num * BDRV_SECTOR_SIZE, - acb->nb_sectors * BDRV_SECTOR_SIZE, - &acb->qcrs[i].qiov, 0); - quorum_aio_cb(&acb->qcrs[i], ret); + sacb->bs = s->children[i]->bs; + sacb->ret = bdrv_co_preadv(s->children[i], + acb->sector_num * BDRV_SECTOR_SIZE, + acb->nb_sectors * BDRV_SECTOR_SIZE, + &acb->qcrs[i].qiov, 0); + + if (sacb->ret == 0) { + acb->success_count++; + } else { + quorum_report_bad_acb(sacb, sacb->ret); + } + + acb->count++; + assert(acb->count <= s->num_children); + assert(acb->success_count <= s->num_children); + + qemu_coroutine_enter_if_inactive(acb->co); } static int read_quorum_children(QuorumAIOCB *acb) { BDRVQuorumState *s = acb->bs->opaque; + bool rewrite = false; int i, ret; acb->children_read = s->num_children; @@ -678,7 +643,19 @@ static int read_quorum_children(QuorumAIOCB *acb) qemu_coroutine_enter(co); } - if (!acb->has_completed) { + while (acb->count < s->num_children) { + qemu_coroutine_yield(); + } + + /* Do the vote on read */ + rewrite = quorum_vote(acb); + for (i = 0; i < s->num_children; i++) { + qemu_vfree(acb->qcrs[i].buf); + qemu_iovec_destroy(&acb->qcrs[i].qiov); + } + + assert(rewrite == !!acb->rewrite_count); + while (acb->rewrite_count) { qemu_coroutine_yield(); } @@ -728,13 +705,24 @@ static void write_quorum_entry(void *opaque) QuorumAIOCB *acb = co->acb; BDRVQuorumState *s = acb->bs->opaque; int i = co->i; - int ret; + QuorumChildRequest *sacb = &acb->qcrs[i]; co = NULL; /* Not valid after the first yield */ - acb->qcrs[i].bs = s->children[i]->bs; - ret = bdrv_co_pwritev(s->children[i], acb->sector_num * BDRV_SECTOR_SIZE, - acb->nb_sectors * BDRV_SECTOR_SIZE, acb->qiov, 0); - quorum_aio_cb(&acb->qcrs[i], ret); + sacb->bs = s->children[i]->bs; + sacb->ret = bdrv_co_pwritev(s->children[i], + acb->sector_num * BDRV_SECTOR_SIZE, + acb->nb_sectors * BDRV_SECTOR_SIZE, + acb->qiov, 0); + if (sacb->ret == 0) { + acb->success_count++; + } else { + quorum_report_bad_acb(sacb, sacb->ret); + } + acb->count++; + assert(acb->count <= s->num_children); + assert(acb->success_count <= s->num_children); + + qemu_coroutine_enter_if_inactive(acb->co); } static int quorum_co_writev(BlockDriverState *bs, @@ -756,10 +744,12 @@ static int quorum_co_writev(BlockDriverState *bs, qemu_coroutine_enter(co); } - if (!acb->has_completed) { + while (acb->count < s->num_children) { qemu_coroutine_yield(); } + quorum_has_too_much_io_failed(acb); + ret = acb->vote_ret; quorum_aio_finalize(acb); -- 1.8.3.1