From 2027e184c50d1b84149e9583c6463305f37c27ee Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 2 Jun 2011 14:55:56 +0100 Subject: [PATCH] Fix regressions BlockStats/Info APIs in QEMU driver The change 18c2a592064d69499f70428e498f4a3cb5161cda caused some regressions in behaviour of virDomainBlockStats and virDomainBlockInfo in the QEMU driver. The virDomainBlockInfo API stopped working for inactive guests if querying a block device. The virDomainBlockStats API did not promptly report an error if the guest was not running in some cases. * src/qemu/qemu_driver.c: Fix inactive guest handling in BlockStats/Info APIs --- src/qemu/qemu_driver.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5632d62956..ec23bb346e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5531,6 +5531,12 @@ qemudDomainBlockStats (virDomainPtr dom, goto cleanup; } + if (!virDomainObjIsActive(vm)) { + qemuReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("domain is not running")); + goto cleanup; + } + for (i = 0 ; i < vm->def->ndisks ; i++) { if (STREQ(path, vm->def->disks[i]->dst)) { disk = vm->def->disks[i]; @@ -5994,7 +6000,8 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom, highest allocated extent from QEMU */ if (disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK && format != VIR_STORAGE_FILE_RAW && - S_ISBLK(sb.st_mode)) { + S_ISBLK(sb.st_mode) && + virDomainObjIsActive(vm)) { qemuDomainObjPrivatePtr priv = vm->privateData; if ((priv->jobActive == QEMU_JOB_MIGRATION_OUT) @@ -6017,19 +6024,16 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom, if (qemuDomainObjBeginJob(vm) < 0) goto cleanup; - if (!virDomainObjIsActive(vm)) { - qemuReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("domain is not running")); - goto endjob; + if (virDomainObjIsActive(vm)) { + qemuDomainObjEnterMonitor(vm); + ret = qemuMonitorGetBlockExtent(priv->mon, + disk->info.alias, + &info->allocation); + qemuDomainObjExitMonitor(vm); + } else { + ret = 0; } - qemuDomainObjEnterMonitor(vm); - ret = qemuMonitorGetBlockExtent(priv->mon, - disk->info.alias, - &info->allocation); - qemuDomainObjExitMonitor(vm); - -endjob: if (qemuDomainObjEndJob(vm) == 0) vm = NULL; } -- 2.47.2