[libvirt] [PATCH v4 03/15] qemu: Introduce qemuDomainStorageSourceCopy

John Ferlan jferlan at redhat.com
Tue Sep 26 19:38:49 UTC 2017


Create a qemu* specific StorageSourceCopy helper because we need
to be able to copy the PrivateData too if it exists without adding
any knowledge to the virStorageSourceCopy function.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/qemu/qemu_blockjob.c |  2 +-
 src/qemu/qemu_domain.c   | 63 +++++++++++++++++++++++++++++++++++++++++++++++-
 src/qemu/qemu_domain.h   |  4 +++
 src/qemu/qemu_driver.c   |  8 +++---
 4 files changed, 71 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index 415768ddc..c08d60a24 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -125,7 +125,7 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,
 
                 if ((persistDisk = virDomainDiskByName(vm->newDef,
                                                        disk->dst, false))) {
-                    copy = virStorageSourceCopy(disk->mirror, false);
+                    copy = qemuDomainStorageSourceCopy(disk->mirror, false);
                     if (!copy ||
                         virStorageSourceInitChainElement(copy,
                                                          persistDisk->src,
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 9945778d9..290f337d4 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -818,7 +818,6 @@ qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv)
  * @vm: Pointer to the domain object
  *
  * As long as the underlying qemu has the secret capability,
- * generate and store 'raw' in a file a random 32-byte key to
  * be used as a secret shared with qemu to share sensitive data.
  *
  * Returns: 0 on success, -1 w/ error message on failure
@@ -883,6 +882,39 @@ qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo)
 }
 
 
+static qemuDomainSecretInfoPtr
+qemuDomainSecretInfoCopy(qemuDomainSecretInfoPtr src)
+{
+    qemuDomainSecretInfoPtr dst = NULL;
+    if (VIR_ALLOC(dst) < 0)
+        return NULL;
+
+    dst->type = src->type;
+    if (src->type == VIR_DOMAIN_SECRET_INFO_TYPE_PLAIN) {
+        if (VIR_STRDUP(dst->s.plain.username, src->s.plain.username) < 0)
+            goto error;
+
+        if (VIR_ALLOC_N(dst->s.plain.secret, src->s.plain.secretlen) < 0)
+            goto error;
+
+        memcpy(dst->s.plain.secret, src->s.plain.secret, src->s.plain.secretlen);
+        dst->s.plain.secretlen = src->s.plain.secretlen;
+    } else {
+        if (VIR_STRDUP(dst->s.aes.username, src->s.aes.username) < 0 ||
+            VIR_STRDUP(dst->s.aes.alias, src->s.aes.alias) < 0 ||
+            VIR_STRDUP(dst->s.aes.iv, src->s.aes.alias) < 0 ||
+            VIR_STRDUP(dst->s.aes.ciphertext, src->s.aes.ciphertext) < 0)
+            goto error;
+    }
+
+    return dst;
+
+ error:
+    qemuDomainSecretInfoFree(&dst);
+    return NULL;
+}
+
+
 static virClassPtr qemuDomainDiskPrivateClass;
 static void qemuDomainDiskPrivateDispose(void *obj);
 
@@ -959,6 +991,35 @@ qemuDomainDiskSrcPrivateNew(void)
 }
 
 
+virStorageSourcePtr
+qemuDomainStorageSourceCopy(const virStorageSource *src,
+                            bool backingChain)
+{
+    qemuDomainDiskSrcPrivatePtr srcPriv = QEMU_DOMAIN_DISK_SRC_PRIVATE(src);
+    virStorageSourcePtr dst;
+    qemuDomainDiskSrcPrivatePtr dstPriv;
+
+    if (!(dst = virStorageSourceCopy(src, backingChain)))
+        return NULL;
+
+    if (!srcPriv->secinfo)
+        return dst;
+
+    if (!(dst->privateData = qemuDomainDiskSrcPrivateNew()))
+        goto error;
+
+    dstPriv = QEMU_DOMAIN_DISK_SRC_PRIVATE(dst);
+    if (!(dstPriv->secinfo = qemuDomainSecretInfoCopy(srcPriv->secinfo)))
+        goto error;
+
+    return dst;
+
+ error:
+    virStorageSourceFree(dst);
+    return NULL;
+}
+
+
 static void
 qemuDomainDiskSrcPrivateDispose(void *obj)
 {
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index f2c086d5d..c31994c18 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -814,6 +814,10 @@ void qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv);
 void qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo)
     ATTRIBUTE_NONNULL(1);
 
+virStorageSourcePtr
+qemuDomainStorageSourceCopy(const virStorageSource *src,
+                            bool backingChain);
+
 void qemuDomainSecretDiskDestroy(virDomainDiskDefPtr disk)
     ATTRIBUTE_NONNULL(1);
 
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 4855c9047..d7ea9a32f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -345,7 +345,7 @@ qemuSecurityChownCallback(const virStorageSource *src,
         if (chown(src->path, uid, gid) < 0)
             goto cleanup;
     } else {
-        if (!(cpy = virStorageSourceCopy(src, false)))
+        if (!(cpy = qemuDomainStorageSourceCopy(src, false)))
             goto cleanup;
 
         /* src file init reports errors, return -2 on failure */
@@ -14392,7 +14392,7 @@ qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
 
         dd->disk = vm->def->disks[i];
 
-        if (!(dd->src = virStorageSourceCopy(snap->def->disks[i].src, false)))
+        if (!(dd->src = qemuDomainStorageSourceCopy(snap->def->disks[i].src, false)))
             goto error;
 
         if (virStorageSourceInitChainElement(dd->src, dd->disk->src, false) < 0)
@@ -14421,7 +14421,7 @@ qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
             (dd->persistdisk = virDomainDiskByName(vm->newDef, dd->disk->dst,
                                                    false))) {
 
-            if (!(dd->persistsrc = virStorageSourceCopy(dd->src, false)))
+            if (!(dd->persistsrc = qemuDomainStorageSourceCopy(dd->src, false)))
                 goto error;
 
             if (virStorageSourceInitChainElement(dd->persistsrc,
@@ -17438,7 +17438,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
 
     /* For an active commit, clone enough of the base to act as the mirror */
     if (topSource == disk->src) {
-        if (!(mirror = virStorageSourceCopy(baseSource, false)))
+        if (!(mirror = qemuDomainStorageSourceCopy(baseSource, false)))
             goto endjob;
         if (virStorageSourceInitChainElement(mirror,
                                              disk->src,
-- 
2.13.5




More information about the libvir-list mailing list