--- src/qemu/qemu_domain.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index c98be208f1..526634d819 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -137,6 +137,14 @@ static virClassPtr qemuDomainSaveCookieClass; static void qemuDomainLogContextDispose(void *obj); static void qemuDomainSaveCookieDispose(void *obj); + +static int +qemuDomainPrepareStorageSourceBlockdev(virDomainDiskDefPtr disk, + virStorageSourcePtr src, + qemuDomainObjPrivatePtr priv, + virQEMUDriverConfigPtr cfg); + + static int qemuDomainOnceInit(void) { @@ -8638,6 +8646,10 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, if (qemuDomainPrepareDiskSourceData(disk, n, cfg, priv->qemuCaps) < 0) goto cleanup; + + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV) && + qemuDomainPrepareStorageSourceBlockdev(disk, n, priv, cfg) < 0) + goto cleanup; } ret = 0; @@ -13085,6 +13097,61 @@ qemuDomainPrepareDiskSourceLegacy(virDomainDiskDefPtr disk, } +static int +qemuDomainPrepareStorageSourceBlockdev(virDomainDiskDefPtr disk, + virStorageSourcePtr src, + qemuDomainObjPrivatePtr priv, + virQEMUDriverConfigPtr cfg) +{ + src->id = qemuDomainStorageIdNew(priv); + + if (virAsprintf(&src->nodestorage, "libvirt-%u-storage", src->id) < 0 || + virAsprintf(&src->nodeformat, "libvirt-%u-format", src->id) < 0) + return -1; + + if (qemuDomainValidateStorageSource(src, priv->qemuCaps) < 0) + return -1; + + if (qemuDomainPrepareDiskSourceData(disk, src, cfg, priv->qemuCaps) < 0) + return -1; + + if (qemuDomainSecretStorageSourcePrepare(priv, src, + src->nodestorage, + src->nodeformat) < 0) + return -1; + + if (qemuDomainPrepareStorageSourcePR(disk->src, priv, src->nodestorage) < 0) + return -1; + + if (qemuDomainPrepareStorageSourceTLS(disk->src, cfg, src->nodestorage, + priv->qemuCaps) < 0) + return -1; + + return 0; +} + + +static int +qemuDomainPrepareDiskSourceBlockdev(virDomainDiskDefPtr disk, + qemuDomainObjPrivatePtr priv, + virQEMUDriverConfigPtr cfg) +{ + qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); + virStorageSourcePtr n; + + if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON && + virAsprintf(&diskPriv->nodeCopyOnRead, "libvirt-CoR-%s", disk->dst) < 0) + return -1; + + for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) { + if (qemuDomainPrepareStorageSourceBlockdev(disk, n, priv, cfg) < 0) + return -1; + } + + return 0; +} + + int qemuDomainPrepareDiskSource(virDomainDiskDefPtr disk, qemuDomainObjPrivatePtr priv, @@ -13092,8 +13159,13 @@ qemuDomainPrepareDiskSource(virDomainDiskDefPtr disk, { qemuDomainPrepareDiskCachemode(disk); - if (qemuDomainPrepareDiskSourceLegacy(disk, priv, cfg) < 0) - return -1; + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { + if (qemuDomainPrepareDiskSourceBlockdev(disk, priv, cfg) < 0) + return -1; + } else { + if (qemuDomainPrepareDiskSourceLegacy(disk, priv, cfg) < 0) + return -1; + } return 0; } -- 2.16.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list