From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52713) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WDhx9-0005u3-Jj for qemu-devel@nongnu.org; Wed, 12 Feb 2014 17:06:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WDhx4-00029Y-JY for qemu-devel@nongnu.org; Wed, 12 Feb 2014 17:06:47 -0500 Received: from paradis.irqsave.net ([62.212.105.220]:49832) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WDhx3-000294-5K for qemu-devel@nongnu.org; Wed, 12 Feb 2014 17:06:42 -0500 From: =?UTF-8?q?Beno=C3=AEt=20Canet?= Date: Wed, 12 Feb 2014 23:06:30 +0100 Message-Id: <1392242799-16364-4-git-send-email-benoit.canet@irqsave.net> In-Reply-To: <1392242799-16364-1-git-send-email-benoit.canet@irqsave.net> References: <1392242799-16364-1-git-send-email-benoit.canet@irqsave.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH V17 03/12] quorum: Add quorum_aio_writev and its dependencies. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, famz@redhat.com, =?UTF-8?q?Beno=C3=AEt=20Canet?= , mreitz@redhat.com, stefanha@redhat.com From: Beno=C3=AEt Canet Writes are mirrored num_children times on num_children devices. Signed-off-by: Benoit Canet --- block/quorum.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++= ++++++ 1 file changed, 103 insertions(+) diff --git a/block/quorum.c b/block/quorum.c index 36c5bb8..197cdca 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -69,11 +69,114 @@ struct QuorumAIOCB { int vote_ret; }; =20 +static void quorum_aio_cancel(BlockDriverAIOCB *blockacb) +{ + QuorumAIOCB *acb =3D container_of(blockacb, QuorumAIOCB, common); + BDRVQuorumState *s =3D acb->common.bs->opaque; + int i; + + /* cancel all callbacks */ + for (i =3D 0; i < s->num_children; i++) { + bdrv_aio_cancel(acb->qcrs[i].aiocb); + } + + g_free(acb->qcrs); + qemu_aio_release(acb); +} + +static AIOCBInfo quorum_aiocb_info =3D { + .aiocb_size =3D sizeof(QuorumAIOCB), + .cancel =3D quorum_aio_cancel, +}; + +static void quorum_aio_finalize(QuorumAIOCB *acb) +{ + int ret =3D 0; + + acb->common.cb(acb->common.opaque, ret); + + g_free(acb->qcrs); + qemu_aio_release(acb); +} + +static QuorumAIOCB *quorum_aio_get(BDRVQuorumState *s, + BlockDriverState *bs, + QEMUIOVector *qiov, + uint64_t sector_num, + int nb_sectors, + BlockDriverCompletionFunc *cb, + void *opaque) +{ + QuorumAIOCB *acb =3D qemu_aio_get(&quorum_aiocb_info, bs, cb, opaque= ); + int i; + + acb->common.bs->opaque =3D s; + acb->sector_num =3D sector_num; + acb->nb_sectors =3D nb_sectors; + acb->qiov =3D qiov; + acb->qcrs =3D g_new0(QuorumChildRequest, s->num_children); + acb->count =3D 0; + acb->success_count =3D 0; + acb->is_read =3D false; + acb->vote_ret =3D 0; + + for (i =3D 0; i < s->num_children; i++) { + acb->qcrs[i].buf =3D NULL; + acb->qcrs[i].ret =3D 0; + acb->qcrs[i].parent =3D acb; + } + + return acb; +} + +static void quorum_aio_cb(void *opaque, int ret) +{ + QuorumChildRequest *sacb =3D opaque; + QuorumAIOCB *acb =3D sacb->parent; + BDRVQuorumState *s =3D acb->common.bs->opaque; + + sacb->ret =3D ret; + acb->count++; + if (ret =3D=3D 0) { + acb->success_count++; + } + assert(acb->count <=3D s->num_children); + assert(acb->success_count <=3D s->num_children); + if (acb->count < s->num_children) { + return; + } + + quorum_aio_finalize(acb); +} + +static BlockDriverAIOCB *quorum_aio_writev(BlockDriverState *bs, + int64_t sector_num, + QEMUIOVector *qiov, + int nb_sectors, + BlockDriverCompletionFunc *cb, + void *opaque) +{ + BDRVQuorumState *s =3D bs->opaque; + QuorumAIOCB *acb =3D quorum_aio_get(s, bs, qiov, sector_num, nb_sect= ors, + cb, opaque); + int i; + + for (i =3D 0; i < s->num_children; i++) { + acb->qcrs[i].aiocb =3D bdrv_aio_writev(s->bs[i], sector_num, qio= v, + nb_sectors, &quorum_aio_cb, + &acb->qcrs[i]); + } + + return &acb->common; +} + static BlockDriver bdrv_quorum =3D { .format_name =3D "quorum", .protocol_name =3D "quorum", =20 .instance_size =3D sizeof(BDRVQuorumState), + + .bdrv_aio_writev =3D quorum_aio_writev, }; =20 static void bdrv_quorum_init(void) --=20 1.8.3.2