From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42562) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Valp4-000797-Q0 for qemu-devel@nongnu.org; Mon, 28 Oct 2013 08:21:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Valoz-0005Go-Oz for qemu-devel@nongnu.org; Mon, 28 Oct 2013 08:21:30 -0400 Received: from nodalink.pck.nerim.net ([62.212.105.220]:36911 helo=paradis.irqsave.net) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Valoz-0005Ge-8i for qemu-devel@nongnu.org; Mon, 28 Oct 2013 08:21:25 -0400 Date: Mon, 28 Oct 2013 13:21:17 +0100 From: =?iso-8859-1?Q?Beno=EEt?= Canet Message-ID: <20131028122116.GA2890@irqsave.net> References: <1380717564-11098-1-git-send-email-benoit@irqsave.net> <1380717564-11098-4-git-send-email-benoit@irqsave.net> <524ED226.5030701@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <524ED226.5030701@redhat.com> Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH V9 03/11] quorum: Add quorum_aio_writev and its dependencies. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Reitz Cc: kwolf@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com Le Friday 04 Oct 2013 =E0 16:35:18 (+0200), Max Reitz a =E9crit : > On 2013-10-02 14:39, Beno=EEt Canet wrote: > >Signed-off-by: Benoit Canet > >--- > > block/quorum.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++= ++++++++++ > > 1 file changed, 123 insertions(+) > > > >diff --git a/block/quorum.c b/block/quorum.c > >index 9557e61..b49e3c6 100644 > >--- a/block/quorum.c > >+++ b/block/quorum.c > >@@ -64,11 +64,134 @@ struct QuorumAIOCB { > > int vote_ret; > > }; > >+static void quorum_aio_cancel(BlockDriverAIOCB *blockacb) > >+{ > >+ QuorumAIOCB *acb =3D container_of(blockacb, QuorumAIOCB, common); > >+ bool finished =3D false; > >+ > >+ /* Wait for the request to finish */ > >+ acb->finished =3D &finished; > >+ while (!finished) { > >+ qemu_aio_wait(); > >+ } > Hm, wouldn't it be better to pass the cancel to the children? >=20 > Max Hi Max, Hi don't understand how you would do this. Best regards Beno=EEt >=20 > >+} > >+ > >+static AIOCBInfo quorum_aiocb_info =3D { > >+ .aiocb_size =3D sizeof(QuorumAIOCB), > >+ .cancel =3D quorum_aio_cancel, > >+}; > >+ > >+/* return the first error code get by each individual callbacks */ > >+static int quorum_get_first_error(QuorumAIOCB *acb) > >+{ > >+ BDRVQuorumState *s =3D acb->bqs; > >+ int i, ret =3D 0; > >+ > >+ for (i =3D 0; i < s->total; i++) { > >+ ret =3D acb->aios[i].ret; > >+ if (ret) { > >+ return ret; > >+ } > >+ } > >+ > >+ /* should not pass here */ > >+ assert(false); > >+} > >+ > >+static void quorum_aio_finalize(QuorumAIOCB *acb) > >+{ > >+ BDRVQuorumState *s =3D acb->bqs; > >+ int ret; > >+ > >+ ret =3D s->threshold <=3D acb->success_count ? 0 : quorum_get_fir= st_error(acb); > >+ > >+ acb->common.cb(acb->common.opaque, ret); > >+ if (acb->finished) { > >+ *acb->finished =3D true; > >+ } > >+ g_free(acb->aios); > >+ 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, opa= que); > >+ int i; > >+ > >+ acb->bqs =3D s; > >+ acb->sector_num =3D sector_num; > >+ acb->nb_sectors =3D nb_sectors; > >+ acb->qiov =3D qiov; > >+ acb->aios =3D g_new0(QuorumSingleAIOCB, s->total); > >+ acb->count =3D 0; > >+ acb->success_count =3D 0; > >+ acb->finished =3D NULL; > >+ acb->is_read =3D false; > >+ acb->vote_ret =3D 0; > >+ > >+ for (i =3D 0; i < s->total; i++) { > >+ acb->aios[i].buf =3D NULL; > >+ acb->aios[i].ret =3D 0; > >+ acb->aios[i].parent =3D acb; > >+ } > >+ > >+ return acb; > >+} > >+ > >+static void quorum_aio_cb(void *opaque, int ret) > >+{ > >+ QuorumSingleAIOCB *sacb =3D opaque; > >+ QuorumAIOCB *acb =3D sacb->parent; > >+ BDRVQuorumState *s =3D acb->bqs; > >+ > >+ sacb->ret =3D ret; > >+ acb->count++; > >+ if (ret =3D=3D 0) { > >+ acb->success_count++; > >+ } > >+ assert(acb->count <=3D s->total); > >+ assert(acb->success_count <=3D s->total); > >+ if (acb->count < s->total) { > >+ 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_s= ectors, > >+ cb, opaque); > >+ int i; > >+ > >+ for (i =3D 0; i < s->total; i++) { > >+ acb->aios[i].aiocb =3D bdrv_aio_writev(&s->bs[i], sector_num,= qiov, > >+ nb_sectors, &quorum_aio_= cb, > >+ &acb->aios[i]); > >+ } > >+ > >+ return &acb->common; > >+} > >+ > > static BlockDriver bdrv_quorum =3D { > > .format_name =3D "quorum", > > .protocol_name =3D "quorum", > > .instance_size =3D sizeof(BDRVQuorumState), > >+ > >+ .bdrv_aio_writev =3D quorum_aio_writev, > > }; > > static void bdrv_quorum_init(void) >=20 >=20