[libvirt] [PATCH 17/18] conf: use disk source accessors in xenxs/

Eric Blake eblake at redhat.com
Wed Mar 19 17:20:49 UTC 2014


Part of a series of cleanups to use new accessor methods.

* src/xenxs/xen_sxpr.c (xenParseSxprDisks, xenParseSxpr)
(xenFormatSxprDisk, xenFormatSxpr): Use accessors.
* src/xenxs/xen_xm.c (xenParseXM, xenFormatXMDisk, xenFormatXM):
Likewise.

Signed-off-by: Eric Blake <eblake at redhat.com>
---

This one is a bit trickier to review, in that it is replacing
in-place strndup over to calls to a function that mallocs
a copy of the input string.  While it compiles and passes
'make check', I don't actually have a xen setup to actually
prove that it works.

 src/xenxs/xen_sxpr.c | 111 ++++++++++++++++++++++++++------------------------
 src/xenxs/xen_xm.c   | 113 +++++++++++++++++++++++++++------------------------
 2 files changed, 118 insertions(+), 106 deletions(-)

diff --git a/src/xenxs/xen_sxpr.c b/src/xenxs/xen_sxpr.c
index 01d1ca1..e03e254 100644
--- a/src/xenxs/xen_sxpr.c
+++ b/src/xenxs/xen_sxpr.c
@@ -1,7 +1,7 @@
 /*
  * xen_sxpr.c: Xen SEXPR parsing functions
  *
- * Copyright (C) 2010-2013 Red Hat, Inc.
+ * Copyright (C) 2010-2014 Red Hat, Inc.
  * Copyright (C) 2011 Univention GmbH
  * Copyright (C) 2005 Anthony Liguori <aliguori at us.ibm.com>
  *
@@ -401,24 +401,23 @@ xenParseSxprDisks(virDomainDefPtr def,

                 if (sexpr_lookup(node, "device/tap2") &&
                     STRPREFIX(src, "tap:")) {
-                    if (VIR_STRDUP(disk->driverName, "tap2") < 0)
+                    if (virDomainDiskSetDriver(disk, "tap2") < 0)
                         goto error;
                 } else {
-                    if (VIR_ALLOC_N(disk->driverName, (offset-src)+1) < 0)
+                    char *tmp;
+                    if (VIR_STRNDUP(tmp, src, offset - src) < 0)
                         goto error;
-                    if (virStrncpy(disk->driverName, src, offset-src,
-                                   (offset-src)+1) == NULL) {
-                        virReportError(VIR_ERR_INTERNAL_ERROR,
-                                       _("Driver name %s too big for destination"),
-                                       src);
+                    if (virDomainDiskSetDriver(disk, tmp) < 0) {
+                        VIR_FREE(tmp);
                         goto error;
                     }
+                    VIR_FREE(tmp);
                 }

                 src = offset + 1;

-                if (STREQ(disk->driverName, "tap") ||
-                    STREQ(disk->driverName, "tap2")) {
+                if (STREQ(virDomainDiskGetDriver(disk), "tap") ||
+                    STREQ(virDomainDiskGetDriver(disk), "tap2")) {
                     char *driverType = NULL;

                     offset = strchr(src, ':');
@@ -431,12 +430,12 @@ xenParseSxprDisks(virDomainDefPtr def,
                     if (VIR_STRNDUP(driverType, src, offset - src) < 0)
                         goto error;
                     if (STREQ(driverType, "aio"))
-                        disk->format = VIR_STORAGE_FILE_RAW;
+                        virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_RAW);
                     else
-                        disk->format =
-                            virStorageFileFormatTypeFromString(driverType);
+                        virDomainDiskSetFormat(disk,
+                                               virStorageFileFormatTypeFromString(driverType));
                     VIR_FREE(driverType);
-                    if (disk->format <= 0) {
+                    if (virDomainDiskGetFormat(disk) <= 0) {
                         virReportError(VIR_ERR_INTERNAL_ERROR,
                                        _("Unknown driver type %s"), src);
                         goto error;
@@ -448,17 +447,17 @@ xenParseSxprDisks(virDomainDefPtr def,
                        so we assume common case here. If blktap becomes
                        omnipotent, we can revisit this, perhaps stat()'ing
                        the src file in question */
-                    disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
-                } else if (STREQ(disk->driverName, "phy")) {
-                    disk->type = VIR_DOMAIN_DISK_TYPE_BLOCK;
-                } else if (STREQ(disk->driverName, "file")) {
-                    disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
+                    virDomainDiskSetType(disk, VIR_DOMAIN_DISK_TYPE_FILE);
+                } else if (STREQ(virDomainDiskGetDriver(disk), "phy")) {
+                    virDomainDiskSetType(disk, VIR_DOMAIN_DISK_TYPE_BLOCK);
+                } else if (STREQ(virDomainDiskGetDriver(disk), "file")) {
+                    virDomainDiskSetType(disk, VIR_DOMAIN_DISK_TYPE_FILE);
                 }
             } else {
                 /* No CDROM media so can't really tell. We'll just
                    call if a FILE for now and update when media
                    is inserted later */
-                disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
+                virDomainDiskSetType(disk, VIR_DOMAIN_DISK_TYPE_FILE);
             }

             if (STREQLEN(dst, "ioemu:", 6))
@@ -482,7 +481,7 @@ xenParseSxprDisks(virDomainDefPtr def,

             if (VIR_STRDUP(disk->dst, dst) < 0)
                 goto error;
-            if (VIR_STRDUP(disk->src, src) < 0)
+            if (virDomainDiskSetSource(disk, src) < 0)
                 goto error;

             if (STRPREFIX(disk->dst, "xvd"))
@@ -1307,17 +1306,17 @@ xenParseSxpr(const struct sexpr *root,
             virDomainDiskDefPtr disk;
             if (VIR_ALLOC(disk) < 0)
                 goto error;
-            if (VIR_STRDUP(disk->src, tmp) < 0) {
+            if (virDomainDiskSetSource(disk, tmp) < 0) {
                 virDomainDiskDefFree(disk);
                 goto error;
             }
-            disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
+            virDomainDiskSetType(disk, VIR_DOMAIN_DISK_TYPE_FILE);
             disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
             if (VIR_STRDUP(disk->dst, "hdc") < 0) {
                 virDomainDiskDefFree(disk);
                 goto error;
             }
-            if (VIR_STRDUP(disk->driverName, "file") < 0) {
+            if (virDomainDiskSetDriver(disk, "file") < 0) {
                 virDomainDiskDefFree(disk);
                 goto error;
             }
@@ -1342,17 +1341,17 @@ xenParseSxpr(const struct sexpr *root,
                 virDomainDiskDefPtr disk;
                 if (VIR_ALLOC(disk) < 0)
                     goto error;
-                if (VIR_STRDUP(disk->src, tmp) < 0) {
+                if (virDomainDiskSetSource(disk, tmp) < 0) {
                     VIR_FREE(disk);
                     goto error;
                 }
-                disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
+                virDomainDiskSetType(disk, VIR_DOMAIN_DISK_TYPE_FILE);
                 disk->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
                 if (VIR_STRDUP(disk->dst, fds[i]) < 0) {
                     virDomainDiskDefFree(disk);
                     goto error;
                 }
-                if (VIR_STRDUP(disk->driverName, "file") < 0) {
+                if (virDomainDiskSetSource(disk, "file") < 0) {
                     virDomainDiskDefFree(disk);
                     goto error;
                 }
@@ -1722,6 +1721,9 @@ xenFormatSxprDisk(virDomainDiskDefPtr def,
                   int xendConfigVersion,
                   int isAttach)
 {
+    const char *src = virDomainDiskGetSource(def);
+    const char *driver = virDomainDiskGetDriver(def);
+
     /* Xend (all versions) put the floppy device config
      * under the hvm (image (os)) block
      */
@@ -1729,7 +1731,7 @@ xenFormatSxprDisk(virDomainDiskDefPtr def,
         def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
         if (isAttach) {
             virReportError(VIR_ERR_INVALID_ARG,
-                           _("Cannot directly attach floppy %s"), def->src);
+                           _("Cannot directly attach floppy %s"), src);
             return -1;
         }
         return 0;
@@ -1741,7 +1743,7 @@ xenFormatSxprDisk(virDomainDiskDefPtr def,
         xendConfigVersion == XEND_CONFIG_VERSION_3_0_2) {
         if (isAttach) {
             virReportError(VIR_ERR_INVALID_ARG,
-                           _("Cannot directly attach CDROM %s"), def->src);
+                           _("Cannot directly attach CDROM %s"), src);
             return -1;
         }
         return 0;
@@ -1753,9 +1755,9 @@ xenFormatSxprDisk(virDomainDiskDefPtr def,
     /* Normally disks are in a (device (vbd ...)) block
      * but blktap disks ended up in a differently named
      * (device (tap ....)) block.... */
-    if (def->driverName && STREQ(def->driverName, "tap")) {
+    if (STREQ_NULLABLE(driver, "tap")) {
         virBufferAddLit(buf, "(tap ");
-    } else if (def->driverName && STREQ(def->driverName, "tap2")) {
+    } else if (STREQ_NULLABLE(driver, "tap2")) {
         virBufferAddLit(buf, "(tap2 ");
     } else {
         virBufferAddLit(buf, "(vbd ");
@@ -1778,36 +1780,39 @@ xenFormatSxprDisk(virDomainDiskDefPtr def,
         virBufferEscapeSexpr(buf, "(dev '%s')", def->dst);
     }

-    if (def->src) {
-        if (def->driverName) {
-            if (STREQ(def->driverName, "tap") ||
-                STREQ(def->driverName, "tap2")) {
+    if (src) {
+        if (driver) {
+            if (STREQ(driver, "tap") ||
+                STREQ(driver, "tap2")) {
                 const char *type;
+                int format = virDomainDiskGetFormat(def);

-                if (!def->format || def->format == VIR_STORAGE_FILE_RAW)
+                if (!format || format == VIR_STORAGE_FILE_RAW)
                     type = "aio";
                 else
-                    type = virStorageFileFormatTypeToString(def->format);
-                virBufferEscapeSexpr(buf, "(uname '%s:", def->driverName);
+                    type = virStorageFileFormatTypeToString(format);
+                virBufferEscapeSexpr(buf, "(uname '%s:", driver);
                 virBufferEscapeSexpr(buf, "%s:", type);
-                virBufferEscapeSexpr(buf, "%s')", def->src);
+                virBufferEscapeSexpr(buf, "%s')", src);
             } else {
-                virBufferEscapeSexpr(buf, "(uname '%s:", def->driverName);
-                virBufferEscapeSexpr(buf, "%s')", def->src);
+                virBufferEscapeSexpr(buf, "(uname '%s:", driver);
+                virBufferEscapeSexpr(buf, "%s')", src);
             }
         } else {
-            if (def->type == VIR_DOMAIN_DISK_TYPE_FILE) {
-                virBufferEscapeSexpr(buf, "(uname 'file:%s')", def->src);
-            } else if (def->type == VIR_DOMAIN_DISK_TYPE_BLOCK) {
-                if (def->src[0] == '/')
-                    virBufferEscapeSexpr(buf, "(uname 'phy:%s')", def->src);
+            int type = virDomainDiskGetType(def);
+
+            if (type == VIR_DOMAIN_DISK_TYPE_FILE) {
+                virBufferEscapeSexpr(buf, "(uname 'file:%s')", src);
+            } else if (type == VIR_DOMAIN_DISK_TYPE_BLOCK) {
+                if (src[0] == '/')
+                    virBufferEscapeSexpr(buf, "(uname 'phy:%s')", src);
                 else
                     virBufferEscapeSexpr(buf, "(uname 'phy:/dev/%s')",
-                                         def->src);
+                                         src);
             } else {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                                _("unsupported disk type %s"),
-                               virDomainDiskTypeToString(def->type));
+                               virDomainDiskTypeToString(type));
                 return -1;
             }
         }
@@ -2313,23 +2318,23 @@ xenFormatSxpr(virConnectPtr conn,

             /* some disk devices are defined here */
             for (i = 0; i < def->ndisks; i++) {
+                const char *src = virDomainDiskGetSource(def->disks[i]);
+
                 switch (def->disks[i]->device) {
                 case VIR_DOMAIN_DISK_DEVICE_CDROM:
                     /* Only xend <= 3.0.2 wants cdrom config here */
                     if (xendConfigVersion != XEND_CONFIG_VERSION_3_0_2)
                         break;
-                    if (!STREQ(def->disks[i]->dst, "hdc") ||
-                        def->disks[i]->src == NULL)
+                    if (!STREQ(def->disks[i]->dst, "hdc") || !src)
                         break;

-                    virBufferEscapeSexpr(&buf, "(cdrom '%s')",
-                                         def->disks[i]->src);
+                    virBufferEscapeSexpr(&buf, "(cdrom '%s')", src);
                     break;

                 case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
                     /* all xend versions define floppies here */
                     virBufferEscapeSexpr(&buf, "(%s ", def->disks[i]->dst);
-                    virBufferEscapeSexpr(&buf, "'%s')", def->disks[i]->src);
+                    virBufferEscapeSexpr(&buf, "'%s')", src);
                     break;

                 default:
diff --git a/src/xenxs/xen_xm.c b/src/xenxs/xen_xm.c
index a70c5e3..d74e427 100644
--- a/src/xenxs/xen_xm.c
+++ b/src/xenxs/xen_xm.c
@@ -1,7 +1,7 @@
 /*
  * xen_xm.c: Xen XM parsing functions
  *
- * Copyright (C) 2006-2007, 2009-2010, 2012-2013 Red Hat, Inc.
+ * Copyright (C) 2006-2007, 2009-2014 Red Hat, Inc.
  * Copyright (C) 2011 Univention GmbH
  * Copyright (C) 2006 Daniel P. Berrange
  *
@@ -472,6 +472,7 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
             char *head;
             char *offset;
             char *tmp;
+            const char *src;

             if ((list->type != VIR_CONF_STRING) || (list->str == NULL))
                 goto skipdisk;
@@ -493,17 +494,16 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
                 goto skipdisk;

             if (offset == head) {
-                disk->src = NULL; /* No source file given, eg CDROM with no media */
+                /* No source file given, eg CDROM with no media */
+                ignore_value(virDomainDiskSetSource(disk, NULL));
             } else {
-                if (VIR_ALLOC_N(disk->src, (offset - head) + 1) < 0)
+                if (VIR_STRNDUP(tmp, head, offset - head) < 0)
                     goto cleanup;
-                if (virStrncpy(disk->src, head, offset - head,
-                               (offset - head) + 1) == NULL) {
-                    virReportError(VIR_ERR_INTERNAL_ERROR,
-                                   _("Source file %s too big for destination"),
-                                   head);
+                if (virDomainDiskSetSource(disk, tmp) < 0) {
+                    VIR_FREE(tmp);
                     goto cleanup;
                 }
+                VIR_FREE(tmp);
             }
             head = offset + 1;

@@ -524,65 +524,68 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
             }
             head = offset + 1;

-
             /* Extract source driver type */
-            if (disk->src) {
+            src = virDomainDiskGetSource(disk);
+            if (src) {
+                size_t len;
                 /* The main type  phy:, file:, tap: ... */
-                if ((tmp = strchr(disk->src, ':')) != NULL) {
-                    if (VIR_ALLOC_N(disk->driverName, (tmp - disk->src) + 1) < 0)
+                if ((tmp = strchr(src, ':')) != NULL) {
+                    len = tmp - src;
+                    if (VIR_STRNDUP(tmp, src, len) < 0)
                         goto cleanup;
-                    if (virStrncpy(disk->driverName, disk->src,
-                                   (tmp - disk->src),
-                                   (tmp - disk->src) + 1) == NULL) {
-                        virReportError(VIR_ERR_INTERNAL_ERROR,
-                                       _("Driver name %s too big for destination"),
-                                       disk->src);
+                    if (virDomainDiskSetDriver(disk, tmp) < 0) {
+                        VIR_FREE(tmp);
                         goto cleanup;
                     }
+                    VIR_FREE(tmp);

                     /* Strip the prefix we found off the source file name */
-                    memmove(disk->src, disk->src+(tmp-disk->src)+1,
-                            strlen(disk->src)-(tmp-disk->src));
+                    if (virDomainDiskSetSource(disk, src + len + 1) < 0)
+                        goto cleanup;
+                    src = virDomainDiskGetSource(disk);
                 }

                 /* And the sub-type for tap:XXX: type */
-                if (disk->driverName &&
-                    STREQ(disk->driverName, "tap")) {
+                if (STREQ_NULLABLE(virDomainDiskGetDriver(disk), "tap")) {
                     char *driverType;

-                    if (!(tmp = strchr(disk->src, ':')))
+                    if (!(tmp = strchr(src, ':')))
                         goto skipdisk;
+                    len = tmp - src;

-                    if (VIR_STRNDUP(driverType, disk->src, tmp - disk->src) < 0)
+                    if (VIR_STRNDUP(driverType, src, len) < 0)
                         goto cleanup;
                     if (STREQ(driverType, "aio"))
-                        disk->format = VIR_STORAGE_FILE_RAW;
+                        virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_RAW);
                     else
-                        disk->format =
-                            virStorageFileFormatTypeFromString(driverType);
+                        virDomainDiskSetFormat(disk,
+                                               virStorageFileFormatTypeFromString(driverType));
                     VIR_FREE(driverType);
-                    if (disk->format <= 0) {
+                    if (virDomainDiskGetFormat(disk) <= 0) {
                         virReportError(VIR_ERR_INTERNAL_ERROR,
                                        _("Unknown driver type %s"),
-                                       disk->src);
+                                       src);
                         goto cleanup;
                     }

                     /* Strip the prefix we found off the source file name */
-                    memmove(disk->src, disk->src+(tmp-disk->src)+1,
-                            strlen(disk->src)-(tmp-disk->src));
+                    if (virDomainDiskSetSource(disk, src + len + 1) < 0)
+                        goto cleanup;
+                    src = virDomainDiskGetSource(disk);
                 }
             }

             /* No source, or driver name, so fix to phy: */
-            if (!disk->driverName &&
-                VIR_STRDUP(disk->driverName, "phy") < 0)
+            if (!virDomainDiskGetDriver(disk) &&
+                virDomainDiskSetDriver(disk, "phy") < 0)
                 goto cleanup;


             /* phy: type indicates a block device */
-            disk->type = STREQ(disk->driverName, "phy") ?
-                VIR_DOMAIN_DISK_TYPE_BLOCK : VIR_DOMAIN_DISK_TYPE_FILE;
+            virDomainDiskSetType(disk,
+                                 STREQ(virDomainDiskGetDriver(disk), "phy") ?
+                                 VIR_DOMAIN_DISK_TYPE_BLOCK :
+                                 VIR_DOMAIN_DISK_TYPE_FILE);

             /* Check for a :cdrom/:disk postfix */
             disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
@@ -624,11 +627,11 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
             if (VIR_ALLOC(disk) < 0)
                 goto cleanup;

-            disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
+            virDomainDiskSetType(disk, VIR_DOMAIN_DISK_TYPE_FILE);
             disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
-            if (VIR_STRDUP(disk->driverName, "file") < 0)
+            if (virDomainDiskSetDriver(disk, "file") < 0)
                 goto cleanup;
-            if (VIR_STRDUP(disk->src, str) < 0)
+            if (virDomainDiskSetSource(disk, str) < 0)
                 goto cleanup;
             if (VIR_STRDUP(disk->dst, "hdc") < 0)
                 goto cleanup;
@@ -1176,27 +1179,31 @@ int xenXMConfigSetString(virConfPtr conf, const char *setting, const char *str)
 }


-static int xenFormatXMDisk(virConfValuePtr list,
-                                       virDomainDiskDefPtr disk,
-                                       int hvm,
-                                       int xendConfigVersion)
+static int
+xenFormatXMDisk(virConfValuePtr list,
+                virDomainDiskDefPtr disk,
+                int hvm,
+                int xendConfigVersion)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     virConfValuePtr val, tmp;
+    const char *src = virDomainDiskGetSource(disk);
+    int format = virDomainDiskGetFormat(disk);
+    const char *driver = virDomainDiskGetDriver(disk);

-    if (disk->src) {
-        if (disk->format) {
+    if (src) {
+        if (format) {
             const char *type;

-            if (disk->format == VIR_STORAGE_FILE_RAW)
+            if (format == VIR_STORAGE_FILE_RAW)
                 type = "aio";
             else
-                type = virStorageFileFormatTypeToString(disk->format);
-            virBufferAsprintf(&buf, "%s:", disk->driverName);
-            if (STREQ(disk->driverName, "tap"))
+                type = virStorageFileFormatTypeToString(format);
+            virBufferAsprintf(&buf, "%s:", driver);
+            if (STREQ(driver, "tap"))
                 virBufferAsprintf(&buf, "%s:", type);
         } else {
-            switch (disk->type) {
+            switch (virDomainDiskGetType(disk)) {
             case VIR_DOMAIN_DISK_TYPE_FILE:
                 virBufferAddLit(&buf, "file:");
                 break;
@@ -1206,11 +1213,11 @@ static int xenFormatXMDisk(virConfValuePtr list,
             default:
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("unsupported disk type %s"),
-                               virDomainDiskTypeToString(disk->type));
+                               virDomainDiskTypeToString(virDomainDiskGetType(disk)));
                 goto cleanup;
             }
         }
-        virBufferAdd(&buf, disk->src, -1);
+        virBufferAdd(&buf, src, -1);
     }
     virBufferAddLit(&buf, ",");
     if (hvm && xendConfigVersion == XEND_CONFIG_VERSION_3_0_2)
@@ -1602,9 +1609,9 @@ virConfPtr xenFormatXM(virConnectPtr conn,
                 if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
                     def->disks[i]->dst &&
                     STREQ(def->disks[i]->dst, "hdc") &&
-                    def->disks[i]->src) {
+                    virDomainDiskGetSource(def->disks[i])) {
                     if (xenXMConfigSetString(conf, "cdrom",
-                                             def->disks[i]->src) < 0)
+                                             virDomainDiskGetSource(def->disks[i])) < 0)
                         goto cleanup;
                     break;
                 }
-- 
1.8.5.3




More information about the libvir-list mailing list