On 06/10/2016 11:33 AM, Michal Privoznik wrote:
The problem is this: when working on redirdev detach, I've
noticed that even though I've passed device alias in the input
device XML, it got transformed into inactive in
qemuDomainDetachDeviceLive() while in
qemuDomainDetachDeviceConfig() it was the active version of it.
Apparently, if you are doing:
virsh # detach-device --config --live domain device.xml
our code correctly detects that you want to detach the device
from both config and live domain definition. However, due to some
internal implementation we need to make a copy of the device that
user had provided. And to do that, we call
virDomainDeviceDefCopy(). This function basically formats the
If you take off the (), then I assume that function name fits on the
previous line. The blank space just looks odd.
device into XML and then parse it again. But there's a problem,
s/parse/parses
it's formatting the XML with VIR_DOMAIN_DEF_FORMAT_INACTIVE flag
which means that no live data are present in the copy. So we have
s/are/is
a (possibly live) device definition that we pass to code
detaching it from inactive XML, and inactive device definition
that we pass to code detaching it from active XML. This makes no
sense.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_driver.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Hazards of cut-n-paste code? And perhaps adjustments to the Copy
function after original implementation? I didn't dig on history.
Why is this not a problem for Attach and Update? What about LXC which
also uses the Copy function.
BTW: There's a comment:
/* If we are affecting both CONFIG and LIVE
* create a deep copy of device as adding
* to CONFIG takes one instance.
*/
just above the code you changed that has I think an obvious adjustment
to "deleting from"... Similarly the update code could use "updating"
I also think for each comment (I read code and don't necessarily hunt
for the commit message) that summarizes your investigation:
"NB: The 'dev' is the actual/live device, while 'dev_copy' will be a
somewhat reduced copy generated by using VIR_DOMAIN_DEF_PARSE_INACTIVE
which means conditionally parsed/formatted fields will not be copied."
(I assume that means stuff we've generated, that isn't part of the XML,
but is part of the virDmainDef)
I think my summary is - all 3 should use 'dev' for live and 'dev_copy'
for config.
John
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 65e96be..8255d7b 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -8523,22 +8523,22 @@ qemuDomainDetachDeviceFlags(virDomainPtr dom,
if (!vmdef)
goto endjob;
- if (virDomainDefCompatibleDevice(vmdef, dev,
+ if (virDomainDefCompatibleDevice(vmdef, dev_copy,
VIR_DOMAIN_DEVICE_ACTION_DETACH) < 0)
goto endjob;
- if ((ret = qemuDomainDetachDeviceConfig(vmdef, dev, caps,
+ if ((ret = qemuDomainDetachDeviceConfig(vmdef, dev_copy, caps,
parse_flags,
driver->xmlopt)) < 0)
goto endjob;
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- if (virDomainDefCompatibleDevice(vm->def, dev_copy,
+ if (virDomainDefCompatibleDevice(vm->def, dev,
VIR_DOMAIN_DEVICE_ACTION_DETACH) < 0)
goto endjob;
- if ((ret = qemuDomainDetachDeviceLive(vm, dev_copy, dom)) < 0)
+ if ((ret = qemuDomainDetachDeviceLive(vm, dev, dom)) < 0)
goto endjob;
/*
* update domain status forcibly because the domain status may be