
On Thu, Jul 11, 2019 at 17:54:18 +0200, Michal Privoznik wrote:
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_hotplug.c | 65 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 5 deletions(-)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 3c6c0da3a0..6dbff23aa0 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -605,6 +605,54 @@ qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, }
+static int +qemuDomainStorageSourcePrepareDisk(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDiskDefPtr disk, + bool teardown) +{ + int rc; + bool adjustMemlock = false; + bool reattach = false; + + if (!virDomainDefHasNVMeDisk(vm->def) && + !virStorageSourceChainHasNVMe(disk->src)) + return 0; + + if (teardown) { + adjustMemlock = true; + reattach = true; + goto rollback; + } + + /* Tentatively add disk to domain def so that memlock limit can be computed. */ + vm->def->disks[vm->def->ndisks++] = disk; + rc = qemuDomainAdjustMaxMemLock(vm); + vm->def->disks[--vm->def->ndisks] = NULL; + + if (rc < 0) + return -1; + + adjustMemlock = true;
What's the point of this ...
+ + if (qemuHostdevPrepareNVMeDevices(driver, vm->def->name, &disk, 1) < 0) + return -1;
... if this just exits the function?
+ + reattach = true; + + return 0; + + rollback: + if (reattach) + qemuHostdevReAttachNVMeDevices(driver, vm->def->name, &disk, 1); + + if (adjustMemlock) + qemuDomainAdjustMaxMemLock(vm); + + return 0; +} + + /** * qemuDomainAttachDiskGeneric: *
[...]
@@ -683,8 +734,10 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, ret = 0;
cleanup: - if (ret < 0) + if (ret < 0) { ignore_value(qemuDomainStorageSourceChainAccessRevoke(driver, vm, disk->src)); + qemuDomainStorageSourcePrepareDisk(driver, vm, disk, true); + } qemuDomainSecretDiskDestroy(disk); VIR_FREE(devstr); return ret; @@ -4267,6 +4320,8 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver, dev.data.disk = disk; ignore_value(qemuRemoveSharedDevice(driver, &dev, vm->def->name));
+ qemuDomainStorageSourcePrepareDisk(driver, vm, disk, true); +
I'd prefer if you could base this on top of the new disk source tracking for new blockjobs I've done for -blockdev support: git fetch https://github.com/pipo/libvirt.git job-tracking-send That code tentatively moves this out if the disk backend is still required while the frontend was unplugged.