mirror of https://github.com/xemu-project/xemu.git
block: Convert to new qapi union layout
We have two issues with our qapi union layout: 1) Even though the QMP wire format spells the tag 'type', the C code spells it 'kind', requiring some hacks in the generator. 2) The C struct uses an anonymous union, which places all tag values in the same namespace as all non-variant members. This leads to spurious collisions if a tag value matches a non-variant member's name. Make the conversion to the new layout for block-related code. Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <1445898903-12082-16-git-send-email-eblake@redhat.com> [Commit message tweaked slightly] Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
c363acef77
commit
6a8f9661dc
18
block/nbd.c
18
block/nbd.c
|
@ -206,24 +206,24 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options, char **export,
|
||||||
saddr = g_new0(SocketAddress, 1);
|
saddr = g_new0(SocketAddress, 1);
|
||||||
|
|
||||||
if (qdict_haskey(options, "path")) {
|
if (qdict_haskey(options, "path")) {
|
||||||
saddr->kind = SOCKET_ADDRESS_KIND_UNIX;
|
saddr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||||
saddr->q_unix = g_new0(UnixSocketAddress, 1);
|
saddr->u.q_unix = g_new0(UnixSocketAddress, 1);
|
||||||
saddr->q_unix->path = g_strdup(qdict_get_str(options, "path"));
|
saddr->u.q_unix->path = g_strdup(qdict_get_str(options, "path"));
|
||||||
qdict_del(options, "path");
|
qdict_del(options, "path");
|
||||||
} else {
|
} else {
|
||||||
saddr->kind = SOCKET_ADDRESS_KIND_INET;
|
saddr->type = SOCKET_ADDRESS_KIND_INET;
|
||||||
saddr->inet = g_new0(InetSocketAddress, 1);
|
saddr->u.inet = g_new0(InetSocketAddress, 1);
|
||||||
saddr->inet->host = g_strdup(qdict_get_str(options, "host"));
|
saddr->u.inet->host = g_strdup(qdict_get_str(options, "host"));
|
||||||
if (!qdict_get_try_str(options, "port")) {
|
if (!qdict_get_try_str(options, "port")) {
|
||||||
saddr->inet->port = g_strdup_printf("%d", NBD_DEFAULT_PORT);
|
saddr->u.inet->port = g_strdup_printf("%d", NBD_DEFAULT_PORT);
|
||||||
} else {
|
} else {
|
||||||
saddr->inet->port = g_strdup(qdict_get_str(options, "port"));
|
saddr->u.inet->port = g_strdup(qdict_get_str(options, "port"));
|
||||||
}
|
}
|
||||||
qdict_del(options, "host");
|
qdict_del(options, "host");
|
||||||
qdict_del(options, "port");
|
qdict_del(options, "port");
|
||||||
}
|
}
|
||||||
|
|
||||||
s->client.is_unix = saddr->kind == SOCKET_ADDRESS_KIND_UNIX;
|
s->client.is_unix = saddr->type == SOCKET_ADDRESS_KIND_UNIX;
|
||||||
|
|
||||||
*export = g_strdup(qdict_get_try_str(options, "export"));
|
*export = g_strdup(qdict_get_try_str(options, "export"));
|
||||||
if (*export) {
|
if (*export) {
|
||||||
|
|
|
@ -2738,18 +2738,16 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
|
||||||
ImageInfoSpecific *spec_info = g_new(ImageInfoSpecific, 1);
|
ImageInfoSpecific *spec_info = g_new(ImageInfoSpecific, 1);
|
||||||
|
|
||||||
*spec_info = (ImageInfoSpecific){
|
*spec_info = (ImageInfoSpecific){
|
||||||
.kind = IMAGE_INFO_SPECIFIC_KIND_QCOW2,
|
.type = IMAGE_INFO_SPECIFIC_KIND_QCOW2,
|
||||||
{
|
.u.qcow2 = g_new(ImageInfoSpecificQCow2, 1),
|
||||||
.qcow2 = g_new(ImageInfoSpecificQCow2, 1),
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
if (s->qcow_version == 2) {
|
if (s->qcow_version == 2) {
|
||||||
*spec_info->qcow2 = (ImageInfoSpecificQCow2){
|
*spec_info->u.qcow2 = (ImageInfoSpecificQCow2){
|
||||||
.compat = g_strdup("0.10"),
|
.compat = g_strdup("0.10"),
|
||||||
.refcount_bits = s->refcount_bits,
|
.refcount_bits = s->refcount_bits,
|
||||||
};
|
};
|
||||||
} else if (s->qcow_version == 3) {
|
} else if (s->qcow_version == 3) {
|
||||||
*spec_info->qcow2 = (ImageInfoSpecificQCow2){
|
*spec_info->u.qcow2 = (ImageInfoSpecificQCow2){
|
||||||
.compat = g_strdup("1.1"),
|
.compat = g_strdup("1.1"),
|
||||||
.lazy_refcounts = s->compatible_features &
|
.lazy_refcounts = s->compatible_features &
|
||||||
QCOW2_COMPAT_LAZY_REFCOUNTS,
|
QCOW2_COMPAT_LAZY_REFCOUNTS,
|
||||||
|
|
|
@ -2161,19 +2161,19 @@ static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs)
|
||||||
ImageInfoList **next;
|
ImageInfoList **next;
|
||||||
|
|
||||||
*spec_info = (ImageInfoSpecific){
|
*spec_info = (ImageInfoSpecific){
|
||||||
.kind = IMAGE_INFO_SPECIFIC_KIND_VMDK,
|
.type = IMAGE_INFO_SPECIFIC_KIND_VMDK,
|
||||||
{
|
{
|
||||||
.vmdk = g_new0(ImageInfoSpecificVmdk, 1),
|
.vmdk = g_new0(ImageInfoSpecificVmdk, 1),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
*spec_info->vmdk = (ImageInfoSpecificVmdk) {
|
*spec_info->u.vmdk = (ImageInfoSpecificVmdk) {
|
||||||
.create_type = g_strdup(s->create_type),
|
.create_type = g_strdup(s->create_type),
|
||||||
.cid = s->cid,
|
.cid = s->cid,
|
||||||
.parent_cid = s->parent_cid,
|
.parent_cid = s->parent_cid,
|
||||||
};
|
};
|
||||||
|
|
||||||
next = &spec_info->vmdk->extents;
|
next = &spec_info->u.vmdk->extents;
|
||||||
for (i = 0; i < s->num_extents; i++) {
|
for (i = 0; i < s->num_extents; i++) {
|
||||||
*next = g_new0(ImageInfoList, 1);
|
*next = g_new0(ImageInfoList, 1);
|
||||||
(*next)->value = vmdk_get_extent_info(&s->extents[i]);
|
(*next)->value = vmdk_get_extent_info(&s->extents[i]);
|
||||||
|
|
47
blockdev.c
47
blockdev.c
|
@ -1137,13 +1137,14 @@ void hmp_commit(Monitor *mon, const QDict *qdict)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blockdev_do_action(int kind, void *data, Error **errp)
|
static void blockdev_do_action(TransactionActionKind type, void *data,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
TransactionAction action;
|
TransactionAction action;
|
||||||
TransactionActionList list;
|
TransactionActionList list;
|
||||||
|
|
||||||
action.kind = kind;
|
action.type = type;
|
||||||
action.data = data;
|
action.u.data = data;
|
||||||
list.value = &action;
|
list.value = &action;
|
||||||
list.next = NULL;
|
list.next = NULL;
|
||||||
qmp_transaction(&list, errp);
|
qmp_transaction(&list, errp);
|
||||||
|
@ -1388,9 +1389,9 @@ static void internal_snapshot_prepare(BlkTransactionState *common,
|
||||||
InternalSnapshotState *state;
|
InternalSnapshotState *state;
|
||||||
int ret1;
|
int ret1;
|
||||||
|
|
||||||
g_assert(common->action->kind ==
|
g_assert(common->action->type ==
|
||||||
TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC);
|
TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC);
|
||||||
internal = common->action->blockdev_snapshot_internal_sync;
|
internal = common->action->u.blockdev_snapshot_internal_sync;
|
||||||
state = DO_UPCAST(InternalSnapshotState, common, common);
|
state = DO_UPCAST(InternalSnapshotState, common, common);
|
||||||
|
|
||||||
/* 1. parse input */
|
/* 1. parse input */
|
||||||
|
@ -1536,22 +1537,22 @@ static void external_snapshot_prepare(BlkTransactionState *common,
|
||||||
TransactionAction *action = common->action;
|
TransactionAction *action = common->action;
|
||||||
|
|
||||||
/* get parameters */
|
/* get parameters */
|
||||||
g_assert(action->kind == TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC);
|
g_assert(action->type == TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC);
|
||||||
|
|
||||||
has_device = action->blockdev_snapshot_sync->has_device;
|
has_device = action->u.blockdev_snapshot_sync->has_device;
|
||||||
device = action->blockdev_snapshot_sync->device;
|
device = action->u.blockdev_snapshot_sync->device;
|
||||||
has_node_name = action->blockdev_snapshot_sync->has_node_name;
|
has_node_name = action->u.blockdev_snapshot_sync->has_node_name;
|
||||||
node_name = action->blockdev_snapshot_sync->node_name;
|
node_name = action->u.blockdev_snapshot_sync->node_name;
|
||||||
has_snapshot_node_name =
|
has_snapshot_node_name =
|
||||||
action->blockdev_snapshot_sync->has_snapshot_node_name;
|
action->u.blockdev_snapshot_sync->has_snapshot_node_name;
|
||||||
snapshot_node_name = action->blockdev_snapshot_sync->snapshot_node_name;
|
snapshot_node_name = action->u.blockdev_snapshot_sync->snapshot_node_name;
|
||||||
|
|
||||||
new_image_file = action->blockdev_snapshot_sync->snapshot_file;
|
new_image_file = action->u.blockdev_snapshot_sync->snapshot_file;
|
||||||
if (action->blockdev_snapshot_sync->has_format) {
|
if (action->u.blockdev_snapshot_sync->has_format) {
|
||||||
format = action->blockdev_snapshot_sync->format;
|
format = action->u.blockdev_snapshot_sync->format;
|
||||||
}
|
}
|
||||||
if (action->blockdev_snapshot_sync->has_mode) {
|
if (action->u.blockdev_snapshot_sync->has_mode) {
|
||||||
mode = action->blockdev_snapshot_sync->mode;
|
mode = action->u.blockdev_snapshot_sync->mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* start processing */
|
/* start processing */
|
||||||
|
@ -1681,8 +1682,8 @@ static void drive_backup_prepare(BlkTransactionState *common, Error **errp)
|
||||||
DriveBackup *backup;
|
DriveBackup *backup;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
assert(common->action->kind == TRANSACTION_ACTION_KIND_DRIVE_BACKUP);
|
assert(common->action->type == TRANSACTION_ACTION_KIND_DRIVE_BACKUP);
|
||||||
backup = common->action->drive_backup;
|
backup = common->action->u.drive_backup;
|
||||||
|
|
||||||
blk = blk_by_name(backup->device);
|
blk = blk_by_name(backup->device);
|
||||||
if (!blk) {
|
if (!blk) {
|
||||||
|
@ -1754,8 +1755,8 @@ static void blockdev_backup_prepare(BlkTransactionState *common, Error **errp)
|
||||||
BlockBackend *blk, *target;
|
BlockBackend *blk, *target;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
assert(common->action->kind == TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP);
|
assert(common->action->type == TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP);
|
||||||
backup = common->action->blockdev_backup;
|
backup = common->action->u.blockdev_backup;
|
||||||
|
|
||||||
blk = blk_by_name(backup->device);
|
blk = blk_by_name(backup->device);
|
||||||
if (!blk) {
|
if (!blk) {
|
||||||
|
@ -1887,9 +1888,9 @@ void qmp_transaction(TransactionActionList *dev_list, Error **errp)
|
||||||
dev_info = dev_entry->value;
|
dev_info = dev_entry->value;
|
||||||
dev_entry = dev_entry->next;
|
dev_entry = dev_entry->next;
|
||||||
|
|
||||||
assert(dev_info->kind < ARRAY_SIZE(actions));
|
assert(dev_info->type < ARRAY_SIZE(actions));
|
||||||
|
|
||||||
ops = &actions[dev_info->kind];
|
ops = &actions[dev_info->type];
|
||||||
assert(ops->instance_size > 0);
|
assert(ops->instance_size > 0);
|
||||||
|
|
||||||
state = g_malloc0(ops->instance_size);
|
state = g_malloc0(ops->instance_size);
|
||||||
|
|
Loading…
Reference in New Issue