提交 0e0c1a74 编写于 作者: S Stefan Bader 提交者: Michal Privoznik

libxl: Use id from virDomainObj inside the driver

There is a domain id in the virDomain structure as well as in the
virDomainObj structure. While the former can become stale the latter
is kept up to date. So it is safer to always (virDomainObjPtr)->def->id
internally.

This will fix issues seen when managing Xen guests through libvirt from
virt-manager (not being able to get domain info after define or reboot).
This was caused both though libxlDomainGetInfo() only but there were
a lot of places that might potentially cause issues, too.
Signed-off-by: NStefan Bader <stefan.bader@canonical.com>
上级 c9123fbe
...@@ -770,10 +770,10 @@ libxlDomainSuspend(virDomainPtr dom) ...@@ -770,10 +770,10 @@ libxlDomainSuspend(virDomainPtr dom)
priv = vm->privateData; priv = vm->privateData;
if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) { if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) {
if (libxl_domain_pause(priv->ctx, dom->id) != 0) { if (libxl_domain_pause(priv->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to suspend domain '%d' with libxenlight"), _("Failed to suspend domain '%d' with libxenlight"),
dom->id); vm->def->id);
goto endjob; goto endjob;
} }
...@@ -829,10 +829,10 @@ libxlDomainResume(virDomainPtr dom) ...@@ -829,10 +829,10 @@ libxlDomainResume(virDomainPtr dom)
priv = vm->privateData; priv = vm->privateData;
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) { if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
if (libxl_domain_unpause(priv->ctx, dom->id) != 0) { if (libxl_domain_unpause(priv->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to resume domain '%d' with libxenlight"), _("Failed to resume domain '%d' with libxenlight"),
dom->id); vm->def->id);
goto endjob; goto endjob;
} }
...@@ -883,10 +883,10 @@ libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags) ...@@ -883,10 +883,10 @@ libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
} }
priv = vm->privateData; priv = vm->privateData;
if (libxl_domain_shutdown(priv->ctx, dom->id) != 0) { if (libxl_domain_shutdown(priv->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to shutdown domain '%d' with libxenlight"), _("Failed to shutdown domain '%d' with libxenlight"),
dom->id); vm->def->id);
goto cleanup; goto cleanup;
} }
...@@ -930,10 +930,10 @@ libxlDomainReboot(virDomainPtr dom, unsigned int flags) ...@@ -930,10 +930,10 @@ libxlDomainReboot(virDomainPtr dom, unsigned int flags)
} }
priv = vm->privateData; priv = vm->privateData;
if (libxl_domain_reboot(priv->ctx, dom->id) != 0) { if (libxl_domain_reboot(priv->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to reboot domain '%d' with libxenlight"), _("Failed to reboot domain '%d' with libxenlight"),
dom->id); vm->def->id);
goto cleanup; goto cleanup;
} }
ret = 0; ret = 0;
...@@ -974,7 +974,7 @@ libxlDomainDestroyFlags(virDomainPtr dom, ...@@ -974,7 +974,7 @@ libxlDomainDestroyFlags(virDomainPtr dom,
priv = vm->privateData; priv = vm->privateData;
if (libxl_domain_destroy(priv->ctx, vm->def->id, NULL) < 0) { if (libxl_domain_destroy(priv->ctx, vm->def->id, NULL) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to destroy domain '%d'"), dom->id); _("Failed to destroy domain '%d'"), vm->def->id);
goto cleanup; goto cleanup;
} }
...@@ -1105,10 +1105,10 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, ...@@ -1105,10 +1105,10 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
if (flags & VIR_DOMAIN_MEM_LIVE) { if (flags & VIR_DOMAIN_MEM_LIVE) {
priv = vm->privateData; priv = vm->privateData;
if (libxl_domain_setmaxmem(priv->ctx, dom->id, newmem) < 0) { if (libxl_domain_setmaxmem(priv->ctx, vm->def->id, newmem) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to set maximum memory for domain '%d'" _("Failed to set maximum memory for domain '%d'"
" with libxenlight"), dom->id); " with libxenlight"), vm->def->id);
goto endjob; goto endjob;
} }
} }
...@@ -1138,13 +1138,13 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, ...@@ -1138,13 +1138,13 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
priv = vm->privateData; priv = vm->privateData;
/* Unlock virDomainObj while ballooning memory */ /* Unlock virDomainObj while ballooning memory */
virObjectUnlock(vm); virObjectUnlock(vm);
res = libxl_set_memory_target(priv->ctx, dom->id, newmem, 0, res = libxl_set_memory_target(priv->ctx, vm->def->id, newmem, 0,
/* force */ 1); /* force */ 1);
virObjectLock(vm); virObjectLock(vm);
if (res < 0) { if (res < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to set memory for domain '%d'" _("Failed to set memory for domain '%d'"
" with libxenlight"), dom->id); " with libxenlight"), vm->def->id);
goto endjob; goto endjob;
} }
} }
...@@ -1202,9 +1202,10 @@ libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info) ...@@ -1202,9 +1202,10 @@ libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
info->memory = vm->def->mem.cur_balloon; info->memory = vm->def->mem.cur_balloon;
info->maxMem = vm->def->mem.max_balloon; info->maxMem = vm->def->mem.max_balloon;
} else { } else {
if (libxl_domain_info(priv->ctx, &d_info, dom->id) != 0) { if (libxl_domain_info(priv->ctx, &d_info, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("libxl_domain_info failed for domain '%d'"), dom->id); _("libxl_domain_info failed for domain '%d'"),
vm->def->id);
goto cleanup; goto cleanup;
} }
info->cpuTime = d_info.cpu_time; info->cpuTime = d_info.cpu_time;
...@@ -1483,11 +1484,11 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) ...@@ -1483,11 +1484,11 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
if (!(flags & VIR_DUMP_LIVE) && if (!(flags & VIR_DUMP_LIVE) &&
virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) { virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
if (libxl_domain_pause(priv->ctx, dom->id) != 0) { if (libxl_domain_pause(priv->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Before dumping core, failed to suspend domain '%d'" _("Before dumping core, failed to suspend domain '%d'"
" with libxenlight"), " with libxenlight"),
dom->id); vm->def->id);
goto endjob; goto endjob;
} }
virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_DUMP); virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_DUMP);
...@@ -1496,20 +1497,20 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) ...@@ -1496,20 +1497,20 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
/* Unlock virDomainObj while dumping core */ /* Unlock virDomainObj while dumping core */
virObjectUnlock(vm); virObjectUnlock(vm);
ret = libxl_domain_core_dump(priv->ctx, dom->id, to, NULL); ret = libxl_domain_core_dump(priv->ctx, vm->def->id, to, NULL);
virObjectLock(vm); virObjectLock(vm);
if (ret != 0) { if (ret != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to dump core of domain '%d' with libxenlight"), _("Failed to dump core of domain '%d' with libxenlight"),
dom->id); vm->def->id);
ret = -1; ret = -1;
goto unpause; goto unpause;
} }
if (flags & VIR_DUMP_CRASH) { if (flags & VIR_DUMP_CRASH) {
if (libxl_domain_destroy(priv->ctx, dom->id, NULL) < 0) { if (libxl_domain_destroy(priv->ctx, vm->def->id, NULL) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to destroy domain '%d'"), dom->id); _("Failed to destroy domain '%d'"), vm->def->id);
goto unpause; goto unpause;
} }
...@@ -1524,10 +1525,10 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) ...@@ -1524,10 +1525,10 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
unpause: unpause:
if (virDomainObjIsActive(vm) && paused) { if (virDomainObjIsActive(vm) && paused) {
if (libxl_domain_unpause(priv->ctx, dom->id) != 0) { if (libxl_domain_unpause(priv->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("After dumping core, failed to resume domain '%d' with" _("After dumping core, failed to resume domain '%d' with"
" libxenlight"), dom->id); " libxenlight"), vm->def->id);
} else { } else {
virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, virDomainObjSetState(vm, VIR_DOMAIN_RUNNING,
VIR_DOMAIN_RUNNING_UNPAUSED); VIR_DOMAIN_RUNNING_UNPAUSED);
...@@ -1786,19 +1787,19 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, ...@@ -1786,19 +1787,19 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
break; break;
case VIR_DOMAIN_VCPU_LIVE: case VIR_DOMAIN_VCPU_LIVE:
if (libxl_set_vcpuonline(priv->ctx, dom->id, &map) != 0) { if (libxl_set_vcpuonline(priv->ctx, vm->def->id, &map) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to set vcpus for domain '%d'" _("Failed to set vcpus for domain '%d'"
" with libxenlight"), dom->id); " with libxenlight"), vm->def->id);
goto endjob; goto endjob;
} }
break; break;
case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG: case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
if (libxl_set_vcpuonline(priv->ctx, dom->id, &map) != 0) { if (libxl_set_vcpuonline(priv->ctx, vm->def->id, &map) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to set vcpus for domain '%d'" _("Failed to set vcpus for domain '%d'"
" with libxenlight"), dom->id); " with libxenlight"), vm->def->id);
goto endjob; goto endjob;
} }
def->vcpus = nvcpus; def->vcpus = nvcpus;
...@@ -1934,7 +1935,7 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu, ...@@ -1934,7 +1935,7 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu,
libxlDomainObjPrivatePtr priv; libxlDomainObjPrivatePtr priv;
priv = vm->privateData; priv = vm->privateData;
if (libxl_set_vcpuaffinity(priv->ctx, dom->id, vcpu, &map) != 0) { if (libxl_set_vcpuaffinity(priv->ctx, vm->def->id, vcpu, &map) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to pin vcpu '%d' with libxenlight"), _("Failed to pin vcpu '%d' with libxenlight"),
vcpu); vcpu);
...@@ -2099,11 +2100,11 @@ libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo, ...@@ -2099,11 +2100,11 @@ libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo,
} }
priv = vm->privateData; priv = vm->privateData;
if ((vcpuinfo = libxl_list_vcpu(priv->ctx, dom->id, &maxcpu, if ((vcpuinfo = libxl_list_vcpu(priv->ctx, vm->def->id, &maxcpu,
&hostcpus)) == NULL) { &hostcpus)) == NULL) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to list vcpus for domain '%d' with libxenlight"), _("Failed to list vcpus for domain '%d' with libxenlight"),
dom->id); vm->def->id);
goto cleanup; goto cleanup;
} }
...@@ -3608,7 +3609,7 @@ libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams) ...@@ -3608,7 +3609,7 @@ libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams)
default: default:
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to get scheduler id for domain '%d'" _("Failed to get scheduler id for domain '%d'"
" with libxenlight"), dom->id); " with libxenlight"), vm->def->id);
goto cleanup; goto cleanup;
} }
...@@ -3659,10 +3660,10 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom, ...@@ -3659,10 +3660,10 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom,
goto cleanup; goto cleanup;
} }
if (libxl_domain_sched_params_get(priv->ctx, dom->id, &sc_info) != 0) { if (libxl_domain_sched_params_get(priv->ctx, vm->def->id, &sc_info) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to get scheduler parameters for domain '%d'" _("Failed to get scheduler parameters for domain '%d'"
" with libxenlight"), dom->id); " with libxenlight"), vm->def->id);
goto cleanup; goto cleanup;
} }
...@@ -3740,10 +3741,10 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom, ...@@ -3740,10 +3741,10 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom,
goto endjob; goto endjob;
} }
if (libxl_domain_sched_params_get(priv->ctx, dom->id, &sc_info) != 0) { if (libxl_domain_sched_params_get(priv->ctx, vm->def->id, &sc_info) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to get scheduler parameters for domain '%d'" _("Failed to get scheduler parameters for domain '%d'"
" with libxenlight"), dom->id); " with libxenlight"), vm->def->id);
goto endjob; goto endjob;
} }
...@@ -3756,10 +3757,10 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom, ...@@ -3756,10 +3757,10 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom,
sc_info.cap = params[i].value.ui; sc_info.cap = params[i].value.ui;
} }
if (libxl_domain_sched_params_set(priv->ctx, dom->id, &sc_info) != 0) { if (libxl_domain_sched_params_set(priv->ctx, vm->def->id, &sc_info) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to set scheduler parameters for domain '%d'" _("Failed to set scheduler parameters for domain '%d'"
" with libxenlight"), dom->id); " with libxenlight"), vm->def->id);
goto endjob; goto endjob;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册