adeaf8
From e534a73a71655d45a0b0af98b4b9b9176d701fb3 Mon Sep 17 00:00:00 2001
2daa92
From: Cole Robinson <crobinso@redhat.com>
Daniel P. Berrange 11755d
Date: Fri, 30 Aug 2013 12:41:34 -0400
adeaf8
Subject: [PATCH] domain_conf: Add disk bus=sd, wire it up for qemu
2daa92
2daa92
This corresponds to '-sd' and '-drive if=sd' on the qemu command line.
2daa92
Needed for many ARM boards which don't provide any other way to
2daa92
pass in storage.
2daa92
---
2daa92
 docs/formatdomain.html.in     |  3 ++-
2daa92
 docs/schemas/domaincommon.rng |  1 +
2daa92
 src/conf/domain_conf.c        |  4 +++-
2daa92
 src/conf/domain_conf.h        |  1 +
2daa92
 src/qemu/qemu_command.c       | 20 +++++++++++++++-----
2daa92
 5 files changed, 22 insertions(+), 7 deletions(-)
2daa92
2daa92
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
Daniel P. Berrange 11755d
index cce179d..af9b4ae 100644
2daa92
--- a/docs/formatdomain.html.in
2daa92
+++ b/docs/formatdomain.html.in
Daniel P. Berrange 11755d
@@ -1785,7 +1785,8 @@
2daa92
         as a device ordering hint.  The optional bus
2daa92
         attribute specifies the type of disk device to emulate;
2daa92
         possible values are driver specific, with typical values being
2daa92
-        "ide", "scsi", "virtio", "xen", "usb" or "sata". If omitted, the bus
2daa92
+        "ide", "scsi", "virtio", "xen", "usb", "sata", or
2daa92
+        "sd" "sd" since 1.1.2. If omitted, the bus
2daa92
         type is inferred from the style of the device name (e.g. a device named
2daa92
         'sda' will typically be exported using a SCSI bus). The optional
2daa92
         attribute tray indicates the tray status of the
2daa92
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
Daniel P. Berrange 11755d
index 68c3e4d..79ea746 100644
2daa92
--- a/docs/schemas/domaincommon.rng
2daa92
+++ b/docs/schemas/domaincommon.rng
Daniel P. Berrange 11755d
@@ -1295,6 +1295,7 @@
2daa92
             <value>usb</value>
2daa92
             <value>uml</value>
2daa92
             <value>sata</value>
2daa92
+            <value>sd</value>
2daa92
           </choice>
2daa92
         </attribute>
2daa92
       </optional>
2daa92
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
Daniel P. Berrange 11755d
index fafbb89..2c62a2d 100644
2daa92
--- a/src/conf/domain_conf.c
2daa92
+++ b/src/conf/domain_conf.c
2daa92
@@ -239,7 +239,8 @@ VIR_ENUM_IMPL(virDomainDiskBus, VIR_DOMAIN_DISK_BUS_LAST,
2daa92
               "xen",
2daa92
               "usb",
2daa92
               "uml",
2daa92
-              "sata")
2daa92
+              "sata",
2daa92
+              "sd")
2daa92
 
2daa92
 VIR_ENUM_IMPL(virDomainDiskCache, VIR_DOMAIN_DISK_CACHE_LAST,
2daa92
               "default",
Daniel P. Berrange 11755d
@@ -17308,6 +17309,7 @@ virDiskNameToBusDeviceIndex(const virDomainDiskDefPtr disk,
2daa92
         case VIR_DOMAIN_DISK_BUS_USB:
2daa92
         case VIR_DOMAIN_DISK_BUS_VIRTIO:
2daa92
         case VIR_DOMAIN_DISK_BUS_XEN:
2daa92
+        case VIR_DOMAIN_DISK_BUS_SD:
2daa92
         default:
2daa92
             *busIdx = 0;
2daa92
             *devIdx = idx;
2daa92
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
Daniel P. Berrange 11755d
index 56739b7..380e2bb 100644
2daa92
--- a/src/conf/domain_conf.h
2daa92
+++ b/src/conf/domain_conf.h
Daniel P. Berrange 11755d
@@ -509,6 +509,7 @@ enum virDomainDiskBus {
2daa92
     VIR_DOMAIN_DISK_BUS_USB,
2daa92
     VIR_DOMAIN_DISK_BUS_UML,
2daa92
     VIR_DOMAIN_DISK_BUS_SATA,
2daa92
+    VIR_DOMAIN_DISK_BUS_SD,
2daa92
 
2daa92
     VIR_DOMAIN_DISK_BUS_LAST
2daa92
 };
2daa92
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
Daniel P. Berrange 11755d
index 87345c7..6733709 100644
2daa92
--- a/src/qemu/qemu_command.c
2daa92
+++ b/src/qemu/qemu_command.c
2daa92
@@ -73,7 +73,8 @@ VIR_ENUM_IMPL(virDomainDiskQEMUBus, VIR_DOMAIN_DISK_BUS_LAST,
2daa92
               "xen",
2daa92
               "usb",
2daa92
               "uml",
2daa92
-              "sata")
2daa92
+              "sata",
2daa92
+              "sd")
2daa92
 
2daa92
 
2daa92
 VIR_ENUM_DECL(qemuDiskCacheV1)
2daa92
@@ -646,6 +647,9 @@ static int qemuAssignDeviceDiskAliasFixed(virDomainDiskDefPtr disk)
2daa92
     case VIR_DOMAIN_DISK_BUS_XEN:
2daa92
         ret = virAsprintf(&dev_name, "xenblk%d", devid);
2daa92
         break;
2daa92
+    case VIR_DOMAIN_DISK_BUS_SD:
2daa92
+        ret = virAsprintf(&dev_name, "sd%d", devid);
2daa92
+        break;
2daa92
     default:
2daa92
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2daa92
                        _("Unsupported disk name mapping for bus '%s'"),
Daniel P. Berrange 11755d
@@ -3786,7 +3790,9 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
2daa92
         break;
2daa92
 
2daa92
     case VIR_DOMAIN_DISK_BUS_XEN:
2daa92
-        /* Xen has no address type currently, so assign based on index */
2daa92
+    case VIR_DOMAIN_DISK_BUS_SD:
2daa92
+        /* Xen and SD have no address type currently, so assign
2daa92
+         * based on index */
2daa92
         break;
2daa92
     }
2daa92
 
Daniel P. Berrange 11755d
@@ -8190,12 +8196,13 @@ qemuBuildCommandLine(virConnectPtr conn,
2daa92
             virCommandAddArg(cmd, "-drive");
2daa92
 
2daa92
             /* Unfortunately it is not possible to use
2daa92
-               -device for floppies, or Xen paravirt
2daa92
+               -device for floppies, xen PV, or SD
2daa92
                devices. Fortunately, those don't need
2daa92
                static PCI addresses, so we don't really
2daa92
                care that we can't use -device */
2daa92
             if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
2daa92
-                if (disk->bus != VIR_DOMAIN_DISK_BUS_XEN) {
2daa92
+                if (disk->bus != VIR_DOMAIN_DISK_BUS_XEN &&
2daa92
+                    disk->bus != VIR_DOMAIN_DISK_BUS_SD) {
2daa92
                     withDeviceArg = true;
2daa92
                 } else {
2daa92
                     virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE);
Daniel P. Berrange 11755d
@@ -9892,6 +9899,8 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
2daa92
                 def->bus = VIR_DOMAIN_DISK_BUS_VIRTIO;
2daa92
             else if (STREQ(values[i], "xen"))
2daa92
                 def->bus = VIR_DOMAIN_DISK_BUS_XEN;
2daa92
+            else if (STREQ(values[i], "sd"))
2daa92
+                def->bus = VIR_DOMAIN_DISK_BUS_SD;
2daa92
         } else if (STREQ(keywords[i], "media")) {
2daa92
             if (STREQ(values[i], "cdrom")) {
2daa92
                 def->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
Daniel P. Berrange 11755d
@@ -10041,7 +10050,8 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
2daa92
 
2daa92
     if (def->bus == VIR_DOMAIN_DISK_BUS_IDE) {
2daa92
         ignore_value(VIR_STRDUP(def->dst, "hda"));
2daa92
-    } else if (def->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
2daa92
+    } else if (def->bus == VIR_DOMAIN_DISK_BUS_SCSI ||
2daa92
+               def->bus == VIR_DOMAIN_DISK_BUS_SD) {
2daa92
         ignore_value(VIR_STRDUP(def->dst, "sda"));
2daa92
     } else if (def->bus == VIR_DOMAIN_DISK_BUS_VIRTIO) {
2daa92
         ignore_value(VIR_STRDUP(def->dst, "vda"));