qemu: hotplug: Refactor RNG props formatting to use qemuMonitorCreateObjectProps
Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
e4a2bfe264
commit
6ab7fd16d1
@ -5490,12 +5490,15 @@ qemuBuildRNGBackendChrdevStr(virLogManagerPtr logManager,
|
|||||||
int
|
int
|
||||||
qemuBuildRNGBackendProps(virDomainRNGDefPtr rng,
|
qemuBuildRNGBackendProps(virDomainRNGDefPtr rng,
|
||||||
virQEMUCapsPtr qemuCaps,
|
virQEMUCapsPtr qemuCaps,
|
||||||
const char **type,
|
|
||||||
virJSONValuePtr *props)
|
virJSONValuePtr *props)
|
||||||
{
|
{
|
||||||
|
char *objAlias = NULL;
|
||||||
char *charBackendAlias = NULL;
|
char *charBackendAlias = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
|
if (virAsprintf(&objAlias, "obj%s", rng->info.alias) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
switch ((virDomainRNGBackend) rng->backend) {
|
switch ((virDomainRNGBackend) rng->backend) {
|
||||||
case VIR_DOMAIN_RNG_BACKEND_RANDOM:
|
case VIR_DOMAIN_RNG_BACKEND_RANDOM:
|
||||||
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_RNG_RANDOM)) {
|
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_RNG_RANDOM)) {
|
||||||
@ -5505,11 +5508,11 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
*type = "rng-random";
|
if (qemuMonitorCreateObjectProps(props, "rng-random", objAlias,
|
||||||
|
"s:filename", rng->source.file,
|
||||||
if (virJSONValueObjectCreate(props, "s:filename", rng->source.file,
|
NULL) < 0)
|
||||||
NULL) < 0)
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_RNG_BACKEND_EGD:
|
case VIR_DOMAIN_RNG_BACKEND_EGD:
|
||||||
@ -5520,13 +5523,12 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
*type = "rng-egd";
|
|
||||||
|
|
||||||
if (!(charBackendAlias = qemuAliasChardevFromDevAlias(rng->info.alias)))
|
if (!(charBackendAlias = qemuAliasChardevFromDevAlias(rng->info.alias)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virJSONValueObjectCreate(props, "s:chardev", charBackendAlias,
|
if (qemuMonitorCreateObjectProps(props, "rng-egd", objAlias,
|
||||||
NULL) < 0)
|
"s:chardev", charBackendAlias,
|
||||||
|
NULL) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -5540,35 +5542,12 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
VIR_FREE(objAlias);
|
||||||
VIR_FREE(charBackendAlias);
|
VIR_FREE(charBackendAlias);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static char *
|
|
||||||
qemuBuildRNGBackendStr(virDomainRNGDefPtr rng,
|
|
||||||
virQEMUCapsPtr qemuCaps)
|
|
||||||
{
|
|
||||||
const char *type = NULL;
|
|
||||||
char *alias = NULL;
|
|
||||||
virJSONValuePtr props = NULL;
|
|
||||||
char *ret = NULL;
|
|
||||||
|
|
||||||
if (virAsprintf(&alias, "obj%s", rng->info.alias) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (qemuBuildRNGBackendProps(rng, qemuCaps, &type, &props) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
ret = virQEMUBuildObjectCommandlineFromJSONType(type, alias, props);
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
VIR_FREE(alias);
|
|
||||||
virJSONValueFree(props);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char *
|
char *
|
||||||
qemuBuildRNGDevStr(const virDomainDef *def,
|
qemuBuildRNGDevStr(const virDomainDef *def,
|
||||||
virDomainRNGDefPtr dev,
|
virDomainRNGDefPtr dev,
|
||||||
@ -5636,8 +5615,11 @@ qemuBuildRNGCommandLine(virLogManagerPtr logManager,
|
|||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 0; i < def->nrngs; i++) {
|
for (i = 0; i < def->nrngs; i++) {
|
||||||
|
virJSONValuePtr props;
|
||||||
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
virDomainRNGDefPtr rng = def->rngs[i];
|
virDomainRNGDefPtr rng = def->rngs[i];
|
||||||
char *tmp;
|
char *tmp;
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (!rng->info.alias) {
|
if (!rng->info.alias) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
@ -5656,12 +5638,17 @@ qemuBuildRNGCommandLine(virLogManagerPtr logManager,
|
|||||||
VIR_FREE(tmp);
|
VIR_FREE(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add the RNG source backend */
|
if (qemuBuildRNGBackendProps(rng, qemuCaps, &props) < 0)
|
||||||
if (!(tmp = qemuBuildRNGBackendStr(rng, qemuCaps)))
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
virCommandAddArgList(cmd, "-object", tmp, NULL);
|
rc = virQEMUBuildObjectCommandlineFromJSON(&buf, props);
|
||||||
VIR_FREE(tmp);
|
virJSONValueFree(props);
|
||||||
|
|
||||||
|
if (rc < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
virCommandAddArg(cmd, "-object");
|
||||||
|
virCommandAddArgBuffer(cmd, &buf);
|
||||||
|
|
||||||
/* add the device */
|
/* add the device */
|
||||||
if (!(tmp = qemuBuildRNGDevStr(def, rng, qemuCaps)))
|
if (!(tmp = qemuBuildRNGDevStr(def, rng, qemuCaps)))
|
||||||
|
@ -142,7 +142,6 @@ char *qemuBuildRNGDevStr(const virDomainDef *def,
|
|||||||
virQEMUCapsPtr qemuCaps);
|
virQEMUCapsPtr qemuCaps);
|
||||||
int qemuBuildRNGBackendProps(virDomainRNGDefPtr rng,
|
int qemuBuildRNGBackendProps(virDomainRNGDefPtr rng,
|
||||||
virQEMUCapsPtr qemuCaps,
|
virQEMUCapsPtr qemuCaps,
|
||||||
const char **type,
|
|
||||||
virJSONValuePtr *props);
|
virJSONValuePtr *props);
|
||||||
|
|
||||||
int qemuOpenPCIConfig(virDomainHostdevDefPtr dev);
|
int qemuOpenPCIConfig(virDomainHostdevDefPtr dev);
|
||||||
|
@ -1979,11 +1979,8 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver,
|
|||||||
bool teardowncgroup = false;
|
bool teardowncgroup = false;
|
||||||
bool teardowndevice = false;
|
bool teardowndevice = false;
|
||||||
bool chardevAdded = false;
|
bool chardevAdded = false;
|
||||||
bool objAdded = false;
|
|
||||||
virJSONValuePtr props = NULL;
|
virJSONValuePtr props = NULL;
|
||||||
const char *type;
|
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
int rv;
|
|
||||||
|
|
||||||
if (qemuAssignDeviceRNGAlias(vm->def, rng) < 0)
|
if (qemuAssignDeviceRNGAlias(vm->def, rng) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -2007,10 +2004,7 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver,
|
|||||||
if (!(devstr = qemuBuildRNGDevStr(vm->def, rng, priv->qemuCaps)))
|
if (!(devstr = qemuBuildRNGDevStr(vm->def, rng, priv->qemuCaps)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (qemuBuildRNGBackendProps(rng, priv->qemuCaps, &type, &props) < 0)
|
if (qemuBuildRNGBackendProps(rng, priv->qemuCaps, &props) < 0)
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virAsprintf(&objAlias, "obj%s", rng->info.alias) < 0)
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(charAlias = qemuAliasChardevFromDevAlias(rng->info.alias)))
|
if (!(charAlias = qemuAliasChardevFromDevAlias(rng->info.alias)))
|
||||||
@ -2032,11 +2026,8 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver,
|
|||||||
goto exit_monitor;
|
goto exit_monitor;
|
||||||
chardevAdded = true;
|
chardevAdded = true;
|
||||||
|
|
||||||
rv = qemuMonitorAddObjectType(priv->mon, type, objAlias, props);
|
if (qemuMonitorAddObject(priv->mon, &props, &objAlias) < 0)
|
||||||
props = NULL; /* qemuMonitorAddObjectType consumes */
|
|
||||||
if (rv < 0)
|
|
||||||
goto exit_monitor;
|
goto exit_monitor;
|
||||||
objAdded = true;
|
|
||||||
|
|
||||||
if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
|
if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
|
||||||
goto exit_monitor;
|
goto exit_monitor;
|
||||||
@ -2071,7 +2062,7 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
exit_monitor:
|
exit_monitor:
|
||||||
virErrorPreserveLast(&orig_err);
|
virErrorPreserveLast(&orig_err);
|
||||||
if (objAdded)
|
if (objAlias)
|
||||||
ignore_value(qemuMonitorDelObject(priv->mon, objAlias));
|
ignore_value(qemuMonitorDelObject(priv->mon, objAlias));
|
||||||
if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD && chardevAdded)
|
if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD && chardevAdded)
|
||||||
ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));
|
ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user