On Thu, Jul 11, 2019 at 17:54:18 +0200, Michal Privoznik wrote:
Signed-off-by: Michal Privoznik <mprivozn(a)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.