Lines Matching refs:acb

144     QuorumAIOCB *acb;  member
148 static void quorum_aio_finalize(QuorumAIOCB *acb) in quorum_aio_finalize() argument
150 g_free(acb->qcrs); in quorum_aio_finalize()
151 g_free(acb); in quorum_aio_finalize()
170 QuorumAIOCB *acb = g_new(QuorumAIOCB, 1); in quorum_aio_get() local
173 *acb = (QuorumAIOCB) { in quorum_aio_get()
181 .votes.vote_list = QLIST_HEAD_INITIALIZER(acb.votes.vote_list), in quorum_aio_get()
184 acb->qcrs = g_new0(QuorumChildRequest, s->num_children); in quorum_aio_get()
186 acb->qcrs[i].buf = NULL; in quorum_aio_get()
187 acb->qcrs[i].ret = 0; in quorum_aio_get()
188 acb->qcrs[i].parent = acb; in quorum_aio_get()
191 return acb; in quorum_aio_get()
209 static void GRAPH_RDLOCK quorum_report_failure(QuorumAIOCB *acb) in quorum_report_failure() argument
211 const char *reference = bdrv_get_device_or_node_name(acb->bs); in quorum_report_failure()
212 int64_t start_sector = acb->offset / BDRV_SECTOR_SIZE; in quorum_report_failure()
213 int64_t end_sector = DIV_ROUND_UP(acb->offset + acb->bytes, in quorum_report_failure()
220 static int quorum_vote_error(QuorumAIOCB *acb);
222 static bool GRAPH_RDLOCK quorum_has_too_much_io_failed(QuorumAIOCB *acb) in quorum_has_too_much_io_failed() argument
224 BDRVQuorumState *s = acb->bs->opaque; in quorum_has_too_much_io_failed()
226 if (acb->success_count < s->threshold) { in quorum_has_too_much_io_failed()
227 acb->vote_ret = quorum_vote_error(acb); in quorum_has_too_much_io_failed()
228 quorum_report_failure(acb); in quorum_has_too_much_io_failed()
250 QuorumAIOCB *acb = sacb->parent; in quorum_report_bad_acb() local
251 QuorumOpType type = acb->is_read ? QUORUM_OP_TYPE_READ : QUORUM_OP_TYPE_WRITE; in quorum_report_bad_acb()
252 quorum_report_bad(type, acb->offset, acb->bytes, sacb->bs->node_name, ret); in quorum_report_bad_acb()
256 QuorumAIOCB *acb, in quorum_report_bad_versions() argument
262 QLIST_FOREACH(version, &acb->votes.vote_list, next) { in quorum_report_bad_versions()
263 if (acb->votes.compare(&version->value, value)) { in quorum_report_bad_versions()
267 quorum_report_bad(QUORUM_OP_TYPE_READ, acb->offset, acb->bytes, in quorum_report_bad_versions()
280 QuorumAIOCB *acb = co->acb; in quorum_rewrite_entry() local
281 BDRVQuorumState *s = acb->bs->opaque; in quorum_rewrite_entry()
287 bdrv_co_pwritev(s->children[co->idx], acb->offset, acb->bytes, in quorum_rewrite_entry()
288 acb->qiov, acb->flags & ~BDRV_REQ_WRITE_UNCHANGED); in quorum_rewrite_entry()
291 acb->rewrite_count--; in quorum_rewrite_entry()
292 if (!acb->rewrite_count) { in quorum_rewrite_entry()
293 qemu_coroutine_enter_if_inactive(acb->co); in quorum_rewrite_entry()
298 quorum_rewrite_bad_versions(QuorumAIOCB *acb, QuorumVoteValue *value) in quorum_rewrite_bad_versions() argument
307 QLIST_FOREACH(version, &acb->votes.vote_list, next) { in quorum_rewrite_bad_versions()
308 if (acb->votes.compare(&version->value, value)) { in quorum_rewrite_bad_versions()
317 acb->rewrite_count = count; in quorum_rewrite_bad_versions()
320 QLIST_FOREACH(version, &acb->votes.vote_list, next) { in quorum_rewrite_bad_versions()
321 if (acb->votes.compare(&version->value, value)) { in quorum_rewrite_bad_versions()
327 .acb = acb, in quorum_rewrite_bad_versions()
387 static int quorum_compute_hash(QuorumAIOCB *acb, int i, QuorumVoteValue *hash) in quorum_compute_hash() argument
389 QEMUIOVector *qiov = &acb->qcrs[i].qiov; in quorum_compute_hash()
446 static bool quorum_compare(QuorumAIOCB *acb, QEMUIOVector *a, QEMUIOVector *b) in quorum_compare() argument
448 BDRVQuorumState *s = acb->bs->opaque; in quorum_compare()
457 acb->offset, acb->bytes, acb->offset + offset); in quorum_compare()
467 static int quorum_vote_error(QuorumAIOCB *acb) in quorum_vote_error() argument
469 BDRVQuorumState *s = acb->bs->opaque; in quorum_vote_error()
480 ret = acb->qcrs[i].ret; in quorum_vote_error()
498 static void coroutine_fn GRAPH_RDLOCK quorum_vote(QuorumAIOCB *acb) in quorum_vote() argument
503 BDRVQuorumState *s = acb->bs->opaque; in quorum_vote()
506 if (quorum_has_too_much_io_failed(acb)) { in quorum_vote()
512 if (!acb->qcrs[i].ret) { in quorum_vote()
523 if (acb->qcrs[j].ret) { in quorum_vote()
526 quorum = quorum_compare(acb, &acb->qcrs[i].qiov, &acb->qcrs[j].qiov); in quorum_vote()
534 quorum_copy_qiov(acb->qiov, &acb->qcrs[i].qiov); in quorum_vote()
540 if (acb->qcrs[i].ret) { in quorum_vote()
543 ret = quorum_compute_hash(acb, i, &hash); in quorum_vote()
546 acb->vote_ret = ret; in quorum_vote()
549 quorum_count_vote(&acb->votes, &hash, i); in quorum_vote()
553 winner = quorum_get_vote_winner(&acb->votes); in quorum_vote()
557 quorum_report_failure(acb); in quorum_vote()
558 acb->vote_ret = -EIO; in quorum_vote()
563 quorum_copy_qiov(acb->qiov, &acb->qcrs[winner->index].qiov); in quorum_vote()
566 quorum_report_bad_versions(s, acb, &winner->value); in quorum_vote()
570 quorum_rewrite_bad_versions(acb, &winner->value); in quorum_vote()
575 quorum_free_vote_list(&acb->votes); in quorum_vote()
585 QuorumAIOCB *acb = co->acb; in read_quorum_children_entry() local
586 BDRVQuorumState *s = acb->bs->opaque; in read_quorum_children_entry()
588 QuorumChildRequest *sacb = &acb->qcrs[i]; in read_quorum_children_entry()
591 sacb->ret = bdrv_co_preadv(s->children[i], acb->offset, acb->bytes, in read_quorum_children_entry()
592 &acb->qcrs[i].qiov, 0); in read_quorum_children_entry()
595 acb->success_count++; in read_quorum_children_entry()
600 acb->count++; in read_quorum_children_entry()
601 assert(acb->count <= s->num_children); in read_quorum_children_entry()
602 assert(acb->success_count <= s->num_children); in read_quorum_children_entry()
605 if (acb->count == s->num_children) { in read_quorum_children_entry()
606 qemu_coroutine_enter_if_inactive(acb->co); in read_quorum_children_entry()
610 static int coroutine_fn GRAPH_RDLOCK read_quorum_children(QuorumAIOCB *acb) in read_quorum_children() argument
612 BDRVQuorumState *s = acb->bs->opaque; in read_quorum_children()
615 acb->children_read = s->num_children; in read_quorum_children()
617 acb->qcrs[i].buf = qemu_blockalign(s->children[i]->bs, acb->qiov->size); in read_quorum_children()
618 qemu_iovec_init(&acb->qcrs[i].qiov, acb->qiov->niov); in read_quorum_children()
619 qemu_iovec_clone(&acb->qcrs[i].qiov, acb->qiov, acb->qcrs[i].buf); in read_quorum_children()
625 .acb = acb, in read_quorum_children()
633 while (acb->count < s->num_children) { in read_quorum_children()
638 quorum_vote(acb); in read_quorum_children()
640 qemu_vfree(acb->qcrs[i].buf); in read_quorum_children()
641 qemu_iovec_destroy(&acb->qcrs[i].qiov); in read_quorum_children()
644 while (acb->rewrite_count) { in read_quorum_children()
648 return acb->vote_ret; in read_quorum_children()
651 static int coroutine_fn GRAPH_RDLOCK read_fifo_child(QuorumAIOCB *acb) in read_fifo_child() argument
653 BDRVQuorumState *s = acb->bs->opaque; in read_fifo_child()
658 n = acb->children_read++; in read_fifo_child()
659 acb->qcrs[n].bs = s->children[n]->bs; in read_fifo_child()
660 ret = bdrv_co_preadv(s->children[n], acb->offset, acb->bytes, in read_fifo_child()
661 acb->qiov, 0); in read_fifo_child()
663 quorum_report_bad_acb(&acb->qcrs[n], ret); in read_fifo_child()
665 } while (ret < 0 && acb->children_read < s->num_children); in read_fifo_child()
677 QuorumAIOCB *acb = quorum_aio_get(bs, qiov, offset, bytes, flags); in quorum_co_preadv() local
680 acb->is_read = true; in quorum_co_preadv()
681 acb->children_read = 0; in quorum_co_preadv()
684 ret = read_quorum_children(acb); in quorum_co_preadv()
686 ret = read_fifo_child(acb); in quorum_co_preadv()
688 quorum_aio_finalize(acb); in quorum_co_preadv()
700 QuorumAIOCB *acb = co->acb; in write_quorum_entry() local
701 BDRVQuorumState *s = acb->bs->opaque; in write_quorum_entry()
703 QuorumChildRequest *sacb = &acb->qcrs[i]; in write_quorum_entry()
706 if (acb->flags & BDRV_REQ_ZERO_WRITE) { in write_quorum_entry()
707 sacb->ret = bdrv_co_pwrite_zeroes(s->children[i], acb->offset, in write_quorum_entry()
708 acb->bytes, acb->flags); in write_quorum_entry()
710 sacb->ret = bdrv_co_pwritev(s->children[i], acb->offset, acb->bytes, in write_quorum_entry()
711 acb->qiov, acb->flags); in write_quorum_entry()
714 acb->success_count++; in write_quorum_entry()
718 acb->count++; in write_quorum_entry()
719 assert(acb->count <= s->num_children); in write_quorum_entry()
720 assert(acb->success_count <= s->num_children); in write_quorum_entry()
723 if (acb->count == s->num_children) { in write_quorum_entry()
724 qemu_coroutine_enter_if_inactive(acb->co); in write_quorum_entry()
733 QuorumAIOCB *acb = quorum_aio_get(bs, qiov, offset, bytes, flags); in quorum_co_pwritev() local
739 .acb = acb, in quorum_co_pwritev()
747 while (acb->count < s->num_children) { in quorum_co_pwritev()
751 quorum_has_too_much_io_failed(acb); in quorum_co_pwritev()
753 ret = acb->vote_ret; in quorum_co_pwritev()
754 quorum_aio_finalize(acb); in quorum_co_pwritev()