mirror of https://github.com/xqemu/xqemu.git
quorum: Add quorum_co_flush().
Makes a vote to select error if any. Signed-off-by: Benoit Canet <benoit@irqsave.net> Reviewed-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
a28e4c408b
commit
1c508d174d
|
@ -629,12 +629,40 @@ static void quorum_invalidate_cache(BlockDriverState *bs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static coroutine_fn int quorum_co_flush(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
BDRVQuorumState *s = bs->opaque;
|
||||||
|
QuorumVoteVersion *winner = NULL;
|
||||||
|
QuorumVotes error_votes;
|
||||||
|
QuorumVoteValue result_value;
|
||||||
|
int i;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
QLIST_INIT(&error_votes.vote_list);
|
||||||
|
error_votes.compare = quorum_64bits_compare;
|
||||||
|
|
||||||
|
for (i = 0; i < s->num_children; i++) {
|
||||||
|
result = bdrv_co_flush(s->bs[i]);
|
||||||
|
result_value.l = result;
|
||||||
|
quorum_count_vote(&error_votes, &result_value, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
winner = quorum_get_vote_winner(&error_votes);
|
||||||
|
result = winner->value.l;
|
||||||
|
|
||||||
|
quorum_free_vote_list(&error_votes);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static BlockDriver bdrv_quorum = {
|
static BlockDriver bdrv_quorum = {
|
||||||
.format_name = "quorum",
|
.format_name = "quorum",
|
||||||
.protocol_name = "quorum",
|
.protocol_name = "quorum",
|
||||||
|
|
||||||
.instance_size = sizeof(BDRVQuorumState),
|
.instance_size = sizeof(BDRVQuorumState),
|
||||||
|
|
||||||
|
.bdrv_co_flush_to_disk = quorum_co_flush,
|
||||||
|
|
||||||
.bdrv_getlength = quorum_getlength,
|
.bdrv_getlength = quorum_getlength,
|
||||||
|
|
||||||
.bdrv_aio_readv = quorum_aio_readv,
|
.bdrv_aio_readv = quorum_aio_readv,
|
||||||
|
|
Loading…
Reference in New Issue