]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: consolidate disk def allocation
authorEric Blake <eblake@redhat.com>
Wed, 21 May 2014 22:50:41 +0000 (16:50 -0600)
committerEric Blake <eblake@redhat.com>
Fri, 6 Jun 2014 15:56:27 +0000 (09:56 -0600)
A future patch wants to create disk definitions with non-zero
default contents; to avoid crashes, all callers that allocate
a disk definition should go through a common point.

I found allocation points by looking for any code that increments
ndisks, as well as any matches for ALLOC.*disk.  Most places that
modified ndisks were covered by the parse from XML to domain/device
definition by initial domain creation or device hotplug; I also
hand-checked all drivers that generate a device struct on the
fly during getXMLDesc.

* src/conf/domain_conf.h (virDomainDiskDefNew): New prototype.
* src/conf/domain_conf.c (virDomainDiskDefNew): New function.
(virDomainDiskDefParseXML): Use it.
* src/parallels/parallels_driver.c (parallelsAddHddInfo):
Likewise.
* src/qemu/qemu_command.c (qemuParseCommandLine): Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainGetXMLDesc): Likewise.
* src/vmx/vmx.c (virVMXParseDisk): Likewise.
* src/xenxs/xen_sxpr.c (xenParseSxprDisks, xenParseSxpr):
Likewise.
* src/xenxs/xen_xm.c (xenParseXM): Likewise.
* src/libvirt_private.syms (domain_conf.h): Export it.

Signed-off-by: Eric Blake <eblake@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/parallels/parallels_driver.c
src/qemu/qemu_command.c
src/vbox/vbox_tmpl.c
src/vmx/vmx.c
src/xenxs/xen_sxpr.c
src/xenxs/xen_xm.c

index ee59312faeac1c0541f4f6895ff14c7216839958..bb2bc8026cbcf7c254616c42d337823bd3c58695 100644 (file)
@@ -1181,6 +1181,16 @@ void virDomainLeaseDefFree(virDomainLeaseDefPtr def)
 }
 
 
+virDomainDiskDefPtr
+virDomainDiskDefNew(void)
+{
+    virDomainDiskDefPtr ret;
+
+    ignore_value(VIR_ALLOC(ret));
+    return ret;
+}
+
+
 void
 virDomainDiskDefFree(virDomainDiskDefPtr def)
 {
@@ -5232,7 +5242,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
     int expected_secret_usage = -1;
     int auth_secret_usage = -1;
 
-    if (VIR_ALLOC(def) < 0)
+    if (!(def = virDomainDiskDefNew()))
         return NULL;
 
     def->geometry.cylinders = 0;
index 2de807d24d662e5f0de6368bf4dcf08c46115e50..ffe35832298f78b88537321a368029337439141f 100644 (file)
@@ -2129,6 +2129,7 @@ void virDomainPanicDefFree(virDomainPanicDefPtr panic);
 void virDomainResourceDefFree(virDomainResourceDefPtr resource);
 void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def);
 void virDomainInputDefFree(virDomainInputDefPtr def);
+virDomainDiskDefPtr virDomainDiskDefNew(void);
 void virDomainDiskDefFree(virDomainDiskDefPtr def);
 void virDomainLeaseDefFree(virDomainLeaseDefPtr def);
 int virDomainDiskGetType(virDomainDiskDefPtr def);
index f3dc39bb7126aadfa3e8ca0746def4b4de16c25a..d1d6ff3f994981759c8d6ba9ce9358b875a0afd3 100644 (file)
@@ -207,6 +207,7 @@ virDomainDiskDefAssignAddress;
 virDomainDiskDefForeachPath;
 virDomainDiskDefFree;
 virDomainDiskDefGetSecurityLabelDef;
+virDomainDiskDefNew;
 virDomainDiskDeviceTypeToString;
 virDomainDiskDiscardTypeToString;
 virDomainDiskErrorPolicyTypeFromString;
index 87e540e2ed51b1313997562c7817d3f672466bde..153961b38990490b9c20478f166536eec725926c 100644 (file)
@@ -407,7 +407,7 @@ parallelsAddHddInfo(virDomainDefPtr def, const char *key, virJSONValuePtr value)
 {
     virDomainDiskDefPtr disk = NULL;
 
-    if (VIR_ALLOC(disk) < 0)
+    if (!(disk = virDomainDiskDefNew()))
         goto error;
 
     if (parallelsGetHddInfo(def, disk, key, value))
index e6acced20ee12c85cb4b587a3c160b3be231495a..841e59d69954f524a8d310c41bcdf48a4fb90c99 100644 (file)
@@ -10997,7 +10997,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
                    STRPREFIX(arg, "-fd") ||
                    STREQ(arg, "-cdrom")) {
             WANT_VALUE();
-            if (VIR_ALLOC(disk) < 0)
+            if (!(disk = virDomainDiskDefNew()))
                 goto error;
 
             if (STRPREFIX(val, "/dev/"))
@@ -11297,7 +11297,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
                     goto error;
                 }
             } else if (STRPREFIX(val, "disk:")) {
-                if (VIR_ALLOC(disk) < 0)
+                if (!(disk = virDomainDiskDefNew()))
                     goto error;
                 if (VIR_STRDUP(disk->src.path, val + strlen("disk:")) < 0)
                     goto error;
index e124e6905f67b110613d7043c1dac50e1ea888e6..6fef07486a00e8d038e9342874cbe797ded5451c 100644 (file)
@@ -2768,7 +2768,7 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) {
 
             if ((def->ndisks > 0) && (VIR_ALLOC_N(def->disks, def->ndisks) >= 0)) {
                 for (i = 0; i < def->ndisks; i++) {
-                    if (VIR_ALLOC(def->disks[i]) >= 0) {
+                    if ((def->disks[i] = virDomainDiskDefNew())) {
                         def->disks[i]->device = VIR_DOMAIN_DISK_DEVICE_DISK;
                         def->disks[i]->bus = VIR_DOMAIN_DISK_BUS_IDE;
                         virDomainDiskSetType(def->disks[i],
@@ -3247,7 +3247,7 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) {
 
                         def->ndisks++;
                         if (VIR_REALLOC_N(def->disks, def->ndisks) >= 0) {
-                            if (VIR_ALLOC(def->disks[def->ndisks - 1]) >= 0) {
+                            if ((def->disks[def->ndisks - 1] = virDomainDiskDefNew())) {
                                 def->disks[def->ndisks - 1]->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
                                 def->disks[def->ndisks - 1]->bus = VIR_DOMAIN_DISK_BUS_IDE;
                                 virDomainDiskSetType(def->disks[def->ndisks - 1],
@@ -3294,7 +3294,7 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) {
 
                             def->ndisks++;
                             if (VIR_REALLOC_N(def->disks, def->ndisks) >= 0) {
-                                if (VIR_ALLOC(def->disks[def->ndisks - 1]) >= 0) {
+                                if ((def->disks[def->ndisks - 1] = virDomainDiskDefNew())) {
                                     def->disks[def->ndisks - 1]->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
                                     def->disks[def->ndisks - 1]->bus = VIR_DOMAIN_DISK_BUS_FDC;
                                     virDomainDiskSetType(def->disks[def->ndisks - 1],
index 169440c79e415b769c4eb6d509aeac9f54922b3d..9b576f7e99facee81aa2c6380a99f6dec1b03307 100644 (file)
@@ -1998,7 +1998,7 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr con
         return -1;
     }
 
-    if (VIR_ALLOC(*def) < 0)
+    if (!(*def = virDomainDiskDefNew()))
         return -1;
 
     (*def)->device = device;
index 29316a4d6147a1b84d53b32aa39138c4cc770310..aacf74ce14d5509479ead0c5fb81a386436715ba 100644 (file)
@@ -370,7 +370,7 @@ xenParseSxprDisks(virDomainDefPtr def,
                 bootable = sexpr_node(node, "device/tap/bootable");
             }
 
-            if (VIR_ALLOC(disk) < 0)
+            if (!(disk = virDomainDiskDefNew()))
                 goto error;
 
             if (dst == NULL) {
@@ -1304,7 +1304,7 @@ xenParseSxpr(const struct sexpr *root,
         tmp = sexpr_node(root, "domain/image/hvm/cdrom");
         if ((tmp != NULL) && (tmp[0] != 0)) {
             virDomainDiskDefPtr disk;
-            if (VIR_ALLOC(disk) < 0)
+            if (!(disk = virDomainDiskDefNew()))
                 goto error;
             if (virDomainDiskSetSource(disk, tmp) < 0) {
                 virDomainDiskDefFree(disk);
@@ -1339,10 +1339,10 @@ xenParseSxpr(const struct sexpr *root,
             tmp = sexpr_fmt_node(root, "domain/image/hvm/%s", fds[i]);
             if ((tmp != NULL) && (tmp[0] != 0)) {
                 virDomainDiskDefPtr disk;
-                if (VIR_ALLOC(disk) < 0)
+                if (!(disk = virDomainDiskDefNew()))
                     goto error;
                 if (virDomainDiskSetSource(disk, tmp) < 0) {
-                    VIR_FREE(disk);
+                    virDomainDiskDefFree(disk);
                     goto error;
                 }
                 virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
index c0422cfc1fc4d2ba303a9e1db5212520f0b5db20..b2db97dbf1b72d306d9d0020362e9afff92b65ba 100644 (file)
@@ -486,7 +486,7 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
                 goto skipdisk;
             head = list->str;
 
-            if (VIR_ALLOC(disk) < 0)
+            if (!(disk = virDomainDiskDefNew()))
                 goto cleanup;
 
             /*
@@ -632,7 +632,7 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
         if (xenXMConfigGetString(conf, "cdrom", &str, NULL) < 0)
             goto cleanup;
         if (str) {
-            if (VIR_ALLOC(disk) < 0)
+            if (!(disk = virDomainDiskDefNew()))
                 goto cleanup;
 
             virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);