[libvirt] [PATCH 05/13] qemu: Refactor hotplug to introduce qemuDomain{Add|Del}TLSObjects
John Ferlan
jferlan at redhat.com
Wed Feb 22 04:20:03 UTC 2017
On 02/21/2017 03:00 PM, Jiri Denemark wrote:
> On Fri, Feb 17, 2017 at 14:39:22 -0500, John Ferlan wrote:
>> Refactor the TLS object adding code to make two separate API's that will
>> handle the add/remove of the "secret" and "tls-creds-x509" objects including
>> the Enter/Exit monitor commands.
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>> src/qemu/qemu_hotplug.c | 169 ++++++++++++++++++++++++++++--------------------
>> src/qemu/qemu_hotplug.h | 13 ++++
>> 2 files changed, 111 insertions(+), 71 deletions(-)
>>
>> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
>> index 8d15eee..fb8a052 100644
>> --- a/src/qemu/qemu_hotplug.c
>> +++ b/src/qemu/qemu_hotplug.c
>> @@ -1526,6 +1526,89 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
>> }
>>
>>
>> +void
>> +qemuDomainDelTLSObjects(virQEMUDriverPtr driver,
>> + virDomainObjPtr vm,
>> + const char *secAlias,
>> + const char *tlsAlias)
>> +{
>> + qemuDomainObjPrivatePtr priv = vm->privateData;
>> + virErrorPtr orig_err;
>> +
>> + /* Nothing to do if neither defined */
>
> The comment is pretty redundant.
>
>> + if (!tlsAlias && !secAlias)
>> + return;
>> +
>> + orig_err = virSaveLastError();
>> +
>> + qemuDomainObjEnterMonitor(driver, vm);
>> + if (tlsAlias)
>> + ignore_value(qemuMonitorDelObject(priv->mon, tlsAlias));
>> + if (secAlias)
>> + ignore_value(qemuMonitorDelObject(priv->mon, secAlias));
>> + if (orig_err) {
>> + virSetError(orig_err);
>> + virFreeError(orig_err);
>> + }
>> + ignore_value(qemuDomainObjExitMonitor(driver, vm));
>
> It looks like this function is designed to preserve the original error,
> so shouldn't the call to ExitMonitor be done above the if (orig_err)
> statement?
>
One would think that would be fine, but then again once you check each
of the places where I'm moving code the ExitMonitor is done after
resetting the orig_err. IDC either way, but I was more or less
following current design.
>> +}
>> +
>> +
>> +int
>> +qemuDomainAddTLSObjects(virQEMUDriverPtr driver,
>> + virDomainObjPtr vm,
>> + const char *secAlias,
>> + virJSONValuePtr *secProps,
>> + const char *tlsAlias,
>> + virJSONValuePtr *tlsProps)
>> +{
>> + qemuDomainObjPrivatePtr priv = vm->privateData;
>> + int rc;
>> + bool secobjAdded = false;
>> + bool tlsobjAdded = false;
>> + virErrorPtr orig_err;
>> +
>> + /* Nothing to do if neither defined */
>
> Redundant comment again.
>
>> + if (!tlsAlias && !secAlias)
>> + return 0;
>> +
>> + qemuDomainObjEnterMonitor(driver, vm);
>> +
>> + if (secAlias) {
>> + rc = qemuMonitorAddObject(priv->mon, "secret",
>> + secAlias, *secProps);
>> + *secProps = NULL; /* qemuMonitorAddObject consumes */
>> + if (rc < 0)
>> + goto exit_monitor;
>> + secobjAdded = true;
>> + }
>> +
>> + if (tlsAlias) {
>> + rc = qemuMonitorAddObject(priv->mon, "tls-creds-x509",
>> + tlsAlias, *tlsProps);
>> + *tlsProps = NULL; /* qemuMonitorAddObject consumes */
>> + if (rc < 0)
>> + goto exit_monitor;
>> + tlsobjAdded = true;
>> + }
>> +
>> + return qemuDomainObjExitMonitor(driver, vm);
>> +
>> + exit_monitor:
>> + orig_err = virSaveLastError();
>> + if (tlsobjAdded)
>> + ignore_value(qemuMonitorDelObject(priv->mon, tlsAlias));
>> + if (secobjAdded)
>> + ignore_value(qemuMonitorDelObject(priv->mon, secAlias));
>> + if (orig_err) {
>> + virSetError(orig_err);
>> + virFreeError(orig_err);
>> + }
>> + ignore_value(qemuDomainObjExitMonitor(driver, vm));
>> + return -1;
>
> This is suspicious, you're open coding almost all of the DelTLSObjects
> here. Could this function be rewritten to make use of
> the just introduced qemuDomainDelTLSObjects? Adding an extra ExitMonitor
> followed by EnterMonitor if something failed shouldn't be a big deal.
> We're entering and exiting the monitor all the time anyway.
>
Yeah I can do this - probably just call the ExitMonitor first and then
the DelTLSObjects afterwards which will re-enter and delete.
Tks, -
John
>> static int
>> qemuDomainGetChardevTLSObjects(virQEMUDriverConfigPtr cfg,
>> qemuDomainObjPrivatePtr priv,
> ...
>> @@ -1672,15 +1739,12 @@ int qemuDomainAttachRedirdevDevice(virConnectPtr conn,
>> /* detach associated chardev on error */
>> if (chardevAdded)
>> ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));
>> - if (tlsobjAdded)
>> - ignore_value(qemuMonitorDelObject(priv->mon, tlsAlias));
>> - if (secobjAdded)
>> - ignore_value(qemuMonitorDelObject(priv->mon, secAlias));
>> if (orig_err) {
>> virSetError(orig_err);
>> virFreeError(orig_err);
>> }
>> ignore_value(qemuDomainObjExitMonitor(driver, vm));
>> + qemuDomainDelTLSObjects(driver, vm, secAlias, tlsAlias);
>
> OK, we get here only when both tls and sec objects were added.
>
>> goto audit;
>
> BTW, the audit label can be easily replaced with cleanup. And this
> likely applies to the two clones (qemuDomainAttachChrDevice,
> qemuDomainAttachRNGDevice) of this function too.
>
> Jirka
>
More information about the libvir-list
mailing list