return virDomainDiskRemove(def, i);
}
+/* Return true if VM has at least one disk involved in a current block
+ * copy job (that is, with a <mirror> element in the disk xml). */
+bool
+virDomainHasDiskMirror(virDomainObjPtr vm)
+{
+ int i;
+ for (i = 0; i < vm->def->ndisks; i++)
+ if (vm->def->disks[i]->mirror)
+ return true;
+ return false;
+}
+
int virDomainNetInsert(virDomainDefPtr def, virDomainNetDefPtr net)
{
if (VIR_REALLOC_N(def->nets, def->nnets + 1) < 0)
virDomainDiskRemove(virDomainDefPtr def, size_t i);
virDomainDiskDefPtr
virDomainDiskRemoveByName(virDomainDefPtr def, const char *name);
+bool virDomainHasDiskMirror(virDomainObjPtr vm);
int virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net);
virDomainNetDefPtr virDomainNetFind(virDomainDefPtr def, const char *device);
"%s", _("domain is marked for auto destroy"));
goto cleanup;
}
+ if (virDomainHasDiskMirror(vm)) {
+ virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s",
+ _("domain has active block copy job"));
+ goto cleanup;
+ }
memset(&header, 0, sizeof(header));
memcpy(header.magic, QEMUD_SAVE_PARTIAL, sizeof(header.magic));
}
}
def = NULL;
+ if (virDomainHasDiskMirror(vm)) {
+ virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s",
+ _("domain has active block copy job"));
+ virDomainObjAssignDef(vm, NULL, false);
+ goto cleanup;
+ }
vm->persistent = 1;
if (virDomainSaveConfig(driver->configDir,
"%s", _("domain is marked for auto destroy"));
goto cleanup;
}
+ if (virDomainHasDiskMirror(vm)) {
+ virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s",
+ _("domain has active block copy job"));
+ goto cleanup;
+ }
+
if (!vm->persistent && (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT)) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("cannot halt after transient domain snapshot"));
_("no domain with matching uuid '%s'"), uuidstr);
goto cleanup;
}
+ if (virDomainHasDiskMirror(vm)) {
+ virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s",
+ _("domain has active block copy job"));
+ goto cleanup;
+ }
snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
if (!snap) {
goto cleanup;
disk = vm->def->disks[idx];
+ if (mode == BLOCK_JOB_PULL && disk->mirror) {
+ virReportError(VIR_ERR_BLOCK_COPY_ACTIVE,
+ _("disk '%s' already in active block copy job"),
+ disk->dst);
+ goto cleanup;
+ }
+
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY) < 0)
goto cleanup;
detach = vm->def->disks[i];
+ if (detach->mirror) {
+ virReportError(VIR_ERR_BLOCK_COPY_ACTIVE,
+ _("disk '%s' is in an active block copy job"),
+ detach->dst);
+ goto cleanup;
+ }
+
if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_DEVICES)) {
if (virCgroupForDomain(driver->cgroup, vm->def->name, &cgroup, 0) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,