提交 c001eb5b 编写于 作者: O Osier Yang

virsh: Do not check the input XML at virsh layer for cmdDetachDevice

Any device XML doesn't use the same order as libvirt generates, or
uses decimal for attributes like "slot" of "<address>" will cause
device detaching to fail, as virsh compares the XML simply earlier
in strict manner before internal parsing.

This is regression introduced by ea7182c2.
上级 9fbbcda6
......@@ -13153,6 +13153,7 @@ cmdAttachDevice(vshControl *ctl, const vshCmd *cmd)
* @n2 second node
* returns true in case n1 covers n2, false otherwise.
*/
ATTRIBUTE_UNUSED
static bool
vshNodeIsSuperset(xmlNodePtr n1, xmlNodePtr n2)
{
......@@ -13278,6 +13279,7 @@ cleanup:
* (is too ambiguous), 0 in case of success. Otherwise returns -1. @newXML
* is touched only in case of success.
*/
ATTRIBUTE_UNUSED
static int
vshCompleteXMLFromDomain(vshControl *ctl, virDomainPtr dom, char *oldXML,
char **newXML)
......@@ -13412,7 +13414,7 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
{
virDomainPtr dom = NULL;
const char *from = NULL;
char *buffer = NULL, *new_buffer = NULL;
char *buffer = NULL;
int ret;
bool funcRet = false;
unsigned int flags;
......@@ -13431,27 +13433,13 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
goto cleanup;
}
ret = vshCompleteXMLFromDomain(ctl, dom, buffer, &new_buffer);
if (ret < 0) {
if (ret == -2) {
vshError(ctl, _("no such device in %s"), virDomainGetName(dom));
} else if (ret == -3) {
vshError(ctl, "%s", _("given XML selects too many devices. "
"Please, be more specific"));
} else {
/* vshCompleteXMLFromDomain() already printed error message,
* so nothing to do here. */
}
goto cleanup;
}
if (vshCommandOptBool(cmd, "persistent")) {
flags = VIR_DOMAIN_AFFECT_CONFIG;
if (virDomainIsActive(dom) == 1)
flags |= VIR_DOMAIN_AFFECT_LIVE;
ret = virDomainDetachDeviceFlags(dom, new_buffer, flags);
ret = virDomainDetachDeviceFlags(dom, buffer, flags);
} else {
ret = virDomainDetachDevice(dom, new_buffer);
ret = virDomainDetachDevice(dom, buffer);
}
if (ret < 0) {
......@@ -13463,7 +13451,6 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
funcRet = true;
cleanup:
VIR_FREE(new_buffer);
VIR_FREE(buffer);
virDomainFree(dom);
return funcRet;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册