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; } > + > +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;