quorum: Convert to BdrvChild

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Jeff Cody <jcody@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
master
Kevin Wolf 2015-06-16 11:29:22 +02:00
parent 3e586be0b2
commit 0bd6e91a7e
1 changed files with 34 additions and 31 deletions

View File

@ -64,7 +64,7 @@ typedef struct QuorumVotes {
/* the following structure holds the state of one quorum instance */ /* the following structure holds the state of one quorum instance */
typedef struct BDRVQuorumState { typedef struct BDRVQuorumState {
BlockDriverState **bs; /* children BlockDriverStates */ BdrvChild **children; /* children BlockDriverStates */
int num_children; /* children count */ int num_children; /* children count */
int threshold; /* if less than threshold children reads gave the int threshold; /* if less than threshold children reads gave the
* same result a quorum error occurs. * same result a quorum error occurs.
@ -336,7 +336,7 @@ static void quorum_report_bad_versions(BDRVQuorumState *s,
continue; continue;
} }
QLIST_FOREACH(item, &version->items, next) { QLIST_FOREACH(item, &version->items, next) {
quorum_report_bad(acb, s->bs[item->index]->node_name, 0); quorum_report_bad(acb, s->children[item->index]->bs->node_name, 0);
} }
} }
} }
@ -369,8 +369,9 @@ static bool quorum_rewrite_bad_versions(BDRVQuorumState *s, QuorumAIOCB *acb,
continue; continue;
} }
QLIST_FOREACH(item, &version->items, next) { QLIST_FOREACH(item, &version->items, next) {
bdrv_aio_writev(s->bs[item->index], acb->sector_num, acb->qiov, bdrv_aio_writev(s->children[item->index]->bs, acb->sector_num,
acb->nb_sectors, quorum_rewrite_aio_cb, acb); acb->qiov, acb->nb_sectors, quorum_rewrite_aio_cb,
acb);
} }
} }
@ -639,13 +640,13 @@ static BlockAIOCB *read_quorum_children(QuorumAIOCB *acb)
int i; int i;
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
acb->qcrs[i].buf = qemu_blockalign(s->bs[i], acb->qiov->size); acb->qcrs[i].buf = qemu_blockalign(s->children[i]->bs, acb->qiov->size);
qemu_iovec_init(&acb->qcrs[i].qiov, acb->qiov->niov); qemu_iovec_init(&acb->qcrs[i].qiov, acb->qiov->niov);
qemu_iovec_clone(&acb->qcrs[i].qiov, acb->qiov, acb->qcrs[i].buf); qemu_iovec_clone(&acb->qcrs[i].qiov, acb->qiov, acb->qcrs[i].buf);
} }
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
bdrv_aio_readv(s->bs[i], acb->sector_num, &acb->qcrs[i].qiov, bdrv_aio_readv(s->children[i]->bs, acb->sector_num, &acb->qcrs[i].qiov,
acb->nb_sectors, quorum_aio_cb, &acb->qcrs[i]); acb->nb_sectors, quorum_aio_cb, &acb->qcrs[i]);
} }
@ -656,12 +657,12 @@ static BlockAIOCB *read_fifo_child(QuorumAIOCB *acb)
{ {
BDRVQuorumState *s = acb->common.bs->opaque; BDRVQuorumState *s = acb->common.bs->opaque;
acb->qcrs[acb->child_iter].buf = qemu_blockalign(s->bs[acb->child_iter], acb->qcrs[acb->child_iter].buf =
acb->qiov->size); qemu_blockalign(s->children[acb->child_iter]->bs, acb->qiov->size);
qemu_iovec_init(&acb->qcrs[acb->child_iter].qiov, acb->qiov->niov); qemu_iovec_init(&acb->qcrs[acb->child_iter].qiov, acb->qiov->niov);
qemu_iovec_clone(&acb->qcrs[acb->child_iter].qiov, acb->qiov, qemu_iovec_clone(&acb->qcrs[acb->child_iter].qiov, acb->qiov,
acb->qcrs[acb->child_iter].buf); acb->qcrs[acb->child_iter].buf);
bdrv_aio_readv(s->bs[acb->child_iter], acb->sector_num, bdrv_aio_readv(s->children[acb->child_iter]->bs, acb->sector_num,
&acb->qcrs[acb->child_iter].qiov, acb->nb_sectors, &acb->qcrs[acb->child_iter].qiov, acb->nb_sectors,
quorum_aio_cb, &acb->qcrs[acb->child_iter]); quorum_aio_cb, &acb->qcrs[acb->child_iter]);
@ -702,8 +703,8 @@ static BlockAIOCB *quorum_aio_writev(BlockDriverState *bs,
int i; int i;
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
acb->qcrs[i].aiocb = bdrv_aio_writev(s->bs[i], sector_num, qiov, acb->qcrs[i].aiocb = bdrv_aio_writev(s->children[i]->bs, sector_num,
nb_sectors, &quorum_aio_cb, qiov, nb_sectors, &quorum_aio_cb,
&acb->qcrs[i]); &acb->qcrs[i]);
} }
@ -717,12 +718,12 @@ static int64_t quorum_getlength(BlockDriverState *bs)
int i; int i;
/* check that all file have the same length */ /* check that all file have the same length */
result = bdrv_getlength(s->bs[0]); result = bdrv_getlength(s->children[0]->bs);
if (result < 0) { if (result < 0) {
return result; return result;
} }
for (i = 1; i < s->num_children; i++) { for (i = 1; i < s->num_children; i++) {
int64_t value = bdrv_getlength(s->bs[i]); int64_t value = bdrv_getlength(s->children[i]->bs);
if (value < 0) { if (value < 0) {
return value; return value;
} }
@ -741,7 +742,7 @@ static void quorum_invalidate_cache(BlockDriverState *bs, Error **errp)
int i; int i;
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
bdrv_invalidate_cache(s->bs[i], &local_err); bdrv_invalidate_cache(s->children[i]->bs, &local_err);
if (local_err) { if (local_err) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
return; return;
@ -762,7 +763,7 @@ static coroutine_fn int quorum_co_flush(BlockDriverState *bs)
error_votes.compare = quorum_64bits_compare; error_votes.compare = quorum_64bits_compare;
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
result = bdrv_co_flush(s->bs[i]); result = bdrv_co_flush(s->children[i]->bs);
result_value.l = result; result_value.l = result;
quorum_count_vote(&error_votes, &result_value, i); quorum_count_vote(&error_votes, &result_value, i);
} }
@ -782,7 +783,7 @@ static bool quorum_recurse_is_first_non_filter(BlockDriverState *bs,
int i; int i;
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
bool perm = bdrv_recurse_is_first_non_filter(s->bs[i], bool perm = bdrv_recurse_is_first_non_filter(s->children[i]->bs,
candidate); candidate);
if (perm) { if (perm) {
return true; return true;
@ -922,8 +923,8 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
} }
} }
/* allocate the children BlockDriverState array */ /* allocate the children array */
s->bs = g_new0(BlockDriverState *, s->num_children); s->children = g_new0(BdrvChild *, s->num_children);
opened = g_new0(bool, s->num_children); opened = g_new0(bool, s->num_children);
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
@ -931,9 +932,10 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
ret = snprintf(indexstr, 32, "children.%d", i); ret = snprintf(indexstr, 32, "children.%d", i);
assert(ret < 32); assert(ret < 32);
ret = bdrv_open_image(&s->bs[i], NULL, options, indexstr, bs, s->children[i] = bdrv_open_child(NULL, options, indexstr, bs,
&child_format, false, &local_err); &child_format, false, &local_err);
if (ret < 0) { if (local_err) {
ret = -EINVAL;
goto close_exit; goto close_exit;
} }
@ -949,9 +951,9 @@ close_exit:
if (!opened[i]) { if (!opened[i]) {
continue; continue;
} }
bdrv_unref(s->bs[i]); bdrv_unref_child(bs, s->children[i]);
} }
g_free(s->bs); g_free(s->children);
g_free(opened); g_free(opened);
exit: exit:
qemu_opts_del(opts); qemu_opts_del(opts);
@ -968,10 +970,10 @@ static void quorum_close(BlockDriverState *bs)
int i; int i;
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
bdrv_unref(s->bs[i]); bdrv_unref_child(bs, s->children[i]);
} }
g_free(s->bs); g_free(s->children);
} }
static void quorum_detach_aio_context(BlockDriverState *bs) static void quorum_detach_aio_context(BlockDriverState *bs)
@ -980,7 +982,7 @@ static void quorum_detach_aio_context(BlockDriverState *bs)
int i; int i;
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
bdrv_detach_aio_context(s->bs[i]); bdrv_detach_aio_context(s->children[i]->bs);
} }
} }
@ -991,7 +993,7 @@ static void quorum_attach_aio_context(BlockDriverState *bs,
int i; int i;
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
bdrv_attach_aio_context(s->bs[i], new_context); bdrv_attach_aio_context(s->children[i]->bs, new_context);
} }
} }
@ -1003,16 +1005,17 @@ static void quorum_refresh_filename(BlockDriverState *bs)
int i; int i;
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
bdrv_refresh_filename(s->bs[i]); bdrv_refresh_filename(s->children[i]->bs);
if (!s->bs[i]->full_open_options) { if (!s->children[i]->bs->full_open_options) {
return; return;
} }
} }
children = qlist_new(); children = qlist_new();
for (i = 0; i < s->num_children; i++) { for (i = 0; i < s->num_children; i++) {
QINCREF(s->bs[i]->full_open_options); QINCREF(s->children[i]->bs->full_open_options);
qlist_append_obj(children, QOBJECT(s->bs[i]->full_open_options)); qlist_append_obj(children,
QOBJECT(s->children[i]->bs->full_open_options));
} }
opts = qdict_new(); opts = qdict_new();