]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add support for setting disk drive serial numbers
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 14 Aug 2009 11:22:01 +0000 (12:22 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 3 Sep 2009 12:53:34 +0000 (13:53 +0100)
* docs/schemas/domain.rng: Add <serial> element to disks
* src/domain_conf.h, src/domain_conf.c: XML parsing and
  formatting for disk serial numbers
* src/qemu_conf.c: Set serial number when launching guests
* tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.args,
  tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml: Add
  serial number to XML test

docs/schemas/domain.rng
src/domain_conf.c
src/domain_conf.h
src/qemu_conf.c
src/qemu_conf.h
tests/qemuhelptest.c
tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.args
tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml
tests/qemuxml2argvtest.c

index e5780615a5c52f02d48eb9736a7550b7b8a0134c..70e98a708dab53a846e88675b97f8f26ecd68099 100644 (file)
         <empty/>
       </element>
     </optional>
+    <optional>
+      <element name="serial">
+        <ref name="diskSerial"/>
+      </element>
+    </optional>
     <optional>
       <ref name="encryption"/>
     </optional>
       <param name="pattern">[A-Za-z0-9_\.\+\-&amp;:/]+</param>
     </data>
   </define>
+  <define name="diskSerial">
+    <data type="string">
+      <param name="pattern">[A-Za-z0-9_\.\+\-]+</param>
+    </data>
+  </define>
   <define name="genericName">
     <data type="string">
       <param name="pattern">[a-zA-Z0-9_\+\-]+</param>
index e95fbe036407c9ac63b0bd1c61ab431b1609b372..7eb0714222c53dcbc8604d20450f445ed1d53614 100644 (file)
@@ -284,6 +284,7 @@ void virDomainDiskDefFree(virDomainDiskDefPtr def)
     if (!def)
         return;
 
+    VIR_FREE(def->serial);
     VIR_FREE(def->src);
     VIR_FREE(def->dst);
     VIR_FREE(def->driverName);
@@ -653,6 +654,7 @@ virDomainDiskDefParseXML(virConnectPtr conn,
     char *cachetag = NULL;
     char *devaddr = NULL;
     virStorageEncryptionPtr encryption = NULL;
+    char *serial = NULL;
 
     if (VIR_ALLOC(def) < 0) {
         virReportOOMError(conn);
@@ -716,6 +718,9 @@ virDomainDiskDefParseXML(virConnectPtr conn,
                                                            cur);
                 if (encryption == NULL)
                     goto error;
+            } else if ((serial == NULL) &&
+                       (xmlStrEqual(cur->name, BAD_CAST "serial"))) {
+                serial = (char *)xmlNodeGetContent(cur);
             }
         }
         cur = cur->next;
@@ -836,6 +841,8 @@ virDomainDiskDefParseXML(virConnectPtr conn,
     driverType = NULL;
     def->encryption = encryption;
     encryption = NULL;
+    def->serial = serial;
+    serial = NULL;
 
 cleanup:
     VIR_FREE(bus);
@@ -847,6 +854,7 @@ cleanup:
     VIR_FREE(driverName);
     VIR_FREE(cachetag);
     VIR_FREE(devaddr);
+    VIR_FREE(serial);
     virStorageEncryptionFree(encryption);
 
     return def;
@@ -3616,6 +3624,9 @@ virDomainDiskDefFormat(virConnectPtr conn,
         virBufferAddLit(buf, "      <readonly/>\n");
     if (def->shared)
         virBufferAddLit(buf, "      <shareable/>\n");
+    if (def->serial)
+        virBufferEscapeString(buf, "      <serial>%s</serial>\n",
+                              def->serial);
     if (def->encryption != NULL &&
         virStorageEncryptionFormat(conn, buf, def->encryption) < 0)
         return -1;
index 661773e427a5df06c32487f28a3064e301c2da3d..09368d9c4bc1cd74696cddc222ab14855383849c 100644 (file)
@@ -110,6 +110,7 @@ struct _virDomainDiskDef {
     char *dst;
     char *driverName;
     char *driverType;
+    char *serial;
     int cachemode;
     unsigned int readonly : 1;
     unsigned int shared : 1;
index 918ccf214301e06293edf6e531618e53875f7b7c..2c4a37d34f38d92a3d14043dc6b5c93410001b6b 100644 (file)
@@ -810,6 +810,8 @@ static unsigned int qemudComputeCmdFlags(const char *help,
         flags |= QEMUD_CMD_FLAG_VGA;
     if (strstr(help, "boot=on"))
         flags |= QEMUD_CMD_FLAG_DRIVE_BOOT;
+    if (strstr(help, "serial=s"))
+        flags |= QEMUD_CMD_FLAG_DRIVE_SERIAL;
     if (strstr(help, "-pcidevice"))
         flags |= QEMUD_CMD_FLAG_PCIDEVICE;
     if (strstr(help, "-mem-path"))
@@ -1405,6 +1407,23 @@ static int qemudBuildCommandLineChrDevStr(virDomainChrDefPtr dev,
     return 0;
 }
 
+#define QEMU_SERIAL_PARAM_ACCEPTED_CHARS \
+  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
+
+static int
+qemuSafeSerialParamValue(virConnectPtr conn,
+                         const char *value)
+{
+    if (strspn(value, QEMU_SERIAL_PARAM_ACCEPTED_CHARS) != strlen (value)) {
+        qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                         _("driver serial '%s' contains unsafe characters"),
+                         value);
+        return -1;
+    }
+
+    return 0;
+}
+
 /*
  * Constructs a argv suitable for launching qemu with config defined
  * for a given virtual machine.
@@ -1804,6 +1823,12 @@ int qemudBuildCommandLine(virConnectPtr conn,
             if (disk->driverType &&
                 qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE_FORMAT)
                 virBufferVSprintf(&opt, ",format=%s", disk->driverType);
+            if (disk->serial &&
+                (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE_SERIAL)) {
+                if (qemuSafeSerialParamValue(conn, disk->serial) < 0)
+                    goto error;
+                virBufferVSprintf(&opt, ",serial=%s", disk->serial);
+            }
 
             if (disk->cachemode) {
                 const char *mode =
index f12694092cd66f09f87f2d6ccca344627e9ddf6e..f41c2233be9a28744f1bbf84258e63ed62dbbabc 100644 (file)
@@ -68,6 +68,7 @@ enum qemud_cmd_flags {
 
     QEMUD_CMD_FLAG_PCIDEVICE     = (1 << 17), /* PCI device assignment only supported by qemu-kvm */
     QEMUD_CMD_FLAG_MEM_PATH      = (1 << 18), /* mmap'ped guest backing supported */
+    QEMUD_CMD_FLAG_DRIVE_SERIAL  = (1 << 19), /* -driver serial=  available */
 };
 
 /* Main driver state */
index a42a1ba09abb1aae8a1faec20b1c300148d30be6..15bdbc9bff99cdcd44a1a717164337ec9cae9239 100644 (file)
@@ -119,6 +119,7 @@ mymain(int argc, char **argv)
             QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC |
             QEMUD_CMD_FLAG_DRIVE_CACHE_V2 |
             QEMUD_CMD_FLAG_DRIVE_FORMAT |
+            QEMUD_CMD_FLAG_DRIVE_SERIAL |
             QEMUD_CMD_FLAG_VGA |
             QEMUD_CMD_FLAG_0_10,
             10005, 0,  0);
@@ -135,6 +136,7 @@ mymain(int argc, char **argv)
             QEMUD_CMD_FLAG_DRIVE_CACHE_V2 |
             QEMUD_CMD_FLAG_KVM |
             QEMUD_CMD_FLAG_DRIVE_FORMAT |
+            QEMUD_CMD_FLAG_DRIVE_SERIAL |
             QEMUD_CMD_FLAG_VGA |
             QEMUD_CMD_FLAG_0_10 |
             QEMUD_CMD_FLAG_PCIDEVICE |
@@ -153,6 +155,7 @@ mymain(int argc, char **argv)
             QEMUD_CMD_FLAG_DRIVE_CACHE_V2 |
             QEMUD_CMD_FLAG_KVM |
             QEMUD_CMD_FLAG_DRIVE_FORMAT |
+            QEMUD_CMD_FLAG_DRIVE_SERIAL |
             QEMUD_CMD_FLAG_VGA |
             QEMUD_CMD_FLAG_0_10 |
             QEMUD_CMD_FLAG_PCIDEVICE,
index 611cd3385cca3496e7177261a0e63ebc23fb33b4..07cbe0e5f900d01289b1484623884b70a38714ee 100644 (file)
@@ -1 +1 @@
-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -drive file=/dev/HostVG/QEMUGuest1,if=ide,index=0,format=qcow2,cache=off -drive file=/dev/HostVG/QEMUGuest2,if=ide,media=cdrom,index=2,format=raw -net none -serial none -parallel none -usb
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -drive file=/dev/HostVG/QEMUGuest1,if=ide,index=0,format=qcow2,serial=XYZXYZXYZYXXYZYZYXYZY,cache=off -drive file=/dev/HostVG/QEMUGuest2,if=ide,media=cdrom,index=2,format=raw -net none -serial none -parallel none -usb
index b38631515b8c4b1c0f81127c981bbef52dc98f9f..c4e47348eda5e7f24ba16d87100df9ee90f3fb93 100644 (file)
@@ -19,6 +19,7 @@
       <source dev='/dev/HostVG/QEMUGuest1'/>
       <target dev='hda' bus='ide'/>
       <shareable/>
+      <serial>XYZXYZXYZYXXYZYZYXYZY</serial>
     </disk>
     <disk type='block' device='cdrom'>
       <driver name='qemu' type='raw'/>
index ade57b16ecde8e367a36935cd9365edfd255d8c4..d1cef0ef1a4ccacbbc30d0262e7fc185554e3405 100644 (file)
@@ -209,7 +209,7 @@ mymain(int argc, char **argv)
     DO_TEST("disk-drive-fmt-qcow", QEMUD_CMD_FLAG_DRIVE |
             QEMUD_CMD_FLAG_DRIVE_BOOT | QEMUD_CMD_FLAG_DRIVE_FORMAT);
     DO_TEST("disk-drive-shared", QEMUD_CMD_FLAG_DRIVE |
-            QEMUD_CMD_FLAG_DRIVE_FORMAT);
+            QEMUD_CMD_FLAG_DRIVE_FORMAT | QEMUD_CMD_FLAG_DRIVE_SERIAL);
     DO_TEST("disk-drive-cache-v1-wt", QEMUD_CMD_FLAG_DRIVE |
             QEMUD_CMD_FLAG_DRIVE_FORMAT);
     DO_TEST("disk-drive-cache-v1-wb", QEMUD_CMD_FLAG_DRIVE |