Le Wednesday 08 Aug 2012 à 16:37:13 (+0100), Stefan Hajnoczi a écrit : > On Tue, Aug 7, 2012 at 2:44 PM, Benoît Canet <benoit.ca...@gmail.com> wrote: > > +static int quorum_check_ret(QuorumAIOCB *acb) > > +{ > > + int i, j; > > + > > + for (i = 0, j = 0; i <= 2; i++) { > > + if (acb->aios[0].ret) { > > + j++; > > + } > > + } > > + > > + if (j > 1) { > > + return -EIO; > > + } > > + > > + return 0; > > +} > > Simpler version just scans the return values (also I think > acb->aios[0].ret should be acb->aios[i].ret): > > static int quorum_check_ret(QuorumAIOCB *acb) > { > int i; > for (i = 0; i <= 2; i++) { > if (acb->aios[i].ret) { > return -EIO; /* or acb->aios[i].ret */ > } > } > return 0; > }
I am wondering what is the best code to return. There is some potential case like a filer containing a particular image (or a image on the network) going down where the user probably don't want to get an -EIO. The if (j > 1) { return -EIO; } part was about detecting an error count greater dans the threshold (2). > > > + > > +static void quorum_aio_bh(void *opaque) > > +{ > > + QuorumAIOCB *acb = opaque; > > + > > + qemu_bh_delete(acb->bh); > > + acb->common.cb(acb->common.opaque, quorum_check_ret(acb)); > > + if (acb->finished) { > > + *acb->finished = true; > > + } > > + qemu_aio_release(acb); > > +} > > + > > +static QuorumAIOCB *quorum_aio_get(BlockDriverState *bs, > > + QEMUIOVector *qiov, > > + int64_t sector_num, > > + int nb_sectors, > > + BlockDriverCompletionFunc *cb, > > + void *opaque) > > +{ > > + QuorumAIOCB *acb = qemu_aio_get(&quorum_aio_pool, bs, cb, opaque); > > + int i; > > + > > + acb->qiov = qiov; > > + acb->bh = NULL; > > + acb->count = 0; > > + acb->sector_num = sector_num; > > + acb->nb_sectors = nb_sectors; > > + acb->vote = NULL; > > + acb->vote_ret = 0; > > acb->finished = NULL; >